๐ค Behavior Tree๋ฅผ ์ฌ์ฉํด์ ์ง์ AI๋ฅผ ๊ตฌํํด๋ณด์.
์ด๋ฒ ํฌ์คํ
์์๋ AI๋ฅผ ์ฅ์ฐฉํ ์ ์ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค.
์ฐ์ ์ ์บ๋ฆญํฐ๋ฅผ ๋ง๋ค๊ณ , ํ๋ ์ด์ด๋ฅผ ๋ฐ๋ผ๊ฐ ํ ๊ณต๊ฒฉํ๋ ๋ถ๋ถ๊น์ง ๊ตฌํ์ ํ๊ฒ ์ต๋๋ค.
Ali Elzoheiry๋์ Smart AI ๊ฐ์ ์์์ ๋ณด๋ฉด์ ๊ณต๋ถํ์์ต๋๋ค.
์๋ฆฌ์ฆ์ ์์ด ๋ง์ง๋ง ์ ๋ฆฌ๊ฐ ์์ฃผ ์ ๋์ด ์์ผ๋ ํ๋ฒ์ฉ ์์ฒญ์ ์ถ์ฒ๋๋ฆฝ๋๋ค.
์ฐ์ ์ ์บ๋ฆญํฐ๋ฅผ ๋จผ์ ์์ฑํ๊ฒ ์ต๋๋ค.
Blueprint๋ฅผ Character๋ก ์์ฑํด์ฃผ์ธ์.
Skeltal Mesh๋ ์ธ๋ฆฌ์ผ5์ ๊ธฐ๋ณธ ์ ๊ณต ๋ง๋คํน์ ์ฌ์ฉํด์ฃผ์ธ์.
์ ๋ SKM_Manny๋ฅผ ์ฌ์ฉํ์์ต๋๋ค.
Transform๋ฅผ ์กฐ์ ํ์ฌ ์บ๋ฆญํฐ ์์น๋ฅผ ์ก์์ฃผ์๊ณ ,
์บ๋ฆญํฐ๋ฅผ ์ํ ABP๋ฅผ ๋ง๋๋ ๊ฒ์ ๋๋ฌด ํ๋ญ๋๋ค.
์ด๋ฏธ ์์ฑ๋์ด ์๋ ๊ธฐ๋ณธ ABP_Manny๋ฅผ ์์ ํด์ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
ABP_Manny๋ฅผ ์ฐพ์์ ๋ณต์ฌ ํ ABP_Enemy๋ก ์ง์ด์ฃผ๊ฒ ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ถํ ์ฌ์ฉํ AIํด๋๋ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋๊ฒ ์ต๋๋ค.
AI_Move๋ฅผ ์ฌ์ฉํด์ ์บ๋ฆญํฐ๋ฅผ ์กฐ์ํ๋ฉด ๊ธฐ๋ณธ ์ ๊ณต๋ ABP_Manny์์๋ ํด๋น ์ด๋์ ๊ฐ์งํ์ง ๋ชปํ๋ค๊ณ ํฉ๋๋ค.
์บ๋ฆญํฐ๊ฐ ์์ง์ด๋๋ฐ ์ ์์ธ๋ก ์์ง์ด๋ ๋ฒ๊ทธ๊ฐ ๋ํ๋ฉ๋๋ค.
ํด๋น ์ค๋ฅ๋ฅผ ์์ ํ๊ธฐ ์ํด์ ABP_Enemy์ Event Graph๋ฅผ ์์ ํด์ฃผ๊ฒ ์ต๋๋ค.
Cast to BP_Enemy ๋ ธ๋๋ฅผ ์ถ๊ฐํด์ค ๋ค Sequence์ 1๋ฒ ์ถ๋ ฅ์ ๋ณ๊ฒฝํด์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณ Call Failed๋ฅผ ๊ธฐ์กด ํ๋ฆ๊ณผ ์ด์ด์ค๋๋ค.
์ฐ์ธก์์ Ground Speed์ Greater ๋ ธ๋์์ Should Move ๋ ธ๋๋ฅผ ์ถ๊ฐ๋ก ์์ฑํด์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณ Cast to BP_Enemy์ ํ๋ฆ์ ์๋กญ๊ฒ ์ถ๊ฐํ Should Move ๋
ธ๋์ ์ฐ๊ฒฐํด์ฃผ๋ฉด ๋์
๋๋ค.
โ์ปดํ์ผ ์ ์ฅโํด์ฃผ์ธ์.
Tree๋ผ์ ๋๋ฌด ์ด๋ชจ์ง ๋ฃ์์ต๋๋ค.
์ด์ ์ ์์ฑํ AIํด๋์ Behavior Tree ํด๋๋ฅผ ์ถ๊ฐ๋ก ์์ฑํด์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณ Behavior Tree์ Black Board๋ฅผ ๊ฐ๊ฐ ์์ฑํด์ฃผ์ธ์.
์์ธํ ๋ด์ฉ์ ๋ฐ๋ก ํฌ์คํ ํ๊ฒ ์ง๋ง ๊ฐ๋จํ๊ฒ ์ค๋ช ํ์๋ฉด,
Behavior Tree๋ ์บ๋ฆญํฐ์ ํ๋ ํจํด์ ๋ํด์ ๊ตฌํ์ ํ๊ณ
Black Board๋ ํ๋์ ์ ์ดํ๊ธฐ ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์ญํ ๋ก AI์ '๋'๋ผ๊ณ ์๊ฐํ์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
BT_Enemy์ ๋ค์ด๊ฐ์๋ฉด ์๋์ ๊ฐ์ ํ๋ฉด์ด ๋ณด์
๋๋ค.
Details์ ๋ค์ด๊ฐ์ ์์ฑํ BB_Enemy์ ์ฐ๊ฒฐํด์ฃผ์ธ์.
โBehavior Tree๋ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ํ๋ฆ์ด ํ๋ฌ ๊ฐ๋๋คโ
์ดํด๋ฅผ ๋๊ธฐ ์ํด์ ์ค์ ๋์๊ณผ๋ ๊ด๋ จ์๋ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์์ต๋๋ค.
์ ์ฌ์ง๊ณผ ๊ฐ์ ํ๋ํธ๋ฆฌ๊ฐ ์๋ค๊ณ ํ ๋, ์ข์ธก๋ถํฐ ํ๋ฆ์ด ํ๋ฌ๊ฐ A,B,C๊ฐ ์ฐจ๋ก๋๋ก ์คํ์ด ๋ฉ๋๋ค.
์๋์ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ ๊ตฌํํ๊ฒ ์ต๋๋ค.
์ด๋, ๊ณต๊ฒฉ์ ํ๊ธฐ ์ํด์๋ ๋์ ๋ชฉํ๊ฐ ์์ด์ผ ํฉ๋๋ค.
์ด๋ BlackBoard์์ Key๋ก ๋ฑ๋กํ์ฌ ์ฌ์ฉํด์ฃผ์ด์ผ ํฉ๋๋ค.
์ฐ์ธก ์๋จ์ BlackBoard๋ฅผ ๋๋ฌ BB๋ก ์ด๋ํด์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ข์ธก์์ New Key๋ฅผ ๋๋ฌ AttackTarget๋ฅผ Object๋ก ์์ฑํด์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณ ์ฐ์ธก์์ Key Type - Base Class๋ฅผ Actor๋ก ์ง์ ํด์ฃผ๊ฒ ์ต๋๋ค.
์ฌ๋ฌ ํ๋์ ์คํํ๊ธฐ ์ํด Sequence ๋
ธ๋๋ฅผ ์ถ๊ฐํด์ฃผ๊ฒ ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ํ์์ Move To ๋
ธ๋๋ฅผ ์์ฑํด์ฃผ์ธ์.
Move To๋
ธ๋๋ ์บ๋ฆญํฐ๊ฐ ์ฐ๋ฆฌ๊ฐ ์ค์ ํ ๊ฐ์ผ๋ก ์ด๋ํ๋๋ก ํด์ค๋๋ค.
Acceptable Radius๋ ํ์ฉ๋ฒ์์
๋๋ค.
์บ๋ฆญํฐ๊ฐ ์ด๋ํ ๋ ์บ๋ฆญํฐ์์ ์๋ ์ขํ๊ฐ ๋๊ฐ์ ์๋ ์๊ฒ ์ฃ ?
๊ทธ๋์ ํ์ฉ๋ฒ์๋ฅผ ์ง์ ํด์ฃผ๋ ๊ฒ๋๋ค.
์ ๋นํ 150์ผ๋ก ์ฃผ์์ต๋๋ค.
๋ํ Move To๋ฅผ ํ ๋์์ BlackBoard Key๋ก ์ง์ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
BB์์ ์์ฑํ AttackTarget์ผ๋ก ๋ณ๊ฒฝํด์ค์๋ค.
AttackTarget์ ์ง๊ธ ๋น ๊ป๋ฐ๊ธฐ์
๋๋ค.
์ค์ ๋ก ๊ฐ์ ํ ๋นํด์ฃผ์ด์ผ ํฉ๋๋ค.
AI Controller๋ฅผ ๋ง๋ค์ด ์ฃผ๊ฒ ์ต๋๋ค.
Blueprint Class๋ฅผ ์์ฑํด์ฃผ์ธ์.
Event On Possess ๋
ธ๋์์ ํ๋ฆ์ ์ด์ด ์ฃผ๊ฒ ์ต๋๋ค.
Run Behavior Tree ๋
ธ๋๋ฅผ ์ถ๊ฐํด์ BTAsset์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ BT_Enemy๋ก ์ฐ๊ฒฐํด์ฃผ์ธ์.
์ข์ธก์ My Blueprint์์ BlackBoard๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
์ค์ ์์ Show Inherited Variables๋ฅผ ์ฒดํฌํด์ผ ๋ณด์
๋๋ค.
๊ทธ๋ฆฌ๊ณ Set Value As ..๋ฅผ ์ฌ์ฉํด์ ์ฐ๋ฆฌ๊ฐ ์ค์ ์ ์ํ๋ ํ์
์ ๋ฃ์ด์ค ์ ์์ต๋๋ค.
Key Name์ ๊ฐ์ ์ด๊ธฐํ ํด์ฃผ๋ ค๋ BB์ KeyName์ ๋ฃ์ด ์ฃผ์ด์ผ ํฉ๋๋ค.
๋ณ์๋ก ๋ง๋ค์ด ์ฃผ์๊ณ ์ด๋ฆ์ Attack Target Key Name์ด๋ผ๊ณ ํด์ฃผ๊ฒ ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ปดํ์ผ ํ Default๊ฐ์ ์ค์ BB์ ๋์ผํ ์ด๋ฆ์ ๋ฃ์ด ์ฃผ์ด์ผ ํฉ๋๋ค.
์๋ ์ด๊ธฐํ ํด์ฃผ๋ ค๋ BB์ KeyName์ ๋ณต์ฌํด์,
์์ฑํ Key Name ๋ณ์์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ฃ์ด ์ฃผ๊ฒ ์ต๋๋ค.
๋งคํํ๋ค๊ณ ์๊ฐํด์ฃผ์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ AttackTarget์ ๋์์ ํ๋ ์ด์ด์ ์บ๋ฆญํฐ์
๋๋ค.
Get Player Character ๋ฃ์ด ์ฃผ์ธ์.
โ์ปดํ์ผ ์ ์ฅโํด์ฃผ์ธ์.
BP_Enemy์ AI Controller Class๋ฅผ ์ฐ๋ฆฌ๊ฐ ์์ฑํ AIC_Enemy๋ก ๋ณ๊ฒฝํด์ค๋๋ค.
Nav Mesh Bounds Volume์ ์ถ๊ฐํด์ฃผ์ด์ผ Nav Mesh๋ฅผ ๊ณ์ฐํด์ ์บ๋ฆญํฐ๊ฐ ์์ง์ผ ์ ์์ต๋๋ค.
์ถ๊ฐํ ํ AI๊ฐ ์์ง์ผ ๋งต ๋ฒ์๋ฅผ ๋ฎ์ด์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณ ์คํํ๋ฉด ํ๋ ์ด์ด๋ฅผ ๋ฐ๋ผ์ค๋๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
๊ฐ์์ ๊ฐ๋จํ ๊ณต๊ฒฉ๋ชจ์
์ ๋ชฝํ์ฃผ๋ก ๋ง๋ค์ด ์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณ BP_Enemy์์ Custom Event๋ฅผ ๋ง๋ค์ด์ฃผ๊ฒ ์ต๋๋ค.
์ ๋ Play Montage ๋
ธ๋๋ฅผ ์ฌ์ฉํ์์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋ชจ๋ AI์ ํ๋์ด ๊ตฌํ๋์ด ์์ง ์์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ํ๋ ์์
์ ์์ฑํด์ฃผ์ด์ผ ํฉ๋๋ค.
์๋จ์ New Task๋ฅผ ๋๋ฌ BTT_DefaultAttack์ด๋ผ๋ Task๋ฅผ ์๋ก ์์ฑํด์ฃผ๊ฒ ์ต๋๋ค.
Task์ ๋ค์ด์ค๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ 2๊ฐ์ ๋ ธ๋๋ฅผ ์ถ๊ฐํด์ฃผ์ธ์.
์ด๋ฒคํธ๋ฅผ ์คํํ๊ฒ ๋ค.
์คํ์ ์ข
๋ฃํ๋ค.
๋ฅผ ์๋ฆฌ๋ ๋
ธ๋์
๋๋ค.
Finish Execute์ Success๋ ์ฒดํฌํด์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณ Controlled Pawn์์ BP_Enemy๋ฅผ Castํด์ฃผ๊ณ Attack ์ด๋ฒคํธ๋ฅผ ํธ์ถํด์ค๋๋ค.
โ์ปดํ์ผ ์ ์ฅโํด์ฃผ์ธ์.
๋ค์ Behavior Tree๋ก ์ด๋ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ Btt_DefaultAttack ๋
ธ๋๋ฅผ ์ถ๊ฐํด์ฃผ์ธ์.
์ข์ฐ ํ๋ฆ์ ๋ฐ๋ผ Move To ์ฐ์ธก์ ๋ฃ์ด์ผ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์คํํด์ฃผ๋ฉด ๊ณต๊ฒฉ ๋ชจ์
์ด ๋์ค์ง ์์ต๋๋ค.
์ด๋ ์ ๋๋ฉ์ด์
์ ์๋ฃํ๊ธฐ ์ ์ ๋๋ฌด ๋น ๋ฅด๊ฒ ํ๋์ด ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ์
๋๋ค.
์์ฃผ ๊ฐ๋จํ๊ฒ๋ Wait๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๋๋ค.
์ ๋นํ 2.5์ด์ Wait๋ฅผ ๋ฃ์ด์ ๋ชจ์
์ด ๋๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋๊ธฐ ์๊ฐ์ ๋ฃ์ด ์ฃผ์์ต๋๋ค.
ํ์ง๋ง ๋ณ๋ก ์ข์ ๋ฐฉ๋ฒ์ ์๋๊ฒ ๊ฐ์ต๋๋ค.
์ ๋๋ฉ์ด์
์ด ์ข
๋ฃ๋๋ฉด Finish Execute๊ฐ ์คํ๋๋๋ก ํ๋ ๊ฒ์ด ๋ฐ๋์งํด ๋ณด์
๋๋ค.
BP_Enemy๋ก ์ด๋ํด์ ์๋์์ Event Dispatchers๋ฅผ ์ถ๊ฐํด์ฃผ๊ฒ ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ OnAttackEnd๋ฅผ Call๋ก ์ถ๊ฐํด์ค๋๋ค.
Play Motage์ On Complete๋ ์ ๋๋ฉ์ด์
์ ์คํ์ด ๋๋๋ฉด ํธ์ถ๋ฉ๋๋ค.
On Interrupted๋ ์ค๊ฐ์ ์ข
๋ฃ๋์์ ๋ ํธ์ถ๋ฉ๋๋ค.
ํด๋น ์ถ๋ ฅ๊ณผ ์ด์ด์ ์ ๋๋ฉ์ด์
์ข
๋ฃ ์ Attack End๊ฐ ํธ์ถ๋๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ค์ BTT_DefaultAttack์ผ๋ก ์ด๋ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ BP_Enemy์์ ๋์ด์์ Assign On Attack End๋ฅผ ๊ฒ์ํด์ ์ถ๊ฐํด์ค๋๋ค.
์ด๋ฒคํธ๊ฐ ํธ์ถ๋๋ฉด Finish Execute๋ก ๋์ด๊ฐ๋๋ก ํด์ค๋๋ค.
ํ๋ฆ์ ๋ค์ ํ๋ฒ ์ ๋ฆฌํด์ ์ค๋ช ํด๋๋ฆฌ๊ฒ ์ต๋๋ค.
โ์ปดํ์ผ ์ ์ฅโํ ํ๋ ์ด ํด๋ณด๊ฒ ์ต๋๋ค.
๊ณต๊ฒฉ์ด ๋๋ ๋๊น์ง ํ๋ฆ์ด ๋์ด๊ฐ์ง ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ด๊ฒ์ผ๋ก AI๊ฐ ํ๋ ์ด์ด๋ฅผ ๋ฐ๋ผ๊ฐ์ ๊ณต๊ฒฉํ๋ ๋ถ๋ถ๊น์ง ๊ตฌํ์ ์๋ฃํ์ต๋๋ค.
์ง๊ธ ๋ฌธ์ ๊ฐ ์๋๋ฐ ๋ฐ๋ก ํ๋ ์ด์ด๋ฅผ ๋ฐ๋ผ๋ณด์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค.
์ด ๋ฌธ์ ์ ๋ํ ์์ ๊ณผ ์ถ๊ฐ ๊ตฌํ์ ๋ค์ ํฌ์คํ ์ ์งํํ๊ฒ ์ต๋๋ค.