(유니티3D)직진 보정
이전 글에서 봤던 그 장면입니다.
이번에는 뒷부분인 직진에 대해서 설명해보겠습니다.
직진은 대부분 아는 방식으로 해도 전혀 문제가 없습니다.
저 같은 경우엔 유니티의 transform.TransformDirection() 함수를 굉장히 애용합니다.
2D 게임 같이 카메라의 방향이 거의 바뀌지 않는 게임에선 그리 쓸모가 없지만 요즘 대부분의 3D 게임은 캐릭터도 3차원으로 움직일 뿐만 아니라 카메라도 캐릭터에 맞춰 움직이기 때문에 똑같이 앞으로 가도 보는 방향에 따라 향하는 곳이 다르기 때문이죠.
그때 그 보정을 알아서 해주는 함수가 바로 transform.TransformDirection() 함수입니다.
정확히 말하면 월드 벡터값을 인자로 넣으면 로컬 방향을 계산해서 도로 뱉어내는 함수입니다만 우리가 살면서도 동서남북을 기준 두고 말하는 것보다 왼쪽, 오른쪽, 앞, 뒤 란 표현을 더 많이 쓰듯 게임에서도 로컬의 사용 빈도는 굉장히 높다고 봅니다.
아무튼 직진 이동 자체는 문제가 없습니다만 저번 글에서 언급했던 0 → / 이런 상황에서 캐릭터가 밀려나는 상황을 막을 필요가 있습니다.
좀 더 이해를 돕기 위한 GIF.
원형 이동을 하다 bool 값 변수 하나만 바꿔주면 그 자리에서 직선 이동을 한다.(스크립트에서 변경 가능)
벗어나려 해도 되돌아 간다.
이런 식으로 어떤 외부 요인으로 가야 할 길에서 벗어나게 된다면 그것을 막아줄 필요가 있습니다.
이걸 간단하게 구현하려면 캐릭터를 Rigidbody로 만들고 Constraints에서 Freeze Position으로 깊이 부분 좌표를 잠그기만 해도 됩니다.
하지만 tree-sha는 원형 이동과 직선 이동이 같이 있기 때문에 항상 월드 좌표를 기준으로 삼는 Rigidbody의 Constraints는 이용할 수 없으며 무엇보다 본 게임의 캐릭터는 CharactorController를 사용하고 있기에 더더욱 불가능합니다.
그렇기에 우린 직선 이동이 시작 되는 순간의 좌표와 방향을 읽어 그 로컬 좌표에서의 깊이를 계속해서 0으로 만들어주는 코드를 직접 짤 필요가 있습니다.
1 2 3 4 5 6 7 8 9 10 11 | if (!lineMove) //직선으로 최초 진입 시 { lineMove = true; lineStartPosition = transform.position; //최초 진입 순간 좌표를 기준점으로 삼는다. } Vector3 tempLine = transform.InverseTransformDirection(transform.position - lineStartPosition); //InverseTransformDirection함수로 로컬 벡터를 월드 벡터로 바꾼다. tempLine.z = 0; //그 후 바뀐 벡터의 깊이를 0으로 초기화 transform.position = Vector3.Lerp(transform.position, lineStartPosition + transform.TransformDirection(tempLine), tempDeltaTime * 2); //다시 로컬로 되돌린 다음 보다 자연스러움을 위해 보간으로 보정되게 한다. | cs |
저 같은 경우엔 이렇게 짰습니다. 캐릭터의 높이나 이동은 정상적으로 진행되야 하기에 깊이만을 0으로 초기화 시켜줍니다.
위 코드에서 lineMove 같은 경우 원형 이동 모드가 되었을 때 false로 바꿔주면 다음 직선 이동 시 그 위치를 기준점으로 삼습니다.
transform.InverseTransformDirection() 함수는 transform.TransformDirection() 함수의 반대 개념입니다.
거의 쓸 일이 없을 것이라 생각했는데 이런 식으로 쓰게 되더군요
'Tree-sha (팀 3D) > 분석' 카테고리의 다른 글
(유니티3D)보스AI분석 (0) | 2017.12.16 |
---|---|
(유니티3D)기믹분석3(부유석, 버섯, 미끄러운 이끼) (0) | 2017.12.14 |
(유니티3D)기믹분석2(가시발판, 문, 레버, 보라색 발판) (0) | 2017.12.12 |
(유니티3D)기믹분석1 (모닥불, 바이러스) (0) | 2017.12.11 |
(유니티3D)호를 그리며 가는 캐릭터 (0) | 2017.12.04 |