728x90
반응형
NavMesh를 배운 뒤, 맵을 간단히 만들고 적 코드를 조금 수정 했습니다.

먼저 Player의 위치와 Enemy 위치를 변경하였습니다.
그리고 적의 코드를 수정하여 일정 거리 내에 플레이어가 있으면 쫓아오도록 만들었습니다.
또 컷신을 조금 바꿔서 전보다 자연스럽게 만들었습니다.
NightMareEnemy.cs
using DG.Tweening;
using System.Collections;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.SceneManagement;
public class NightMareEnemy : MonoBehaviour
{
#region Value
[SerializeField] private Transform player;
[SerializeField] private GameObject handObj;
[SerializeField] private MonoBehaviour mouseLookScript;
[SerializeField] private NavMeshAgent agent;
[SerializeField] private float stopDistance = 2f;
[SerializeField] private float bulletDetectionRange = 3f;
[SerializeField] private float retreatDistance = 1.5f;
[SerializeField] private float retreatDuration = 0.3f;
[SerializeField] private float chaseStartDistance = 10f; // 추적 시작 거리
private bool isCutsceneActive = false;
private bool isRetreating = false;
private bool isChasing = false; // 추적 여부
#endregion
private void Start()
{
if (agent == null)
agent = GetComponent<NavMeshAgent>();
}
void Update()
{
transform.position = new Vector3(transform.position.x, 0.5f, transform.position.z);
if (player == null || isCutsceneActive || isRetreating) return;
DetectNearbyBullets();
float distanceToPlayer = Vector3.Distance(transform.position, player.position);
if (distanceToPlayer <= chaseStartDistance) isChasing = true;
if (distanceToPlayer > chaseStartDistance + 2f) isChasing = false; // 일정 거리 벗어나면 멈춤
if (isChasing)
{
if (distanceToPlayer > stopDistance)
{
agent.SetDestination(player.position);
}
else
{
StartCoroutine(KillPlayerCutscene());
}
}
}
private IEnumerator KillPlayerCutscene()
{
isCutsceneActive = true; // 컷신 활성화
handObj.SetActive(false);
// 1. 플레이어 조작 비활성화
if (player.GetComponent<CharacterController>())
player.GetComponent<CharacterController>().enabled = false;
if (mouseLookScript != null) mouseLookScript.enabled = false;
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
Vector3 targetPosition = transform.position - transform.forward * -3f; // 적의 위치 근처로 카메라 이동
yield return Camera.main.transform.DOMove(targetPosition, 0.1f).WaitForCompletion(); // 카메라 이동
// 카메라가 적을 바라보도록 회전
yield return Camera.main.transform.DOLookAt(transform.position, 0.3f).WaitForCompletion();
yield return new WaitForSeconds(0.3f); // 카메라 이동과 회전하는 시간
// 3. 적을 흔들기
transform.DOShakePosition(1.5f, 0.2f, 10, 90, false, true);
yield return new WaitForSeconds(1.5f); // 적이 흔들리는 시간
// 3. 플레이어 제거
SceneManager.LoadScene("GameOver");
}
}
최대한 바뀐 부분만 적었습니다.
특히 컷신 부분이 중요하게 바뀌었으며, 또한 일정 거리 내에 플레이어가 있으면 쫓아가도록 만들었습니다.
다음으론 빨간색 손(적 처치용)을 오브젝트로 배치를 하고 손을 얻으면 사용할 수 있도록 할 것입니다.
+ 방금 알았는데 외국 유튜브에 그랩팩이나 기믹들 튜토리얼 있더라고요
따라 만들어 볼까 생각 중이긴 합니다
'Unity' 카테고리의 다른 글
| 그랩팩 개발 일지 9 (0) | 2025.02.15 |
|---|---|
| 그랩팩 개발 일지 8 (0) | 2025.02.14 |
| 그랩팩 개발 일지 6 (0) | 2025.02.12 |
| 그랩팩 개발 일지 5 (0) | 2025.02.11 |
| 그랩팩 개발 일지 4 (0) | 2025.02.10 |