Unity

그랩팩 개발 일지 7

psb08 2025. 2. 13. 15:27
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