1. 오늘의 할 일
- Stack에서 발생한 오류 수정
- 개인 프로젝트 스켈레톤 코드 <중요하긴 하지만 강의를 들어야 할 수 있으므로 사실상 후순위
- 2D TopDown Shooting 강의
2. 작업 개시🛠️
1. Stack에서 발생한 오류
작업이라고는 했지만, 그보다 먼저 발생한 문제가 있다. 바로 이것.
영상과 이미지를 보면, 두 가지 문제가 있다.
1. 시작했을 때 분명 움직이는 블럭 위에 두 번째 블록이 놓여서 움직여야 하는데, 고정된 블록 아래에서 블록이 움직인다.
쌓으면 일단 쌓아지긴 하는데...
2. 그걸 Restart 버튼으로 누르면, 고정된 블록이 이젠 자리도 못 찾고 랜덤한 위치에 생성된다.
이상하다 코드 아마도 분명 거의 제대로 썼을텐데
최소한 계산식에서 틀린 건 없는데 어디가 문제지 <O>
계속 스크립트랑 눈싸움을 하다가, 튜터님의 방문을 두들겼다.
튜터님…
그렇게 튜터님과 함께 스크립트를 뜯어본 결과…
범인은 Restart () 에서 lastBlock = null; 이 들어가지 않은 게 문제였다.
좀 더 상세하게
: 게임에서 Start 버튼을 누르면, 처음에 블록 2개가 생성되었다가 파괴도고, Restart() 함수를 호출하여 기존의 값을 초기화 시킨다. 이때, 지금까지 쌓였던 층의 수도 줄이고, null에서 저장되었던 값들도 다시 null로 바꿔주어야한다. 하지만 여기서 null값이었던 것을 초기화 시켜주지 않으면 어떻게 될까.
문제가 되었던 lastBlock의 경우 바로 직전 블럭이 놓인 위치를 저장하는 곳인데, 그 '저장된 값'이 지워지지 않았다.
그러니까 처음에 만들어졌던 2층짜리 블록의 기록을 가지고, 고정된 블록이 생성된 것이다. (움직이는 블록 위에 새로운 블록이 생긴 이유)
그리고 그것을 Restart를 하면, 게임 오버 직전까지 쌓인 블록들 중 마지막 블록의 위치를 저장하여 다시 반환하게 되므로, 블록의 위치가 매번 제각각으로 보이게 된 것이다.
실질적으로는 lastBlock = null; 이라는 값 한 줄을 안 넣었을 뿐이지만, 그 결과로 게임 기능 자체가 무너져내리는 꼴을 보았다.
※코드 한 줄 한 줄이 게임의 기능을 먹통으로 만든다!
2. 2D TopDown Shooting
강의 중에 역탄젠트와 라디안을 본 나
:
다행인 거: 개념은 앎
안 다행인 거: 이해랑은 별개임
다행인 것: 내가 일일히 계산할 필요는 없음
Mathf. 짱...
문제의 역탄젠트가 무엇인가?
이번 강의에서 나온 건, Atan2라고 적혀있던 Mathf였다. 어제 Mathf를 적었다지만 이렇게 바로 톡 튀어나와 주실줄은 몰랐다.
이건 일종의 각도를 재는 역할...로 보인다.
그림을 그려야 이해가 쉬울 것 같지만, 그림을 그리지 않아도 쉽게 이해할 수 있는 좌표인 x와 y로 간단하게 정리해볼 것이다.
좌표 (x, y)가 있을 때, (0, 0)에서 (x, y)까지 이어지는 직선과 x축의 각도를 알아내기 위한 수식이다. 직각삼각형이라면 밑변과 빗변의 각도. 그것을 아래와 같이 표현한다.
Mathf.Atan2(y, x)
Q. 왜 (x, y) 좌표인데 (y, x)로 계산해요?
: 역탄젠트니까
하지만 이것만으로는 정확한 값을 내놓지는 못한다.
왜?
: 저건 라디안 값이라서.... -pi 부터 pi까지로 표시되지 우리가 알고 있는 '도'의 의 미가 아니다.
(음수면 시계방향, 양수면 반시계방향의 각도.)
따지고 보면 둘레 1pi 짜리 원에서 x, y 좌표가 있는 위치와 같은 각도로 부채꼴을 똑 떼어냈을 때의 호의 길이인 걸....
Q. 하지만 그러면 계산이 안되잖아?
: 하지만 유니티는 아주 친절하게도, Mathf.Rad2Deg만 곱하면 각도가 나오게 해주었단다.
Rad2Deg. (아무리봐도 Radian to Degree라는 뜻 같다)
이건 일종의 상수이다. 라디안 값을 각도로 변환해주는 고정상수. 1라디안이 180도인 걸 생각하면, 180/pi의 값이라고 보면 된다.
다른 조치를 취할 필요 없이, 라디안 값을 반환한 곳에 Mathf.Rad2Deg만 곱해주면 그 각도가 나온다.
반대로 각도를 라디안으로 변환할 필요가 있다면 Deg2Rad를 쓰면 된다고 한다. (Degree To Radian...맞잖냐)
이렇게 쓰고보니까...
오, 잠깐. 오히려 제법 할 만한데? 너무 쉽게 변환해준 거잖아? 싶어졌다.
어차피 Unity에서는 x, y값을 명확한 수로 잡지 않으며, 좀 더 정확하게는 계속 변화하는 '변수'로 사용한다.
그것을 일일히 계산하는 식을 꺼내는 것보다, 좌표 하나만으로 라디안 값을 구해서 각도를 만들어버리는 게 훨씬 편하다.
3. 내일 할 일
슬슬 본격적으로 작업 들어가야지?!
강의를 빠르게 처리하고, 작업에 관한 논의도 조금...필요할 것 같다.
'Unity_본캠프' 카테고리의 다른 글
[내일배움캠프 4주차] Unity 입문 총합 (0) | 2025.05.05 |
---|---|
[내일배움캠프 20일차] 이상하다 분명 입문이랬는데 (0) | 2025.05.02 |
[내일배움캠프 18일차] Mathf? 수학이요? (0) | 2025.04.30 |
[내일배움캠프 17일차] Unity! Trigger! (0) | 2025.04.29 |
[내일배움캠프 16일차] 오, 발표회. (1) | 2025.04.28 |