[내일배움캠프 18일차] Mathf? 수학이요?
1. 오늘의 할 일
일단 Stack을 한 번 빌딩하고, 그다음 개인프로젝트를 시도하는 게 내 일정이었다.
그런데, 강의도 다 들었고 개인 프로젝트를 들어가려는 나에게 떨어진 아주 큰...
거대한...문제.
(아직까지 수복 못했다.)
원래 UI를 넣기 위해 Canvas에 HomeUI/GameUI/ScoreUI를 만들었고, 옆에 BaseUI스크립트가 있어야 하는데..
BaseUI 스크립트>사라짐
그 이후에 만들어야 할 스크립트> 지금 Base가 날아갔는데 있을리가
Canvas 아래에 있는 것들>지금 Canvas에 수치 변경도 안됩니다...
나한테 왜 이래 진짜 나 아무것도 안했다고
그래서 튜터님께 갔습니다.
다행히! 깃허브를 쓰고 있어서 UI만들기 전까지는 있었습니다!
다행이죠. 튜터님 찾아가기 전까진 깃허브도 같이 죽었는데 튜터님께 찾아가니까 깃허브가 살아났어요.
그런데 그러고나니까 유니티가 입력도 불통 뭐가 되질 않아서..
....깔끔하게 오류를 발생시키고 있던 스크립트도 싹 지웠습니다. 다시 만들기로 했습니다. 내 1시간...
2. 그래서, 오늘 할 건?
대충 이런 게임이다.
어떤 게임이 떠올랐다면 그 게임 따라하기 맞다. (6 6 )
그 중에서 겪었던 몇 가지 문제와, 아마도 처음 본 듯한 Mathf의 기능도 살펴보려고 한다.
1. 어어어 이거 왜 올라가
해당 게임은 마우스 버튼 클릭 한 번당 블록 하나가 쌓아 올려지는 구조이다.
그리고 움직임을 부여하기 전에는, 그냥 동일한 칸에서 동일하게 쭉 쌓아올려지는 구조를 가졌었다.
그런데 내가 정상적으로 만들었다면 분명 '1개'의 블럭만 올라가야 할 화면에서, 아주 빠른 속도로 그라데이션이 그려지는 탑이 만들어진 적이 있었다.
분명 내가 빠르게 버튼을 눌러도 3개는 올라갔고, 꾹 누르면 아주 기하급수적으로 증가했다.
Q. 이유는?
: 누르고 있으면 계속 올라간다는 점에서 아마 예상할 수 있듯이. (Input.GetMouseButtonDown(0))으로 들어가야 할 내용이 Input.GetMouseButton(0)이 되어있었다.
즉, 버튼이 눌리면(Down) 작동하는게 아니라, 버튼을 누르고 있으면 그냥 계속 쌓이는 것이다.
참고로 지금 저런 형식으로 바꾸면 이렇게 된다.
버튼 관련 내용은 앞문장이 전부 동일한데 뒤에 무엇이 붙느냐에 따라 달라지므로,
설정할 때 자신이 어떤 방식의 작동을 할 것인지 잘 생각하고 정확한 코드를 작성하는 것이 중요하다.
2. Mathf
코드를 작성하다가 Mathf.PingPong과 Mathf.Abs를 사용했다.
PingPong은 해당 값을 왔다갔다한다고 하고, Abs는 절대값이라고 했다.
sin으로도 사용할 수 있다고 하니까, 대충 '아, 이거 수학 쓰는 거구나'라는 짐작은 했다.
그래서 적당히 찾아봤다.
찾아본 결과: 어지간한 수학적인 요소를 수행하는 코드가 맞다.
Q. 하지만 PingPong은 수학이랑은 별로 상관없는 내용 같은데.
: 하지만 그래프를 그린다고 생각한다면?
결국 Mathf의 기능은 그것이다. 우리가 Unity에서 수학적인 내용을 일일히 계산하긴 피곤하고, 무엇보다 귀찮다.
절대값만 하더라도 if문 등으로 이게 해당값이 음수라면 -1을 곱해서 양수로 돌려야 한다. 하지만 Abs를 사용하면 무슨 수를 넣어도 앞에 있는 -는 그냥 제거해준다. Mathf.Abs(x) 한 방이면 끝나는 것이다.
가령 PingPong은 기준점(0으로 지정된 값. Pingpong(A, B)가 있다면 A가 0에 해당하는 기준점이다.) 부터 목표지점까지 일정하게 왔다갔다 한다. 만약 반 정도 되는 폭으로 A보다 더 작은 값까지 왔다갔다 하게 만들고 싶다면, -B/2를 괄호 뒤에 붙여주면 된다.
그럼 -B/2부터 B/2까지 중심에서 왔다갔다 하는 핑퐁이 된다.
그럼 이걸 다른 코드로 쓰면 어떻게 될까...
for문 등으로 해도 1씩 올라가니 뚝뚝 끊기게 된다. 단위를 줄여 조금씩 올린다고 해도, 그 한 번의 계산에 몇 번의 카운트가 필요한지 알 수 없다. 음, 잠시 생각해보니까 정말 쓰고 싶지 않아졌다.
그럼 지금 알고 있는게 Abs와 PingPong이다. 다른 Mathf 함수는 뭐가 있을까.
그 중 현 시점에서 유용하게 쓸 수 있을 법한 걸 두 개 챙겨와서 정리한다.
1. 최댓값, 최솟값
Mathf.Clamp(float num, float min, float max)
num이라는 값이 min보다 작으면 최솟값, max보다 크면 최댓값으로 반환한다. 넘이 두 개의 중간 값이라면, num을 그대로 반환한다.
그러니까, min< num < max 로 지정되어야 할 때, num<min 이라면 min을, max<num이면 max를 반환하는 것이다.
Clamp가 무엇을 뜻하는지 생각하면, 이해가 좀 더 쉬울 것이다.
아래의 사진이 Clamp다.
저기 검은색 큰 바 두개가 min과 max, 중간에 있는 빨간 마커(보통 물건의 길이를 재기 위해 조이는 용도)가 num이라고 생각하면 된다.
클램프 안에 들어가는 건 반드시 저 검은색 막대의 범위 사이에 있는 것이어야 하므로, min과 max를 넘어가는 수는 지정된 최댓값과 최솟값으로 정해지는 것이다.
2. 올림 / 버림 / 반올림
있었으면 했는데 기능이 여기 있었다.
올림은 Cell, 버림은 Floor, 반올림은 Round를 사용하며, 그 안에 들어가는 수는 당연하지만 float 값과 같은 소수값이다.
왜 정수가 아니냐면, 정수라면 애초에 올림과 버림과 반올림이 필요가 없으니까….
이걸 사용하면, 반드시 해당 수는 int(정수)값이 된다.
이건 구태여 이 이상 설명할 필요는 없을 것 같다. 올림과 버림 반올림이 무엇인지는 알고 있으니까...
그런데 버림이 Floor인 건 알겠고, 반올림도 Round인게 대충 이해는 되는데, 올림은 왜 Cell인 걸까….
3. 내일 할 일
내일은 본격적으로 개인 프로젝트 작업에 들어갈 생각이다.
다만, 강의와도 병행할 것이다.
다음 강의는 아마 슈팅게임류인 것 같은데, 강의양이 너무 많아서 이해하고 바로 적용해볼 겸해서 번갈아 작업해볼 예정이다.