ํ๋ ์ด์ด๋ฅผ ์ถ์ ํ๋ ์ ์บ๋ฆญํฐ๋ฅผ ๊ตฌํํ ๊ฒ์ด๋ค.
1. ์ ์บ๋ฆญํฐ ๋ธ๋ฃจํ๋ฆฐํธ ํด๋์ค ์์ฑ
์ ์บ๋ฆญํฐ๋ก ์ฌ์ฉํ ์บ๋ฆญํฐ ๋ธ๋ฃจํ๋ฆฐํธ ํด๋์ค๋ฅผ ์์ฑํ๋ค.
์์ฑํ ์ ์บ๋ฆญํฐ ๋ธ๋ฃจํ๋ฆฐํธ ํด๋์ค๋ฅผ ์ฐ ๋ค, Mesh์ Collision์ ์๋ง๊ฒ ์์ ํ๋ค.
2. AI ์ปจํธ๋กค๋ฌ ์์ฑ
์ธ๋ฆฌ์ผ ์์ง์์๋ ์บ๋ฆญํฐ๋ controller์ ์ง๋ฐฐ๋ฅผ ๋ฐ๋๋ค. ํ๋ ์ด์ด ์บ๋ฆญํฐ๋ player controller์ ๋น์๋๊ณ ๋์ผํ๊ฒ AI ์บ๋ฆญํฐ๋ AI Controller์ ๋น์๋๊ฒ ๋๋ค.
AI ์ปจํธ๋กค๋ฌ๋ฅผ ์์๋ฐ๋ ๋ธ๋ฃจํ๋ฆฐํธ ํด๋์ค๋ฅผ ์์ฑํ๋ค.
์ด๋ ๊ฒ ์์ฑํ AI ์ปจํธ๋กค๋ฌ๋ ์ด์ ์ ์์ฑํ ์บ๋ฆญํฐ ๋ธ๋ฃจํ๋ฆฐํธ ํด๋์ค์์ ๋ฑ๋ก ๊ฐ๋ฅํ๋ค.
- Rotation Yaw ํ์ฑํ: AI ์บ๋ฆญํฐ ํ์ ์ ์ฌ์ฉ
- Auto Possess AI
- Disabled: ๋นํ์ฑํ
- Placed In World: ํฐ์ด ๋ฐฐ์น๋ ๊ฒฝ์ฐ์๋ง AI ์ปจํธ๋กค๋ฌ ์์
- Spawned: ๋ก๋๋ ํ ํฐ์ด ์คํฐ๋ ๊ฒฝ์ฐ์๋ง AI ์ปจํธ๋กค๋ฌ ์์
- Placed In World Or Spawned: ํฐ์ ์์ฑ๋ ๋๋ง๋ค AI ์ปจํธ๋กค๋ฌ์ ์ํด ์๋์ผ๋ก ์์
3. NavMeshBoundsVolume
NavMeshBoundsVolume๋ AI๊ฐ ์์ง์ผ ์ ์๋ ์์ญ์ด๋ค. ๋งต์ ์ ์ฒด๋ฅผ ๊ฐ์ธ๋๋ก ์์น์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ์ด๋ก์ ์์ญ ์์์ AI๊ฐ ์์ง์ด๊ฒ ๋๋ค.
์ถ๊ฐ๋ก ๋ค์๊ณผ ๊ฐ์ด Static Mesh์ ๋ด๋ถ์ธ๋ฐ๋ ์ํ์ง ์์ ๊ณณ๊น์ง NavMesh๊ฐ ์๊ธฐ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. Static Mesh๋ Collision์ด๋ Blocking Volume์ ์ด์ฉํ์ฌ Blocking์ด ์ค์ ๋ ์ํ์ด๋ค. ๊ทธ๋ฐ๋ฐ ์ ์ฐจ๋จ๋์ง ์๊ณ NavMesh๊ฐ ์๊ฒผ์๊น?
Collision๊ณผ Blocking Volume์ ๋ด๋ถ๋ผ๋ ๊ฐ๋ ์ด ์๊ณ ์ฐจ๋จ ๋ฉด์ด๋ค. ์ฆ, ๋ด๋ถ๋ ๋น์ด์๋ค. ๊ทธ๋์ ์ถ๊ฐ ์์ ์ด ํ์ํ๋ค.
1) MinRegionArea
NavMesh์ MinRegionArea ๊ฐ์ ์์ ํ๋ฉด, NavMesh ๋ด ์ฐ๊ฒฐ๋์ง ์์ ์์ ์์ญ๋ค ์ค ์ด ๊ฐ๋ณด๋ค ์์ ๊ฐ์ ์ ๊ฑฐํ ์ ์๋ค. ๊ทธ๋ฌ๋ ์ผ๋ถ ์ง์ญ์ ์ ๊ฑฐ๋์ง ์์ ์ ์๋ค. NavMesh๋ ํ์ผ ๊ทธ๋ฆฌ๋๋ก ๋ณ๋ ฌ๋ก ์ ์๋๋๋ฐ, ์์ญ์ด ํ์ผ ๊ฒฝ๊ณ์ ๊ฑธ์ณ ์์ผ๋ฉด ๊ทธ ์์ญ์ด ์ ๊ฑฐ๋์ง ์๋๋ค.
2) NavModifierVolume
NavModifierVolume์ ๋ฐฐ์นํ ํ NavArea_Null๋ก ์ค์ ํ๋ค. MinRegionArea๋ก ํด๊ฒฐ๋์ง ์์ ์์ญ์ NavModifierVolume์ผ๋ก ์ ๊ฑฐํ๋ฉด ๋๋ค.
4. ๋ธ๋๋ณด๋
๋ธ๋๋ณด๋๋ AI์ ๋๋ ์ญํ ์ ํ๋ฉฐ AI๊ฐ ์์์ผ ํ๋ ๋ชจ๋ ์์๋ ๋ธ๋๋ณด๋ ํค๋ฅผ ํตํด ์ฐธ์กฐํ ์ ์๋ค.
ํ๋ ์ด์ด ํธ๋ํน์ ์ํ ๋ธ๋๋ณด๋ ํค๋ฅผ ์ถ๊ฐํ๋ค.
- EnemyActor: ํ๋ ์ด์ด
- HasLineOfSight: AI๊ฐ ํ๋ ์ด์ด์ ๋ํ ์์ผ๋ฅผ ํ๋ณดํ๋์ง ์ฌ๋ถ๋ฅผ ํธ๋ํน ํ๋ ๋ฐ ์ฌ์ฉํ๋ค.
- PatrolLocation: AI๊ฐ ํ๋ ์ด์ด๋ฅผ ์ถ๊ฒฉํ๋ ์ค์ด ์๋ ๋ ์ด๋ ๊ฐ๋ฅํ ๋ ๋ฒจ ๋ด ์์น๋ฅผ ํธ๋ํน ํ๋ ๋ฐ ์ฌ์ฉํ๋ค.
5. ๋นํค์ด๋น์ด ํธ๋ฆฌ
๋นํค์ด๋น์ด ํธ๋ฆฌ๋ AI๊ฐ ์ง์ ํ ์คํ ์ดํธ์ ๋ ์ด์์์ ๊ตฌ์ฑํ๋ค.
๊ทธ๋ํ์์ ๋ฃจํธ๋ฅผ ๋๋๊ทธํ๋ฉด ์ปดํฌ์ง ๋ ธ๋๋ฅผ ์ถ๊ฐํ ์ ์๋ค. ์ปดํฌ์ง์ ํ๋ฆ ์ ์ด์ ํํ์ด๋ฉฐ ์ฐ๊ฒฐ๋ ์์ ๋ถ๊ธฐ์ ์คํ ๋ฐฉ์์ ๊ฒฐ์ ํ๋ค.
- ๋ ํฐ(Selector): ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ถ๊ธฐ๋ฅผ ์คํํ๋ฉฐ, ๋ณดํต์ ๋ณต์์ ์๋ธํธ๋ฆฌ ์ค ํ๋๋ฅผ ์ ํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
- ์ํ์ค(Sequence): ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ถ๊ธฐ๋ฅผ ์คํํ๋ฉฐ, ๋ณดํต์ ๋ณต์์ ์์์ ์์๋๋ก ์คํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
- ๋จ์ ๋ณ๋ ฌ(Simple Parallel)
์ด์ ๋นํค์ด๋น์ด ํธ๋ฆฌ์ ํ๋ ์ ์ํฌ๋ฅผ ๊ตฌํํ ๊ฒ์ด๋ค. ๋ ธ๋์ ์ฐ์ธก ์๋จ ์ซ์๋ ์คํ ์์๋ฅผ ๋ํ๋ธ๋ค. ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ, ์์์ ์๋๋ก ์คํ๋๊ธฐ ๋๋ฌธ์ ๋ ธ๋์ ๋ฐฐ์ด์ด ์ค์ํ๋ค. ๋ณดํต AI์๊ฒ ์ค์๋๊ฐ ๋์ ์ก์ ์ ์ผ์ชฝ์ ๋ฐฐ์นํ๊ณ ๋ ์ค์ํ ์ก์ ์ ์ค๋ฅธ์ชฝ์ ๋ฐฐ์นํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค. ์์ ๋ถ๊ธฐ ์ค ํ๋๋ผ๋ ์คํจํ๋ฉด ์ ์ฒด ๋ถ๊ธฐ๊ฐ ์คํ์ ์ค์งํ๊ณ ํธ๋ฆฌ๋ฅผ ๊ฑฐ์ฌ๋ฌ ๋ค์ ์ฌ๋ผ๊ฐ๋ค.
- AI Root: ์ค์ ๋ฃจํธ๋ก์ ์์ ๋ถ๊ธฐ ์ฌ์ด๋ฅผ ์ ํํ๋ค.
- Chase Player: ํ๋ ์ด์ด ๋ฐฉํฅ์ผ๋ก ํ์ ํ ๋ค์, ์ด๋ ์๋๋ฅผ ๋ณ๊ฒฝํ๊ณ , ํ๋ ์ด์ด๋ฅผ ์ถ๊ฒฉํ๊ธฐ ์ํด ์ด๋ํ๋ ์ํ์ค์ด๋ค.
- Rotate to Face BBEntry: Enemy Actor(ํ๋ ์ด์ด) ๋ฐฉํฅ์ผ๋ก ํ์ ํ๋ ํ์คํฌ์ด๋ค.
- BTT_ChasePlayer: ํ๋ ์ด์ด๋ฅผ ์ถ๊ฒฉํ ์ ์๋๋ก ์ด๋ ์๋๋ฅผ ๋ณ๊ฒฝํ๋ ์ปค์คํ ํ์คํฌ์ด๋ค.
- Move To: EnemyActor(ํ๋ ์ด์ด)๋ฅผ ํฅํด ์ด๋ํ๋๋ก ์ง์ํ๋ ํ์คํฌ์ด๋ค.
- Patrol: ๋งต์์ ๋๋ค ์์น๋ฅผ ์ฐพ์ ์ด๋ํ๊ณ , ๊ทธ ์์น์์ ์ ์ ๋๊ธฐํ๋ค๊ฐ, ๋ค์ ์๋ก์ด ์์น๋ฅผ ์ฐพ์ ์์ง์ด๋ ์ํ์ค์ด๋ค.
- BTT_FindRandomPatrol: PatrolLocation(๋๋ค ์์น)๋ฅผ ์ฐพ๋ ์ปค์คํ ํ์คํฌ์ด๋ค.
- Move To: PatrolLocation(๋๋ค ์์น)์ผ๋ก ์ด๋ํ๋๋ก ์ง์ํ๋ ํ์คํฌ์ด๋ค.
- Wait: PatrolLocation(๋๋ค ์์น)์์ 3~5์ด ๋์ ๋๊ธฐํ๋ค.
- Wait: Chase Player, Patrol ๋ชจ๋ ์คํจํ์ ๋ ๋๊ธฐํ๋ค.
์ปค์คํ ํ์คํฌ ๊ตฌํ์ ์ธ๋ฆฌ์ผ ๊ณต์ ๋ฌธ์ ์ฐธ๊ณ
์ถ๊ฐ๋ก BTT_FindRandomPatrol ๊ตฌํ ์ PatrolLocation ๊ฐ ์ค์ ์ด ์ ๋์ง ์์ ์ฐพ์๋ณด๋ Make Blackboard Key๋ฅผ ์ฌ์ฉํด์ผ ์ ๋์ํ๋ค. ๊ณต์ ๋ฌธ์๊ฐ ์ค๋๋์ด ์ฌ์ฉํ์ง ์๋ ํจ์๋ก ์๋ ค์ฃผ๋ ๋ฏํ๋ค.
6. AI ์ปจํธ๋กค๋ฌ ๊ตฌํ
์ด์ AI ์ปจํธ๋กค๋ฌ ์์์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๊ตฌ์ฑํ์ฌ ๋นํค์ด๋น์ด ํธ๋ฆฌ์ ์ด๋ค ๋ถ๊ธฐ๋ก ์ง์ ํ ์ง ๊ฒฐ์ ํด์ผ ํ๋ค.
๋จผ์ , ๋น์๋ ๋ ์ด์ ์ ์์ฑํ ๋นํค์ด๋น์ด ํธ๋ฆฌ๋ฅผ ์คํํ ์ ์๊ฒ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ปดํฌ๋ํธ ์ฐฝ์์ AI ํผ์ ์ ์ปดํฌ๋ํธ๋ฅผ ์ถ๊ฐํ๋ค. ์ด ์ปดํฌ๋ํธ๋ AI ํผ์ ์ ์์คํ ์์ ์๊ทน ๋ฆฌ์ค๋๋ฅผ ์์ฑํ๊ณ ์ฌ์ฉ์๊ฐ ๋ฐ์ํ๋๋ก ๋ฑ๋ก๋ ์๊ทน์ ์์งํ๋ ๋ฐ ์ฌ์ฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ ํตํด AI๊ฐ ํ๋ ์ด์ด๋ฅผ ๋ณด๊ณ ๋ฐ์ํ๋๋ก ๊ตฌ์ฑ์ด ๊ฐ๋ฅํ๋ค.
- AI ์์ผ ๊ตฌ์ฑ ์ถ๊ฐ
- ์์ ๊ฐ์ง(Detection by Affiliation): ๊ฐ์ ์์ ํ์๋ค๊ณผ ํจ๊ป ์๋ ํ์๋ค์ ๊ณต๊ฒฉํ๋ ํ ๊ธฐ๋ฐ AI๋ฅผ ๊ตฌ์ฑํ ์ ์๋ค. ์กํฐ๋ ๋ํดํธ๋ก ์์์ด ํ ๋น๋์ง ์์ ์ค๋ฆฝ์ผ๋ก ๊ฐ์ฃผ๋๋ค.
- ์ค๋ฆฝ ํ์ง(Detect Neutrals) ํ์ฑํ: ํ์ฌ ๋ธ๋ฃจํ๋ฆฐํธ๋ฅผ ํตํด ์์์ ํ ๋นํ ์ ์์ด ์ค๋ฆฝ ํ์ง ํ๋๊ทธ๋ฅผ ํ์ฑํํ๊ณ ์กํฐ ํ๊ทธ ์ง์ ์ ๋์ ์ฌ์ฉํ์ฌ ํ๋ ์ด์ด๋ฅผ ํ๋จํ ๊ฒ์ด๋ค.
์ด์ On Target Perception Updated ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํ์ฌ ํ๋ ์ด์ด๋ฅผ ๊ฐ์งํ๊ณ , ๋ธ๋๋ณด๋์ ํค ๊ฐ๋ค์ ์ ๋ฐ์ดํธํด์ผ ํ๋ค.
์ด๋ฒคํธ ๊ทธ๋ํ ๊ตฌํ์ ์ธ๋ฆฌ์ผ ๊ณต์ ๋ฌธ์ ์ฐธ๊ณ
AI๊ฐ ํ๋ ์ด์ด๋ฅผ ๊ฐ์งํ๊ธฐ ์ํด ํ๋ ์ด์ด ๋ธ๋ฃจํ๋ฆฐํธ ํด๋์ค์์ Tag๋ฅผ ์ค์ ํ๋ค.
๋ง์ง๋ง์ผ๋ก ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๊ตฌ์ฑํด์ผ ํ๋ค. ์ฌ๊ธฐ์ ๋ฐ์ฝ๋ ์ดํฐ๋ ์กฐ๊ฑด์ ์๋ธ ๋ ธ๋๋ก ๋ค๋ฅธ ๋ ธ๋์ ๋ถ์ด ํธ๋ฆฌ์ ๋ถ๊ธฐ๋ ๋จ์ผ ๋ ธ๋์ ์คํ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค.
BT_Enemy๋ฅผ ์คํํ์ฌ Chase Player๋ฅผ ์ฐํด๋ฆญํ๊ณ ๋ฐ์ฝ๋ ์ดํฐ ์ถ๊ฐ์์ Blackboard๋ฅผ ์ ํํ๋ค. ๊ทธ ํ ์๋์ ๊ฐ์ด ์ค์ ํ๋ฉด, HasLineOfSight ๊ฐ์ด Is Set(true)์ธ ๊ฒฝ์ฐ Chase Player ๋ถ๊ธฐ๋ฅผ ์คํํ๊ฒ ๋๋ค.
7. ์๋ฃ
์ ์บ๋ฆญํฐ์ ์์ผ์ ๋ค์ด์ค๋ฉด ๋ฐ๋ผ์ค๊ฒ ๋๋ค.
์ ์บ๋ฆญํฐ์ ์ ๋๋ฉ์ด์ ์ ์ถ๊ฐํ๋ฉด ๋ ์์ฐ์ค๋ฝ๊ฒ ๋ณด์ผ ๊ฒ์ด๋ค.
์ฐธ๊ณ
https://docs.unrealengine.com/5.0/ko/behavior-tree-in-unreal-engine---quick-start-guide/
๋นํค์ด๋น์ด ํธ๋ฆฌ ํต ์คํํธ ๊ฐ์ด๋
์ด ๊ฐ์ด๋์์๋ ์์ฐฐํ๊ฑฐ๋ ํ๋ ์ด์ด๋ฅผ ์ถ๊ฒฉํ๋ AI ์บ๋ฆญํฐ๋ฅผ ๋นํค์ด๋น์ด ํธ๋ฆฌ๋ก ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ์์๋ด ๋๋ค.
docs.unrealengine.com