본문 바로가기

개발방법

멀티 게임 개발일지 3 - Unity

오늘은 이번 멀티 게임 프로젝트에서 AI를 어떻게 구현하였는지 설명해보겠다.

 

먼저 게임 개발에서 AI를 개발할 때 대표적인 2개가 있다.

하나는 FSM (finite state machine) 유한상태머신으로 해당 행동에서 다음 상태로 전이 과정을 거쳐서 AI를 만드는 방법이 있고, 또 다른 하나는 Behavior Tree로 Task들을 거쳐서 다음 행동을 실행하는 방법이 있다.

 

글쓴이는 FSM을 여러 프로젝트에서 사용해보면서 상태가 많아졌을 때 스파게티 코드가 되면서 조금 더 효율적인 AI를 구현하고자 하였다. 그래서 찾은 Behavior Tree!!

 

FSM은 상태들이 많아지고, 다른 행동을 고치거나 추가할 때 해당 행동에 필요한 전이 코드들도 다 고쳐서 유지보수가 어렵게 되었다. 글쓴이가 생각했을 때 정말 간단한 작업은 FSM을 사용해도 무방하다. 하지만 대형 프로젝트나 정말 다양한 상태들이 있는 객체가 사용한다면 개인적으로는 비추한다...

 

Behavior Tree는 시각 디자인을 통하여 Task들을 관리할 수 있고, Task들 끼리 서로를 모르기 때문에 상태가 추가 되거나 고칠 상황이 나와도 해당 Task만 건들면 되기 때문에 훨씬 간편하다!!

(글쓴이가 알아본 바로는 Unity는 Asset으로 시각화 된 Behavior Tree를 사용할 수 있고, Unreal은 엔진 내부에 있는 것으로 알고 있다.)

 

지금부터 본론에 들어가겠다.

FSM은  FSM, Behavior Tree - Unity (tistory.com) 여기서 비교하면서 설명을 해놨으니 링크를 들어가서 보면 된다!

 

FSM, Behavior Tree - Unity

개요Unity를 기반으로 AI를 만들기 위해서는 현재 상태를 저장하고 현재 상태의 행동을 실행하면 된다.그러면 유니티에서는 어떠한 방법으로 AI를 만들까? 대표적으로는 FSM이 있다.  Finite State Mac

gameclientstudynote.tistory.com

 

 

글쓴이는 Unity로 개발하였기 때문에 Asset을 활용하였다. 

Asset Link : Behavior Designer - Behavior Trees for Everyone | Visual Scripting | Unity Asset Store

 

Behavior Designer - Behavior Trees for Everyone | 비주얼 스크립팅 | Unity Asset Store

Get the Behavior Designer - Behavior Trees for Everyone package from Opsive and speed up your game development process. Find this & other 비주얼 스크립팅 options on the Unity Asset Store.

assetstore.unity.com

 

*해당 에셋을 다운 받아서 임포트를 해주면 Unity 상단에 Tools 에 Behavior Design이 생긴다.

 

이제 AI를 사용하려면 해당 객체에 Behavior Tree를 붙여줘야한다. 그러면 각 객체마다 본인이 만든 Behavior를 실행할 수 있다. 아래 사진 처럼 생성하여 해당 오브젝트 컴포넌트에 부착해주면 된다.

 

 

처음 생성한 거라면 아래 사진 처럼 빈 화면이 나온다.

 

본 글은 Asset을 설명하려고 하진 않아서 만약 궁금한 것이 있으면 찾아보거나 댓글로 질문하면 좋을 것 같다.

 

Tasks 카테고리에 Task를 사용하면서 AI를 구현한다.

 

1. 먼저 아래 사진 처럼 진입 점을 만들어 줄 것 이다.

2. 진입 이후 아래 사진 처럼 Sequence를 설정한다.

3. 객체가 생성되면 타겟이 있는지를 체크한다.

HasTarget을 성공시켜야 다음 Action으로 진행된다.

4. 타겟을 찾았으면 이제 계속해서 반복하면서 AI 행동을 실행할 것이다.

5. Select는 해당 시퀀스를 성공하면 다음 시퀀스를 실행하지 않고, 실패하면 다음 시퀀스를 실패 성공여부를 체크하여 돌아가는 형태이다.

 

글쓴이는 간단하게 생각해본 AI는 타겟이 지정된 거리안에 있으면 타겟을 따라가고, 없으면 Patrol 하는 형태를 만들어보려고 한다.

 

Select는 FindTarget를 먼저 실행하고, 실패 시 Patrol을 실행 한다.

 

 

그렇게 나온 총 Tree는 이렇게 나오게 되었다.

 

이렇게만 보면 이해가 안될 수 있으니 세부 코드를 보겠다.

 

먼저 처음 AI 객체가 생성된 이후 타겟이 있는지는 1번만 찾아줄 것이다. 타겟을 찾는 함수를 Frame마다 돌려주면 오버헤드가 발생한다. 그래서 처음 객체가 생성된 이후 1번만 타겟을 찾아서 캐싱을 해주는게 핵심 포인트 이다.

 

 

공유 타겟 리스트를 통해서 저장되어있던 타겟을 불러와서 지정된 거리안에 들어오는 타겟을 타겟으로 지정하는 코드이다.

 

 

타겟을 정해줬으면 위 사진 처럼 타겟으로 이동하는 형태를 만들어주면 된다.

*MoveComponent는 플레이어 오브젝트에서 사용하였는데 재사용하기에 적합하여 AI 오브젝트에서도 사용하였다.

 

위 사진까지 성공하였다면 Patrol Sequence에 가지 않는다.

 

위 사진은 FindTarget을 실패하였다면 이제 Patrol을 해야한다. 

본인위치에서 랜덤으로 지정된 거리 만큼 타겟거리로 설정한다.

 

*AI는 서버에서만 이동하면 되기 때문에 서버인지 체크해주는 코드를 넣었다.

 

이제 Target에서의 이동과 똑같이 Chase 하고나서 잠깐 일정 시간동안 멈추는 행동이 필요할 것 같다.

Target을 따라가는 코드와 조금 다른게 Patrol로 이동하는 중에 타겟이 있으면 따라가줘야하기 때문에 Frame마다 검사를 해줘야한다. 해당 코드는 아래 이동한 이후 잠깐 일정 시간동안 멈추는 행동에서도 검사하는 코드가 필요하기 때문에 여기서 보여주겠다.

 

 

위 사진은 Patrol로 랜덤한 곳을 이동하고 해당 거리로 이동했으면 잠깐 대기하는 코드이다.

대기가 성공했다면 다시 Patrol 또는 Target을 찾을 것이다.

 

그리고 대기하면서도 타겟이 해당 거리안에 있는지를 체크하는 코드도 추가하여야 한다.

 

이렇게 간단하게 AI를 만들어 봤고, 글쓴이는 프로젝트를 더 개발하면서 더 나은 코드와 AI를 만들려고 해볼 것 같다.

 

다음 글은 2D Pathfinding이 될 것 같다. 

결국 이동할 수 있는 지역과 아닌 지역으로 나눠져 있어야 하니까..?

 

추가로 3D 에서는 Navmesh가 내장되어있지만 2D는 내장되어 있진 않아서 그 부분을 건드려 볼 것 같다.

728x90

'개발방법' 카테고리의 다른 글

TDD (Test Driven Develoment)  (0) 2025.05.24
DIContainer  (2) 2025.05.23
멀티 게임 개발일지 2- Unity  (0) 2024.07.13
멀티 게임 개발일지 1 - Unity  (2) 2024.07.13
응집도와 결합도  (0) 2024.04.14