๐ค Behavior Tree๋ฅผ ์ฌ์ฉํด์ ์ง์ AI๋ฅผ ๊ตฌํํด๋ณด์.
์ด๋ฒ ํฌ์คํ ์์๋ AI์๊ฒ ํจํธ๋กค ๊ธฐ๋ฅ์ ์ถ๊ฐํด๋ณด๊ฒ ์ต๋๋ค.
์ค๋ช
์ ํธ์๋ฅผ ์ํด์
ํ๋ํธ๋ฆฌ (Behavior Tree)๋ ์์ผ๋ก BT๋ก,
๋ธ๋๋ณด๋ (Black Board)๋ ์์ผ๋ก BB๋ก,
AI Controller๋ AIC๋ผ๊ณ ๋ถ๋ฅผ ์์ ์
๋๋ค.
Ali Elzoheiry๋์ Smart AI ๊ฐ์ ์์์ ๋ณด๋ฉด์ ๊ณต๋ถํ์์ต๋๋ค.
์๋ฆฌ์ฆ์ ์์ด ๋ง์ง๋ง ์ ๋ฆฌ๊ฐ ์์ฃผ ์ ๋์ด ์์ผ๋ ํ๋ฒ์ฉ ์์ฒญ์ ์ถ์ฒ๋๋ฆฝ๋๋ค.
AI๊ฐ ํน์ ํฌ์ธํธ๋ฅผ ๋ฐ๋ผ์ ์์ง์ด๊ธฐ ์ํด์ Spline Route๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
Blueprint Class๋ฅผ Acotr๋ก ํ๋ ์์ฑํด์ฃผ์ธ์.
์ด๋ฆ์ Patrol Route๋ผ๊ณ ์ด๋ฆ ์ง์ด ์ฃผ๊ฒ ์ต๋๋ค.
์ปดํฌ๋ํธ ์ฐฝ์์ Add๋ฅผ ๋๋ฅด๊ณ Spline์ ๊ฒ์ํด์ ์ถ๊ฐํด์ฃผ์ธ์.
์๋์ BP_PatrolRoute ์กํฐ๋ฅผ ๋ฐฐ์นํด์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณ ๊ฐ ํฐ์ ์ ์ก๊ณ Alt๋ฅผ ๋๋ฅธ ์ํ๋ก ๋ง์ฐ์ค ๋๋๊ทธ๋ฅผ ํตํด ์์ง์ผ ๊ฒฝ๋ก๋ฅผ ์์ฑํด์ค ์ ์์ต๋๋ค.
์ ๋ ์๋์ฒ๋ผ ๋ง๋ค์ด ์คฌ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ Integer ํ์
์ผ๋ก PatrolIndex์ Direction์ ์ถ๊ฐํด์ฃผ์ธ์.
Direction์ ๊ฐ ๋ฒ์๋ฅผ -1 ~ 1๋ก ์ค์ ํ์๊ณ ๋ํดํธ๋ฅผ 1๋ก ํด์ฃผ์ธ์.
AI๊ฐ ์ด๋ค ํฌ์ธํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ง์ผ์ง์ ๋ํด์ Index๋ฅผ ์ง์ ํด์ฃผ๋ ๋ก์ง์ ๋๋ค.
Partrol Index๋ฅผ ๊ธฐ์ค์ผ๋ก 1์นธ์ฉ ์ ์งํ๋ ๋ก์ง์ ํ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ Spline์ ๋ง์ง๋ง ์ง์ ์ ๋์ฐฉํ์ ๊ฒฝ์ฐ์ ๋ํ ๋ก์ง์ ์์ฑํด์ฃผ๊ฒ ์ต๋๋ค.
Branch๋ก ์ด์ด ์ฃผ์ธ์.
๋ง์ง๋ง ์ง์ ์ ๋์ฐฉํ์ ๋ Direction์ -1๋ก ์ธํ
ํด์ฃผ์ธ์.
๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ๋์๊ฐ๋ค๋ ๋ป์
๋๋ค.
๋ฐ๋๋ก Patrol Index๊ฐ 0์ธ ๊ฒฝ์ฐ์๋ 1๋ก ์ธํ
ํด์ฃผ์ด์ผ ํฉ๋๋ค.
์ ๋ก์ง์ ์์ Branch์ False์ ์ด์ด ์ฃผ๊ฒ ์ต๋๋ค.
์ ์ฒด ๋ธ๋ฃจํ๋ฆฐํธ๋ ์๋์ ๊ฐ์ต๋๋ค.
Get Spline Point As World Position์ผ๋ก ํจ์๋ฅผ ํ๋ ์์ฑํด์ฃผ์ธ์.
์ฐ๋ฆฌ๋ Spline Point์ World Location์ ๋ฐํํด์ฃผ์ด์ผ AI๊ฐ ํด๋น ์ขํ๋ก ์์ง์ด๋ผ๋ ๋ช ๋ น์ ๋ด๋ฆด ์ ์์ต๋๋ค.
Output์์ Vector๋ฅผ ๋ฐํํด์ฃผ๋ Location ๋ฆฌํด๊ฐ์ ์์ฑํด์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณ Spline์ Get์ผ๋ก ๊ฐ์ ธ์ค์๊ณ , Get Location at Spline Point ๋
ธ๋๋ฅผ ์ถ๊ฐํด์ฃผ์ธ์.
Point Index์๋ Patrol Index๋ฅผ ๋ฃ์ด ์ฃผ์ธ์.
Coordinate Space๋ World๋ก ๋ณ๊ฒฝํด์ฃผ์ธ์.
์ฐ๋ฆฌ๋ Patrol Index๋ฅผ ํตํด์ ๋ช ๋ฒ์งธ ํฌ์ธํธ๋ฅผ ์ง๋๊ฐ๋์ง ์ ์ ์์ต๋๋ค.
์ด Index๋ฅผ ์ฌ์ฉํด์ ํด๋น ์ง์ ์ Spline Point ์ขํ๋ฅผ ๋ฐํํด์ฃผ๋ ๊ฒ๋๋ค.
โ์ปดํ์ผ ์ ์ฅโํด์ฃผ์ธ์.
์ ํฌ๋ AI๊ฐ Patrol Route๋ฅผ ๊ฐ์ง๊ธธ ์ํฉ๋๋ค.
์ด๋ ์ค์ ๊ฒ์์์ ์ฌ๋ฌ Patrol Route๊ฐ ์์ ๊ฒ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ AI๋ง๋ค ๋ค๋ฅธ Patrol Route๊ฐ ํ ๋น๋๊ฒ ์ฃ ?
์ด๋ ๋ชจ๋ AI๋ง๋ค ํจ์๋ฅผ ์์ฑํด์ ์ด๋ค Patrol Route๋ฅผ ๊ฐ์ง๊ณ ์๋์ง๋ฅผ ๋ฐํํด์ฃผ๋ ค๋ฉด ๋งค์ฐ ๋ฒ๊ฑฐ๋ก์ด ์์ ์ด ๋ ๊ฒ๋๋ค.
์ฌ๊ธฐ์ Blueprint Interface๋ฅผ ์ฌ์ฉํ์ฌ ํธ์์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
๋ธ๋ฃจํ๋ฆฐํธ ์ธํฐํ์ด์ค ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ณตํต๋ ๋ฐฉ๋ฒ์ผ๋ก ํน์ ํจ์์ฑ์ ๋ชจ๋ ๊ณต์ ํ๋ ๋ค์์ ์์ดํ ์ค๋ธ์ ํธ ์ ํ๊ณผ์ ์ํธ์์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
BPI ๊ณต์ ๋ฌธ์
์ดํ๋ถํฐ BPI๋ผ๊ณ ์ค์ฌ์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
์ฐํด๋ฆญ - Blueprint - Blueprint Interface๋ฅผ ์ ํํด์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณ BPI_Enemy๋ผ๊ณ ์ง์ด ์ฃผ๊ฒ ์ต๋๋ค.
๋ค์ด๊ฐ๋ฉด ํํ ํ๋ฉด์ด ์์ต๋๋ค.
์ฌ๊ธฐ์ Add๋ฅผ ๋๋ฌ GetPatrolRoute ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณ ํด๋น ํจ์๋ฅผ ํด๋ฆญํด์ Output์ ์ถ๊ฐ ํด์ฃผ๊ฒ ์ต๋๋ค.
์ฌ์ง์์ ์ถ๊ฐ ๋ฒํผ์ด ๊ฐ๋ ค์ก์ง๋ง ์ถ๊ฐ๋ฒํผ์ ๋๋ฌ์ฃผ์ธ์.
PatrolRoute๋ผ๊ณ ์ด๋ฆ ์ง์ด ์ฃผ์๊ณ , BP Patrol Route๋ฅผ ๊ฒ์ํด์ Object Reference๋ฅผ ํ์
์ผ๋ก ๋ฃ์ด ์ฃผ์ธ์.
๊ทธ๋ฌ๋ฉด ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๊ฒ ๋ ํจ์๊ฐ ์์ฑ๋ฉ๋๋ค.
โ์ปดํ์ผ ์ ์ฅโํด์ฃผ์ธ์.
BP_Enemy๋ก ์ด๋ํ๊ฒ ์ต๋๋ค.
Class Settings๋ฅผ ์ ํํด bpi๋ฅผ ๊ฒ์ํด์, BPI Enemy AI๋ฅผ ์ถ๊ฐํด์ฃผ์ธ์.
๊ทธ๋ฌ๋ฉด ์ข์ธก My Bluieprint ํญ์ INTERFACES ์น์ ์ ๋ณด๋ฉด Get Patrol Route๊ฐ ์์ฑ๋์ด ์์ต๋๋ค.
์ ๋ ์ถํ ์ค์ตํ ์ด๋ ์๋ ๋ณ๊ฒฝ ํจ์๊ฐ ์์ด์ 2๊ฐ๊ฐ ๋ํ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ PatrolRoute๋ผ๋ ์ด๋ฆ์ ๋ณ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณ BP Patrol Route๋ฅผ ํ์
์ผ๋ก ๋ฃ์ด ์ฃผ์๊ณ , public์ผ๋ก ํด์ฃผ์ธ์.
๋ ๋ชจ์์ด ๋ฌ ์ํ์ฌ์ผ ํฉ๋๋ค.
Interface์ Get Patrol Route๋ฅผ ๋๋ธํด๋ฆญํ์๋ฉด ํจ์ ์์ฑ ์ฐฝ์ผ๋ก ๋์ด๊ฐ๋๋ค.
๊ฑฐ๊ธฐ์ ๋ฐํ๊ฐ์ ๋ฐฉ๊ธ ์์ฑํ PatrolRoute๋ณ์๋ฅผ ๋ฃ์ด ์ฃผ์ธ์.
โ์ปดํ์ผ ์ ์ฅโํด์ฃผ์ธ์.
์ด์ BT์์ ํจํธ๋กค์ ์ํ ์ปค์คํ ํ์คํฌ๋ฅผ ์์ฑํด์ฃผ์ด์ผ ํฉ๋๋ค.
BTT_MoveAlongPatrolRoute๋ฅผ ์์ฑํด์ฃผ์ธ์.
Execute ์คํ ๋ ธ๋ ์์ ์ถ๊ฐํด์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณ Controlled Pawn์์ ๋์ด์ Get Patrol Route ๋
ธ๋๋ฅผ ์ถ๊ฐํด์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณ Is Valid ๋
ธ๋๋ฅผ ์ถ๊ฐํด์ Patrol Route๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ์๋ง ๋ก์ง์ด ์คํ๋๊ฒ ํด์ฃผ๊ฒ ์ต๋๋ค.
Is Valid๋ฅผ ๊ฒ์ํ๋ฉด ์ฌ๋ฌ๊ฐ๊ฐ ์์ผ์ค ํ
๋ฐ ์ฌ๊ธฐ์๋ ํ์์ ๋ฌผ์ํ๊ฐ ์๋๊ฑธ ์ ํํด์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณ Patrol Route๋ฅผ ๋์ด์ Get Spline Point as World Position ๋
ธ๋๋ฅผ ์ถ๊ฐํด์ฃผ์ธ์.
Is Valid์ธ ๊ฒฝ์ฐ์ ํ๋ฆ ์ฐ๊ฒฐํด์ฃผ์ธ์.
AI MoveTo๋ฅผ ์ถ๊ฐํด์ ๊ฐ์ ์ด์ด ์ฃผ๊ฒ ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ Pawn๊ฐ์ ์ด์ด์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณ ์ด๋์ ํ์ผ๋ ๋ค์ ์ด๋ ์ขํ๋ก ๊ณ์ฐ์ ํด์ฃผ์ด์ผ๊ฒ ์ฃ ?
์ฐ๋ฆฌ๊ฐ ์์ฑํ Increment Patrol Route ํจ์๋ฅผ ์ถ๊ฐํด์ค์๋ค.
์ฑ๊ณต, ์คํจ ๋ชจ๋ ๊ฒฝ์ฐ ํ๋ฆ ์ด์ด ์ฃผ์๊ณ , Finish Execute์ ์ฐ๊ฒฐํ๋ฉด ๋์
๋๋ค.
โ์ปดํ์ผ ์ ์ฅโํด์ฃผ์ธ์.
์ด์ AI๊ฐ Patrol Route๋ฅผ ๊ฐ์ง๊ณ ์๋์ง ์๋์ง๋ฅผ ๊ฒ์ฌํ๋ Decorator๋ฅผ ๋ง๋ค์ด ์ค์๋ค.
๋ ํ๋๋๋ก BlueprintBase๋ก ๋ง๋ค์ด ์ฃผ์ธ์.
BTD_HasPatrolRoute๋ก ์ด๋ฆ ์ง์ด ์ฃผ์ธ์.
์ปจ๋์
์ฒดํฌ๋ก ์ค๋ฒ๋ผ์ด๋ ํด์ฃผ์๊ณ
Get Patrol Route๋ฅผ ๋
ธ๋ ์ถ๊ฐํด์ Is Valid์ธ ๊ฒฝ์ฐ์ bool๊ฐ์ ๋ฐํํ๋๋ก ํด์ฃผ๊ฒ ์ต๋๋ค.
์ฌ๊ธฐ์ Is Valid๋ ์ด๋ก์ f๋ก ์ ํํด์ฃผ์ธ์.
โ์ปดํ์ผ ์ ์ฅโํด์ฃผ์ธ์.
์์๋ก ๋ค๋ฅธ ์ฐ๊ฒฐ์ ๋์ด ์ฃผ๊ฒ ์ต๋๋ค.
ํ ์คํธ์ฉ์ผ๋ก ์ ๋จ๊ณ๋ฅผ ๋ฐ๋ผ์ ์์ฑํด์ฃผ์ธ์.
์กํฐ์ ๋ฐฐ์น๋ BP_Enemy๋ฅผ ์ ํํด์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณ Details์์ Patrol์ด๋ผ๊ณ ๊ฒ์ํด์ฃผ๋ฉด ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์นํ Patrol Route๋ฅผ ํ ๋นํด์ค ์ ์์ต๋๋ค.
์ ๋ ์๋ ์ฌ์ง๊ณผ ๊ฐ์ด ๋ฐฐ์น ๋์ด ์๊ตฌ์.
ํ๋ ์ด ํด๋ณด๊ฒ ์ต๋๋ค.
์ ๋ฐ ๋๋ผ ๐
๋คํ์ ๋๋ค.
ํจํธ๋กค ๊ธฐ๋ฅ์ ๋ฌด์ฌํ ๊ตฌํ์ ํด์ ๋คํ์ ๋๋ค.
Behavior Tree๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํ๋ ๊ฒ์ ์ฌ๊ธฐ์ ๊ธฐ ์๋ค ๊ฐ๋ค ํด์ ๋ง์ด ๋ณต์กํ๊ณ ํ๊ฐ๋ฆฌ์ค ๊ฒ๋๋ค.
๋ค์ ํฌ์คํ ์๋ ์ ๋๋ฉ์ด์ ์ถ๊ฐ์ Enum์ ์ฌ์ฉํ ์ํ๊ตฌ๋ถ์ผ๋ก BT๋ฅผ ๊น๋ํ๊ฒ ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค.