Unity 엔진 공부/project1

project1 개발일지 - 5 [scriptable object를 활용한 Base NPC ]

EJH 2025. 7. 29. 11:18
반응형

목표

몬스터의 ai에는 크게 Idle, Attack, Chase, Die 상태가 존재한다.

각 상태는 몬스터 별로 다양하게 존재할 것이다. 

예를 들어 Chase 상태에서 일정 거리를 유지하며 Attack을 한다던가,

Die에서 자폭을 하고 사라진다던가...

따라서 각 상태에서 다양한 부품을 만들어 조립해 여러 종류의 몬스터를 만들 수 있다.

이에 scriptable object를 활용한다.

 

1.scriptable object를 이용한 NPCState

https://docs.unity3d.com/kr/2022.3/Manual/class-ScriptableObject.html

 

ScriptableObject - Unity 매뉴얼

ScriptableObject는 클래스 인스턴스와는 별도로 대량의 데이터를 저장하는 데 사용할 수 있는 데이터 컨테이너입니다. ScriptableObject의 주요 사용 사례 중 하나는 값의 사본이 생성되는 것을 방지하

docs.unity3d.com

 중복 데이터를 저장하는 대신 ScriptableObject를 이용하여 데이터를 저장한 후 모든 프리팹의 레퍼런스를 통해 액세스할 수 있습니다. 즉, 메모리에 데이터 사본을 하나만 저장합니다.

 

주의할 점은 공식 문서에 의하면 ScriptableObject는 하나의 데이터 사본만 저장하여 액세스하기 때문에

각 몬스터가 개별적으로 갖는 데이터를 저장하면 안된다는 점이다.

예를 들어 chase에서 어그로가 풀리는 거리라던가 이런 점은 각 객체가 갖고 있고,

scriptable object로 만든 상태에는 포함하면 안된다.

 

 

ScriptableObject를 상속받아서 NPCState 클래스를 추상클래스로 만들어준다.

이제 각 상태는 이 클래스를 이용해 만들것이다.

상태머신을 활용하기위해 각 상태에 입장, 유지, 종료 함수를 만들어줘야한다.

 

2.StateMachine

이제 각 상태를 활용하기 위한 상태머신 클래스를 만든다.

상태를 변경할때 필요한 함수와 유지할때 호출하는 함수이다.

 

 

 

3. BaseNpc

지금까지 만든것을 바탕으로 BaseNPC를 채워준다.

각 상태에서 어떻게 행동할지를 저장하는 NPCState들과,

공격력, 사정거리, 이동속도 등을 결정한 NPCStat,

각 상태를 호출할 StateMachine,

길찾기를 위한 NavMeshAgent이다.

 

현재 싱글플레이 게임을 우선 목표로 만들고 있기 때문에 단순하게 target을 Player로 정해두었다.

시작 상태를 정하고, agent의 속도를 stat에 맞게 변경해준다.

 

그리고 NPCState에서 공용적으로 사용할 수 있는 다양한 함수들을 BaseNPC에 미리 만들어둔다.

 

4. 각 상태 만들기

각 상태를 에셋으로 가져오기 위한 메뉴를 만들어준다.

이렇게 만든 에셋은 다음과 같은 경로로 만들어줄 수 있다.

 

 

각 상태에 OnEnter, OnUpdate, OnExit를 채워준뒤,

NPC모델에 BaseNPC를 넣고, 각 상태를 넣어주면 된다.

 

 

사정거리를 벗어나면 Chase, 사정거리라면 Attack, 감지거리보다 멀다면 Idle인 기본적인 상태가 완성되었다.

 

마무리

아직 상태만 연결되었을 뿐, 공격도 하지 못하고, 체력도 보이지않는다. 

다음에는 체력바를 만들고, 다른 팀원이 만든 투사체를 활용해 몬스터가 독침등을 발사할 수 있게 할 예정이다.

반응형