#region 플레이어 회전
// 마우스 위치를 화면에서 광선으로 변환
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit; // 광선이 물체와 충돌 여부를 위한 변수
// 광선이 물체와 충돌하는지 확인
if (Physics.Raycast(ray, out hit, 100))
{
// 플레이어가 바라볼 방향 벡터를 계산
Vector3 rotateVec = hit.point - rotateObject.transform.position;
rotateVec.y = 0; // 수평 회전을 위해 y축 값을 0으로 설정
// 플레이어의 시선을 계산된 방향으로 회전
rotateObject.transform.LookAt(rotateObject.transform.position + rotateVec);
}
#endregion
시점을 변경하니 전에 사용한 코드가 내 생각과 다르게 작동한다는 걸 알게 됐다.
그래서 보통 탑뷰에서 사용되는 Raycast 함수로 수정했다.
Player_Ctrl.cs
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.UIElements;
public class Player_Ctrl : MonoBehaviour
{
float targetRotationY = 0f; // 카메라 회전 각도 변수
void Update()
{
#region 카메라 회전
// 왼쪽 Alt 키가 눌렸을때 한 번
if (Input.GetKeyDown(KeyCode.LeftAlt))
{
targetRotationY += 45f; // 회전 각도 45도 증가
}
// 카메라의 Y축 회전 각도를 할당
float currentRotationY = transform.rotation.eulerAngles.y;
// 현재 각도에서 다음 각도로 선형 보간
float newRotationY = Mathf.LerpAngle(currentRotationY, targetRotationY, 10f * Time.deltaTime);
// 카메라 Y축 회전
transform.rotation = Quaternion.Euler(0f, newRotationY, 0f);
#endregion
}
}
(카메라 회전 코드를 추가)
플레이어가 여러 시점을 전환할 수 있도록 키를 누를 때마다 카메라 Y축으로 45도씩 회전하는 기능을 추가했다.
또, 부드러운 시점 전환을 위해 선형 보간 함수를 이용했다.
이 코드를 카메라 스크립트에 따로 만들어 넣지 않고 [Player_Ctrl] 스크립트에 추가한 이유는 회전 기준이 플레이어에게 있기 때문에 하위 오브젝트로 카메라를 넣어 쉽게 구현할 수 있었다.
코드를 보면 알겠지만 사실 카메라의 회전이 아니라 카메라의 최상위 오브젝트(빈 오브젝트)를 회전하는 것이다.
카메라 회전 코드를 적용한 결과
바닥을 기준으로 사방에 벽을 배치
V 키를 누른 상태에서 오브젝트의 꼭짓점을 드래그해서 다른 오브젝트의 꼭짓점으로 스내핑 할 수 있다.
적 AI를 구현하기 위해 [AI Navigation] 패키지를 설치했다.
2022.3.7f1 버전은 이 패키지가 기본으로 설치되어있지 않아 따로 설치해야 한다.
적으로 사용할 오브젝트를 만들고 플레이어 오브젝트와의 구분을 위해 빨간색을 사용했다.
충돌 감지를 위해 플레이어와 적에게 [Rigidbody] 컴포넌트를 추가했다.
[Freeze Rotation] 속성을 전부 체크해서 외부의 물리력에 회전하지 않게 고정한다.
적 AI를 바닥에서만 이동하게 하기 위해 Navigation으로 Bake했다.
Enemy.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class Enemy : MonoBehaviour
{
NavMeshAgent agent; // NavMeshAgent 컴포넌트를 저장할 변수
public Transform player; // 플레이어의 위치를 저장할 Transform 변수
void Start()
{
// NavMeshAgent 컴포넌트를 현재 게임 오브젝트에서 가져옴
agent = GetComponent<NavMeshAgent>();
}
void Update()
{
// 플레이어의 위치를 목적지로 설정
agent.SetDestination(player.position);
}
}