-
3인칭 캐릭터 만들어보기 #1 키보드 입력으로 이동과 회전Unity유니티/캐릭터 2022. 6. 15. 16:13
요즘엔 게임을 많이 안해서 사실 잘 모르겠지만
어릴적에 했던 3인칭 게임중에키보드의 W S로 이동(앞, 뒤로 움직임)
AD로 회전을 하는 게임이 많이 있었던것으로 기억한다
사실 3인칭 조작도 종류가 엄청 다양하겠지만
모든걸 만들기엔 힘들거같으니..이동은 WS키로, 회전을 AD로 하는걸 만들어보고싶어졌다
먼저 이동속도와 회전속도 변수가 필요할것이다
그후 키보드의 입력을 받는 input변수와
키로 입력받는 벡터를 정규화까지해주면 방향벡터 dir까지 나오게된다
이동은 현재 월드공간에 어떤 좌표에 위치한 내 캐릭터에 방향벡터배만큼 스칼라값을 곱해준단 개념이기도하니
transform.TransformDirection(벡터) 함수를 이용해 나아가도록 했다 인자는 방향벡터를 받는다
회전은 인스펙터창에 있는 입력값(벡터형태)으로 하는게 직관적일거같아
transform.eulerAngles 으로 트랜스폼의 로테이션 transform.rotation은 쿼터니언타입인데
이걸 벡터타입으로 넣게 해준다
먼저 난 캐릭터의 y축회전을 하면 되는것이다보니
transform.eulerAngles += Vector3.up * Mathf.Atan2(dir.x, dir.y) * Mathf.Rad2Deg * Time.deltaTime;
을 작성하면 회전이 깔끔하게 완성이 된다!
Vector3.up은 업벡터 즉 월드상의 y축으로 회전을 한단것이고
Mathf.Atan2(dir.x, dir.y) * Mathf.Rad2Deg 는 전에 회전시간에 만들었던것을 응용한것인데
dir.x는 수평 dir.y는 수직축이기에, 회전을 만들기 적합하다
그래서 당장 플레이를 해보면
예상해주었던 대로 회전을 하는거같긴하다 그러나 문제가 다른건 다 정상인데
뒤로갈때 문제가 2가지 있었다
1. 뒤로가면서 회전을 하면 , 회전량이 다르다 (뒤로가면서 회전을 할시 더 크게 회전을 해버린다)
2. 회전없이 뒤로만 가길 원하는데도 회전이 된다 (Input.GetAxis("Vertical") 만 입력하는데 회전이 먹는!)
뒤로가면서 해보는 회전, 회전량이 더 큼 멤버변수들 그러나 회전속도는 또 변수를 만들었다 왜냐면 멤버변수를 그대로 사용시 나누는 부분에서 결국 _rotSpeed가 0이 되버리는 불상사가 일어날수 있었기 떄문이다 아까 회전값의 멤버변수 두개가 있었다 이동 회전, _moveSpeed와 _rotSpeed
그런데 회전속도의 경우, 아까 뒤로 회전을 할떄 회전량이 더 큰게 문제였기에
_rotSpeed를 뒤로가며 회전할떄 조절하면 되지 않을까 싶었는데!
_rotSpeed의 값을 나눌시, 뒤로 회전할떄마다 계속 줄어들어 언젠간 0이 나올것이었다
그래서 _rotSpeed의 값은 유지하며 회전량을 변화시키려 함수시작시에
rotSpeed라는 변수를 만들고, _rotSpeed값을 그냥 넣었따
그리고 당연히 회전을 rotSpeed으로 사용하였다(_rotSpeed의 값을 그대로 사용하니까 문제없다)
이제 나머지를 작성해보자
y입력값이 0보다 작다면, 즉 내 캐릭터가 뒤로 이동하고있다면 (Input.GetAxis("Vertical")가 음수상태)
회전 속도를 1/4로 줄였다
또 이동은 별 문제가 없어서 원래 구상했던대로 방향벡터쪽으로 속도만큼 이동하게 만들었다
끝으로 뒤로만 입력할떄 회전을 방지하기 위하여 삼항연산자를 사용해보았다
( input.x == 0 ) ? Quaternion.identity
input.x가 0일떄 => AD키 회전키를 안눌른 상태라면! 회전 변화없음!
: Quaternion.Euler(Vector3.up * Mathf.Atan2(dir.x, dir.y) * Mathf.Rad2Deg * rotSpeed * Time.deltaTime);
AD키 회전에도 값이 있다면 회전 적용!
마지막으로!
유니티의 오브젝트를 움직이고 회전하는건 행렬연산으로 이루어지는데
로컬공간을 오브젝트공간으로 변환하는 ModelMatrix를 생각해보면(TRS) 3개의 이동 회전 스케일이 각각 따로 곱해지는게 아닌 한번에 합치어져 계산이되는걸 생각해볼수있다
참고자료(영상의 9분30초부터)
[유니티 TIPS] 알아두면 쓸 데 있는 '트랜스폼' - YouTube
그래서 this.transform.SetPositionAndRotation 함수로 이동과 회전을 한번에 계산해보려한다
인자로는 포지션벡터, 쿼터니언인데
즉 인자로 위치와 회전값이 바뀌는것이된다
주석의 내용이 아래로 바뀐것이다
다시 확인해볼 시간..
먼저 제자리 회전 해보기 제자리 회전은 원래도 되었지만 다시 확인해보았다. 작동된다!
뒤로 이동하면서 회전 + 그냥 뒤로만이동 뒤로 이동하면서 회전은 전과 같이 잘 작동되었고
아까 안되었던 회전없이 뒤로만 이동도 IF문으로 처리해두어서 잘 작동된다
그냥 막 움직여보았다 후.. 좀 부족한게 있지만
그래도 점차 쌓아가면서 보완해 나가는게 맞는거같다..
3인칭 게임에서 카메라도 상당히 중요한 요소이던데
이어서 카메라도 만들어 봐야겠다
'Unity유니티 > 캐릭터' 카테고리의 다른 글
3인칭 캐릭터 만들어보기 3# 카메라궤도(자유시점) 만들어보기 (FreeLook 만들어보기) (0) 2022.06.20 3인칭 캐릭터 만들어보기 #2 카메라 회전및 장애물감지 (0) 2022.06.16 마우스 클릭 지점으로 캐릭터 회전 + 이동시키기 (0) 2022.06.14