Unity

[TIL] Unity 최종프로젝트 몬스터 AI 구현하기_ 1일차

unihee1 2025. 4. 8. 20:10

최종프로젝트에서 내가 맡은 역할은 바로 플레이어를 공격하고 추격하는 몬스터를 구현하는 일이다.

오늘은 몬스터 데이터를 만들고 플레이어를 따라다니는 것까지 구현해보았다.

 

1. MonsterData 클래스

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

[CreateAssetMenu(fileName = "Monster", menuName = "New Monster")]
public class MonsterData : ScriptableObject
{
    [Header("Info")]
    public int monsterHP;
    public int monsterPower;
    public int monsterWalkSpeed;
    public int monsterRunSpeed;
    public GameObject dropItem;
}

몬스터의 데이터를 저장하는 스크립트로 ScriptableObject를 사용하여 만들었다.

필드는 아래와 같이 이루어져있다.

 

  • monsterHP: 몬스터의 체력
  • monsterPower: 몬스터 공격력
  • monsterWalkSpeed: 몬스터의 걷는 속도
  • monsterRunSpeed: 몬스터의 달리는 속도
  • dropItem: 몬스터가 죽었을 때 드롭할 아이템 (프리팹)

에디터에서 Assets -> Create -> New Monster를 선택하면 몬스터 데이터를 생성할 수 있다.

 

2. MonsterController 클래스

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

enum MonsterState
{
    Idle,
    Wandering,
    Attacking
}

public class MonsterController : MonoBehaviour
{
    [SerializeField] private MonsterData monsterData;
    public NavMeshAgent nav;
    public Transform target;

    void Start()
    {
        if (monsterData == null)
            return;
        nav = GetComponent<NavMeshAgent>();
        nav.speed = monsterData.monsterRunSpeed;
    }
    private void Update()
    {
        nav.SetDestination(target.position);
    }
}

 

몬스터의 움직임과 행동을 구현하기 위해 생성한 스크립트이다.

 

enum MonsterState
{
    Idle,
    Wandering,
    Attacking
}

enum으로 몬스터의 상태를 정의하며 현재는 코드에서 상태별 로직은 구현되지 않았지만 확장할 수 있도록 구조만 잡아두었다.

 

public class MonsterController : MonoBehaviour
{
    [SerializeField] private MonsterData monsterData;
    public NavMeshAgent nav;
    public Transform target;

    void Start()
    {
        if (monsterData == null)
            return;
        nav = GetComponent<NavMeshAgent>();
        nav.speed = monsterData.monsterRunSpeed;
    }

    private void Update()
    {
        nav.SetDestination(target.position);
    }
}

몬스터의 행동을 제어하며 NavMeshAgent의 SetDestination을 사용하여 목표 위치(target)로 몬스터를 움직이게 한다.

  • monsterData: 연결된 MonsterData ScriptableObject (몬스터 능력치 정보)
  • nav: NavMeshAgent 컴포넌트 (AI 경로 이동을 담당)
  • target: 몬스터가 따라갈 대상 (예: 플레이어)

3. 실행해보기

영상처럼 몬스터가 목표를 잘 따라다니는 것을 볼 수 있다.