인프런이라는 강의 플랫폼에서 Rookiss님의 유니티 강의를 보고 케릭터가 움직이는 기능을 배웠습니다.
해당 내용을 봐도 한번에 이해가 되지 않았습니다.
그리고 강의 코드를 참고하지 않아도 혼자서 코드를 작성해 볼 수 있어야 한다고 생각했습니다.
그러기 위해선 강의에 나오는 내용을 정리하고 코드를 직접 하나씩 뜯어보고,
모르는 내용은 정리해서 하나씩 해결해 나가야 한다고 생각해서 이렇게 글로 작성하게 되었습니다.
public class PlayerController : MonoBehaviour
{
// ...
void Update()
{
if (Input.GetKey(KeyCode.W))
transform.position += new Vector3(0.0f, 0.0f, 1.0f);
if (Input.GetKey(KeyCode.S))
transform.position -= new Vector3(0.0f, 0.0f, 1.0f);
if (Input.GetKey(KeyCode.A))
transform.position -= new Vector3(1.0f, 0.0f, 0.0f);
if (Input.GetKey(KeyCode.D))
transform.position += new Vector3(1.0f, 0.0f, 0.0f);
}
}
무료로 제공해주는 Asset 케릭터 모델을 다운로드 받고 스크립트로 PlayerController을 추가했습니다.
추가한 스크립트에 위와 같은 코드를 작성했습니다.
유니티 실행해 실행하면 위와 같이 작동합니다.
이동은 해도 움직임이 부자연스럽고 방향키를 한 번만 입력해도 생각보다 많이 범위를 이동합니다.
우선 코드를 개선하기 전에 각 키워드를 정리하고 공부해봤습니다.
게임 오브젝트의 포지션, 회전, 스케일, 부모-자식 상태를 저장하기 위해 사용하며 따라서 매우 중요합니다. 게임 오브젝트에는 항상 하나의 트랜스폼 컴포넌트가 있습니다. 이 트랜스폼을 제거하거나, 트랜스폼이 없는 게임 오브젝트를 생성하는 것은 불가능합니다.
<Unity Docs - 트랜스폼>
유니티 Docs에는 위와 같이 나와있습니다.
추가적으로 게임 오브젝트의 부모-자식 관계 설정, 스케일에 관한 내용은 Unity Docs를 참고 바랍니다
=> Unity Docs - 트랜스폼 => 링크
3D 벡터 및 점을 표현합니다. 이 구조는 Unity 전체에서 3D 위치와 방향을 전달하는데 사용됩니다. 또한 일반적인 벡터 연산을 수행하기 위한 함수도 포함되어 있습니다.
<Unity Docs - Vector3>
벡터에 대한 수학, 물리학, 기하학 등 여러 복잡한 글들이 있습니다.
다 알면 좋겠지만 해당 내용들은 그래픽스를 배우거나 좀 더 심화로 배울 때 공부하기로 했습니다.
유니티에서 사용되는 벡터의 개념으로 봤을 때 간단하게 요약하면,
특정한 공간에서 방향과 크기를 표현하는 도구로서 주로 화살표로 표시되는 개념을 말합니다.
유니티에서는 공간 내의 점이나 방향 등을 표현하는데 사용됩니다.
벡터는 주로 2가지 유형으로 나뉩니다.
(그래픽스 관점에서 벡터를 이해하고 싶으시면 블로그 링크 를 참고하시길 바랍니다.)
키워드를 아주 간단하게 정리해보고 알아봤으니 이제 다시 문제점을 수정해보기로 했습니다.
void Update()
{
if (Input.GetKey(KeyCode.W))
transform.Translate(Vector3.forward * Time.deltaTime * _speed);
if (Input.GetKey(KeyCode.S))
transform.Translate(Vector3.back * Time.deltaTime * _speed);
if (Input.GetKey(KeyCode.A))
transform.Translate(Vector3.left * Time.deltaTime * _speed);
if (Input.GetKey(KeyCode.D))
transform.Translate(Vector3.right * Time.deltaTime * _speed);
}
위에 작성한 코드를 실행해 작동하면 아래와 같이 작동합니다.
코드의 양은 적지만 각 키워드에 담겨있는 내용이 상당히 많았습니다.
아직 전부 다 깊게 이해하지는 못했지만, 발견했던 문제들과 개선할 점은 다 해결되었습니다.