본문 바로가기
공부/유니티

유니티3D 공부(Part 1-4) 적 만들기, 네이게이션 메쉬(NavMesh), 플레이어 추적

by 라이티아 2024. 9. 25.

이전 글에 이어서 공부를 계속한다!

전속전진이다!

 

우선, 코인 숫자를 늘려줬다

 

이제 플레이어 = 캐릭터를 따라오는 적을 만들어야 하는데, 책에서는 Navigation 기능에 대해서 설명하고 있다

 

몇번 듣기는 했어도 직접 해보기는 처음이라 재미있어 보인다

 

적으로 사용될 빈 오브젝트를 만들고 위치를 플레이어 앞으로 설정한다

 

모델은 유니티짱 에셋의 다른 모델, Box유니티짱을 사용한다

 

이제 여기에 NavMesh를 설정해야 한다

 

우선, 오브젝트에 navigation static을 넣어야 하는데

왜인지는 모르겠는데 비활성화 되어 있다

????? 진짜 왜?????

 

 

..............................................

........................

.........

...

.

 

 

알아보니 2022 버전쯔음부터 증발한 기능중 하나라고 한다

 

왓더???

뭔가 이상한 방식을 통해서 사용은 가능한 것 같다

 

이게 뭐지....

 

일단 대충 처리하고 진행해보자

 

이제 제외 부분에 static처리를 하고 bake를 해줄시 이동가능한 부분이 하늘색으로 표시된다

 

이제 여기에 NavMeshAgent를 추가해 주어야 한다

컴포넌트에서 Agent를 추가한다

 

Enemy가 이제 Agent를 가지고 있다

 

참고로 NavMeshAgent는 NavMesh를 따라 이동하게 하는 컴포넌트라고 한다

 

이제 이 컴포넌트를 활용할 스크립트를 작성한다

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class Enemy : MonoBehaviour
{
    public GameObject target;
    NavMeshAgent agent;
    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
    }

    // Update is called once per frame
    void Update()
    {
        agent.destination = target.transform.position;
    }
}

 

target은 플레이어 오브젝트가 될것이다. position값을 가져오기 위한 값이다

 

Agent의 destination은 지정 position으로 자동으로 움직이게 하는것이다.

 

 

잘 되는것을 확인할 수 있다

GIF로 넣으면 좀더 잘 보일 것 같아 GIF로 중간 중간 넣어보려 한다

 

이제 적에게도 애니메이션을 넣어보자

 

적에게 넣을 애니메이션은 결국 플레이어의 애니메이션과 동일하기에, 기존의 애니메이터를 재탕한다

 

 

그후 코드에 애니메이터를 추가해준다

using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.AI;

public class Enemy : MonoBehaviour
{
    public GameObject target;
    NavMeshAgent agent;
    Animator animator;
    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
        animator = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        agent.destination = target.transform.position;
        animator.SetFloat("Speed", agent.velocity.magnitude);
    }
}

이전의 코드와 동일하게, 이동을 하고 있다면, 이동하는 애니메이션이 재생되게 된다

 

시험해보자

잘되는것을 확인할 수 있다

 

이제 적과 충돌할시 이벤트를 구현해야 한다. 즉, 게임오버이다

 

적에게 우선 콜라이더를 추가한다

나는 박스 콜라이더를 사용하려한다

콜라이더 선택은 개인 취향이니 알아서 선택하길

필자는 박스 콜라이더가 익숙해서 그렇다

 

동일하게 IsTrigger를 넣어준다

이때 박스가 밑으로 가있으니, 이를 보정하기 위해 y값을 넣어줬다

 

그리고 충돌을 체크하기 위해서 태그를 넣어준다

 

두번째 태그를 추가한 뒤

적 오브젝트에 태그를 달아준다

 

이제 플레이어 스크립트에서 충돌에 대해서 처리한다

void OnTriggerEnter(Collider other)
    {
        if(other.tag == "Coin") Destroy(other.gameObject);
        if(other.tag == "Enemy") SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }

이전의 충돌에서 if문으로 쪼개서 tag에 따라 다른 처리를 유도한다

 

이제 테스트해보자

잘 처리됬는것을 알 수 있다

 

이제 다음 글에서는 아마 시작화면같은 씬에 대해서 다룰 것 같다

 

 

본 글에서 사용된 유니티 파일은 깃에 업로드됩니다.

 

GitHub - NoNamed02/Unity3D_Study_to_UnityChan

Contribute to NoNamed02/Unity3D_Study_to_UnityChan development by creating an account on GitHub.

github.com