본문 바로가기
게임 프로그래밍/게임개발 중급

게임개발 중급(59) - Monster Killer(21)

by jyppro 2023. 6. 22.

Monster Killer(21)

저번에는 NavMesh를 사용하여 랜덤하게 움직이는 스크립트를 작성해 보았습니다. 오늘은 몬스터 움직임에 맞춰 따라가는 카메라에 대해서 다뤄보겠습니다.

 

기존 카메라 설정

저희는 사실 이미 이전에 몬스터에게 카메라를 고정시키는 작업을 하였습니다. 빈 오브젝트로 타겟을 생성하여 카메라가 해당 타겟을 따라가도록 만드는 방법이었죠 하지만, 그 당시에는 몬스터가 해당 위치에 그대로 있었기 때문에 타겟을 따로 처리해주지 않고 같은 자리에 위치시켰습니다. 하지만 이제는 몬스터가 계속해서 움직여 위치가 계속 바뀌게 됩니다. 따라서 기존과는 다르게 바꿔주어야 합니다.

 

움직이는 몬스터 따라가기

저는 기존에 사용하던 타겟을 이용한 추적을 삭제하고, 몬스터를 따라가는 방식으로 바꾸려고 합니다. 그 이유는 타겟을 따라가기 위해서는 타겟 오브젝트를 몬스터 프리팹마다 넣어줘야 합니다. 근데 저희는 이미 Monster 태그를 통해 몬스터를 분류해놓았기 때문에 굳이 그렇게 할 필요가 없습니다.

 

CameraController

using UnityEngine;

public class CameraController : MonoBehaviour
{
    [SerializeField] private float angle = 0f; // 카메라 이동을 위한 각도
    [SerializeField] private float radius = 20f; // 원의 반지름
    [SerializeField] private float speed = 50f; // 카메라 이동 속도
    private KeyCode leftKey = KeyCode.A; // 왼쪽 방향 키
    private KeyCode rightKey = KeyCode.D; // 오른쪽 방향 키

    private void Update()
    {
        if (Input.GetKey(leftKey)) { angle -= speed * Time.deltaTime; } // 왼쪽 방향 키 입력 시
        else if (Input.GetKey(rightKey)) { angle += speed * Time.deltaTime; } // 오른쪽 방향 키 입력 시

        GameObject activeMonster = GameObject.FindGameObjectWithTag("Monster");

        if(activeMonster != null)
        {
            // 각도를 라디안으로 변환하여 카메라 위치 계산
            float radian = angle * Mathf.Deg2Rad;
            float x = activeMonster.transform.position.x + Mathf.Cos(radian) * radius;
            float z = activeMonster.transform.position.z + Mathf.Sin(radian) * radius;

            transform.position = new Vector3(x, transform.position.y, z); // 카메라 위치 설정
            transform.LookAt(activeMonster.transform); // 카메라가 항상 물체를 향하도록 설정
        }
    }
}

코드를 살펴보면, activeMonster로 Monster 태그를 가진 오브젝트를 가져와서 해당 오브젝트의 transform을 따라가도록 해주었습니다. 이렇게 되면 기존에 사용하던 target 오브젝트들은 전부 삭제해 주어도 됩니다.

 

제대로 작동하는 지 테스트 해보겠습니다.

 

게임 실행

카메라-무빙
카메라 움직임

기존에 고정위치에 있던 폭탄을 기준으로 움직이는 모습을 확인할 수 있었습니다. 카메라 또한 몬스터와 같이 이동합니다.

 

<NEXT>

오늘은 몬스터가 움직임에 따라 카메라, 즉 플레이어의 시점도 따라 움직이도록 만들어 보았습니다. 다음에는 몬스터가 움직이는 데 애니메이션을 만들어 주고, 다른 애니메이션들과 자연스럽게 이어지도록 만들겠습니다. 감사합니다.