2025. 9. 26. 21:37ㆍ개발










카드배열 카드 배치 카드배열 카드배치
카 드배열 카 드배치 카 드배열 카 드배치
카드배 열 카드배 치 카드배 열 카드배 치
도대체 배열 배치 이거 뭔데
무ㅏㄴ데 내 머릿속을 이렇게 헷갈리게 하는데 니가뭔데!

- 배열(Array) = 카드 뭉치 주머니
👉 “어떤 카드들이 들어있는지” 순서대로 저장하는 것
예) 주머니 안에 [하트A, 다이아5, 스페이드K] - 배치(Placement) = 카드를 테이블에 펼치는 방법
👉 “저장한 카드를 어떻게 보여줄지”
예)- 일렬로 쫙 펴기
- 원 모양으로 돌려 놓기
- 겹쳐서 덱처럼 쌓기

=>긍까 쉽게 말하자면 배열은 카드 깔기 전에 준비단계
배치는 까는 것임.

배치(까는것)를 보겠다.
기본적으로 배열은 array함수를 쓴다고 하던데,,
배치는 어떻게 코드 작성해야되나..
더 쉽고 간편하게 작업할 수 있는 법 없나..
고민하다가
더 간단하고 쉬웠던 팀원의 코드 예이다.
스타트에서 lev변수를 통해 레벨객체 (instance==객체) 를 가져와주고
조건문을 통해 코드를 작성하셨다.
1~3 레벨을 설정하기 위해
lev<0
lev>4
라고 쓰신 듯 한데...
그럼 여기서 레벨은 0보다 작고 4보다 커야한다는 뜻이고
뒤에 return;을 붙여주셨으니
여기에 안맞으면
돌아가! 를 해주셨다.
그러니 레벨 범위에 안맞으면 돌아가! 라는 뜻이다
switch문은 조건문과 비슷하지만!서도 다르다.
이 조건에 맞는 코드만! 실행해!!!
라는 뜻이다.
그래서 case를 1부터 3까지 나눠서 레벨 별로 카드가 어떻게 배열되었으면 좋겠는지
고민하셨다.
arr = arr.OrderBy(x => Random.Range(0, arr.Length)).ToArray(); Invoke($"CardSetting{lev}", 0f);}
그 밑에 이 줄을 보면 random.range를 쓰셔서 카드를 랜덤하게 배열하는 코드를 작성했다.
arr =>배열은
arr.OrderBy => 랜덤한 숫자를 기준으로 배열 정렬해.
근데 이 랜덤한 숫자의 기준이 뭐냐면
(0, arr.Length)야
왜 length <문자열 을 사용했냐고?
이 문맥에서 보자면
랜덤한 카드의 배열 값을 알아야함.
그래야 어느 값에서 어느 값까지 카드들을 랜덤하게 섞을 수 있는지
컴퓨터에서 인식하고 생성이 되는데
그게 인식이 안되면
배열 범위를 모르기 때문에 숫자 생성이 될 수가 없지...
그렇다면 당연히 카드들이 랜덤으로 안섞이거나 하는 버그가 일어날거고..
length문자열을 사용해준 이유는 그거야.
어느 범위까지 랜덤하게 섞는지 컴퓨터가 알아야 하기 때문에
몇 장의 카드인지 컴퓨터한테 인식시켜주려고!
그럼 여기서 $도 복습해보자
$는 문자열 안에 변수나 표현식 등등
결과값이 나오는 것은 무엇이든 들어갈 수 있다!
그래서 위 식에서 볼 수 있는건
"CardSetting"-문자열
{lev}-레벨 변수
0f는 그냥 0f
그래서 레벨변수에 2를 넣어준다면
CardSetting 2라는 문자열이 되는거고
레벨변수에 3을 넣어준다면
CardSetting 3이라는 문자열이 되는거겠지.
그래서 invoke함수를 통해 CardSetting 2나
CardSetting 3의 함수를 호출해주는 것!!

카드를 뒤집는 기능:
카드 클릭해서 오픈함.
이거 누구 카드임?
가영카드?
아 ㅇㅋ.
그럼 이건 누구 카드임?
의환카드네
아 두개 틀리다...
를 ~~ 코드로 쓴거야
그럼 이제 이 기능을 백그라운드에서 어떻게 돌아가는지 원리부터 설명할게요.
피피티 설명 그대로에요.
1.
public void OpenCard(){
if (GameManagerB.instance.secondCard != null)return;
if (!GameManagerB.instance.GetIsRunning())return;
카드 뒷면 (BACK)에다가 버튼 달아놓고
이걸 클릭하면 카드를 오픈하는거죠.
그럼 게임매니저에서 두 카드에 대한 정보를 갖고 있는거에요.
관리를 해야하니까.
그럼 유저가 카드 뒤집을때마다
백에서는 이 정보를 관리하는거에요.
또 다른 카드 뒤집을 때도 정보를 확인해주어서
이게 맞는지 아닌지 비교해주는겁니다.
참 바쁘겠죠..
이거말고도 할게 어마무시한 게임매니저..
그러니 게임매니저한테 몰아주지 말고
기능별로 다른 일꾼들도 만들어줘서
우리 매니저 일 좀 덜어드립시다..
혼자만 너무 바쁘면 슬프자나...
2.
audioSource.Play();
anim.SetBool("isOpen", true);
front.SetActive(true);
back.SetActive(false);
어쨌든 팀원분이 작성하신 코드에는
카드 뒤집을 때 효과음도 넣어주시고
애니메이션에 달아둔 SetBool에 isOpen이
true인지 false인지도 비교를 해주시네요.
3.
if (GameManagerB.instance.firstCard == null){
GameManagerB.instance.firstCard = this;}
그리고
"만약 첫 번째 카드가 아직 정해지지 않았다면, 지금 이 객체를 첫 번째 카드로 지정해라."
라고 첫번째 카드의 정보를 저장해줍니다.
else{
GameManagerB.instance.secondCard = this;
GameManagerB.instance.Matched();}}
두번째 카드 역시 두번째 카드의 정보를 확인한 뒤
맞다면 맞다고 하는 겁니다!!!
여기서 기본개념 더 알아가기(void랑 class는 무엇이 다를까?)
좋아요, 여기서 중요한 건 void Start()와 class Start가 전혀 다른 개념이라는 거예요. 하나씩 비교해볼게요.
1️⃣ void Start()
- **메서드(method)**예요.
- 반환값이 없고(void), 특정 동작을 수행하는 코드 블록이에요.
- 예를 들어 Unity에서는 씬이 시작될 때 자동으로 호출되는 메서드로 많이 쓰여요.
✅ 특징:
- 클래스 안에 있어야 해요.
- Start()는 Unity에서 약속된 메서드 이름(특정 이벤트와 연결됨).
- void는 반환값 없음을 의미.
2️⃣ class Start
- **클래스(class)**예요.
- 객체를 만들기 위한 설계도일 뿐, 실제 동작을 바로 하는 게 아님.
- 예시:
✅ 특징:
- 속성과 메서드를 가질 수 있음.
- Start라는 이름은 그냥 클래스 이름일 뿐, Unity 이벤트랑 자동으로 연결되지 않음.
- new Start()로 객체를 만들어야 사용 가능.
정리
| 타입 | 메서드 | 클래스 |
| 반환값 | 없음 (void) | 해당 없음 (클래스는 데이터+기능 설계도) |
| 사용 | Unity에서 씬 시작 시 자동 실행 가능 | 객체 생성 후 메서드 호출해야 동작 |
| 선언 위치 | 클래스 안 | 클래스 단독 선언 가능 |

대망의 우리 의환님 볼륨세팅...
이해하기 정말 어려워서
발표 직전까지 붙잡고 물어보았다..
친절히 답변해주신 의환님 감사합니다.

자 여기서 초록색 박스 - Slider 와
Audio Mixer 의
최소값 최대값이 다르다는 걸 확인할 수 있어요
유저의 화면에 보이는 것 - slider인데
백그라운드에 있는 AudioMixer의 값이 다르죠!!
그래서 유저가 아무리 잡아당겨도
소리가 아주아주 티도 안날 정도로 미세하게만 차이가 나는거에요
왜냐하면 유저에겐 끝에서 끝까지 왔다갔다 잡아당겼을지라도
백그라운드에선 미미한 값으로 인식되기 때문이에요
slider는 0~1이고
Audio Mixer는 -80~20이기 때문이죠!!!
이 부분이 한 번에 이해가 어려웠는데
요런 이미지를 보니까 이해가 확 갔음
내가 아무리 46에서 100까지 풀로 잡아당겨도
백그라운드에서 AudioMixer 값이 막
최대가 100000000000이러면 어쩔겅미??
당연히 차이 안느껴지겠지... 흠흠
머 그런 원리랍니다

아무튼간에 이걸 log 함수를 통해서 해결하셨다는데
내가 지금 log함수까지 머리에 때려박으면 안될 것 같으므로 다음ㄱㄱ

게임을 다 깨고 나면
이런 클리어창이 나와요!
그래서 특정 팀원을 클릭했을 때
빙글빙글 돌아가며
팀원카드를 보여줍니다.

여기서 팀원분의 고민은..
회전값 z의 각도를 갖고 오고 싶으셨는데
Quaternian을 쓰면
각도가 아니라 값이 가져와지는거에요.
팀원분이 원하신 건 z값의 각도여서
Quaternian을 쓰면
eulerAngles(율러앵글즈)를 통해
값을 다시 각도로 변환한거죠.
정리
원하는 것 => 각도
1. 근데 값이 가져와짐
2. 각도로 바꿔오심

분명 하는 과정에선 너무 험난했던
몰래 울기도 찔찔 많이 울었던 프로젝트였는데
(갠적인 일들이랑 겹침+전공자 파티라 뒤쳐짐)
끝나니까 너무 너무 뿌듯하고
스스로가 자랑스럽고
나 많이 성장한 것 같고..
괜히 그래..
갈 길이 천리지만 그런거 지금은 일단 알 바 없어..
왜냐면 나 지금 뷰리풀한 상태거든.
내 기분 아주 좋거든.
무엇보다 아주 재밌슴..
진짜 고통스럽고 울고 싶었는데두
팀프로젝트 끝난 날 또 하고 싶다는 생각이 드는 여자?
이 여자 어쩌면..
마조히스트일지도?
'개발' 카테고리의 다른 글
| C#문법 종합 개인과제 [도전! 던전 탈출] (1) | 2025.09.29 |
|---|---|
| C#기초 공부 / void랑 class 차이점 (0) | 2025.09.28 |
| 첫 팀프로젝트 [카드 뒤집기 게임 _ 2] (0) | 2025.09.24 |
| 첫 팀프로젝트 [카드 뒤집기 게임] (1) | 2025.09.23 |
| 0922 (1) | 2025.09.22 |