
Github Repository를 만들고 나서, 기능 개발을 시작했다.
우선 여느 IO 게임이 그렇듯이, 카메라는 플레이어 캐릭터를 중앙에 둔 채로 이동하고, 플레이어 캐릭터의 회전에는 영향 받지 않아야 한다.
그런 식으로, 캐릭터의 회전과 이동, 그리고 카메라 고정을 먼저 구현했다.

이렇게 플레이어 게임 오브젝트 하위에 메인 카메라와 플레이어 캐릭터 (plane)을 배치했다.
그리고, plane 오브젝트에 들어갈 코드를 구현했다.
우선적으로, 마우스 커서 방향으로 캐릭터 오브젝트를 향하게 하려면, 아래와 같은 과정이 필요하다.
아래의 함수가 해당 작용을 한다.
void RotateToMouseCursor()
{
Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
Vector3 direction = mousePosition - transform.position;
float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(new Vector3(0, 0, angle - 90));
}
이 함수는 FixedUpdate안에서 call된다.
캐릭터의 이동도 간단하다. 그냥 일정하게 앞으로만 이동하도록 구현하면 된다-라고 생각했지만 그 정도는 아니었다.
그래도 간단한건 여전하다. plane 오브젝트에 이동하는 함수를 넣게 되면, 카메라가 오브젝트를 트래킹할 때 추가적으로 코드를 작성해야한다. 카메라와 plane 오브젝트 간에 위치 상속관계가 없기 때문이다.
하지만 이미 player 오브젝트의 하위에 plane과 Main Camera를 넣어두었기 때문에 player 오브젝트에 이동 함수를 넣게 되면, 카메라도 위치를 상속받아 같이 이동하게 되고, 캐릭터 회전에 대해서는 상속관계가 없기 때문에 (plane에서 구현되었으므로) 카메라는 회전하지 않으면서 이동만 트래킹할 수 있다.
이동 함수는 다음과 같이 구현되었다.
1. 화면에서 마우스 좌표 구하기
2. 현재 타겟 오브젝트 (player)의 좌표 구하기
3. 두 좌표를 subtract 해서 방향 벡터 구하기
4. 방향 벡터에 speed 상수를 곱하고 현재 위치 벡터에 더하기
addForce 함수를 사용하지 않은 이유는 속력이 일정한 운동을 하게 만들고 싶었기 때문이다.
아래의 함수가 해당 작용을 한다.
void MoveTowardsMouse()
{
Vector2 worldMousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
Vector3 direction = ((Vector3)worldMousePosition - transform.position).normalized;
Vector3 currentPosition = transform.position;
transform.position = new Vector3(currentPosition.x + direction.x * speed, currentPosition.y + direction.y * speed, 0);
}
이렇게 구현하면, 캐릭터 이동과 카메라 고정이 모두 정상적으로 동작한다.
완성된 모습