[Unreal][C++] AI ์บ๋ฆญํ„ฐ

2024. 3. 16. 18:32ยท๐Ÿ“ Game/โœ Unreal

ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์ถ”์ ํ•˜๋Š” ์  ์บ๋ฆญํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด ๋ณผ ๊ฒƒ์ด๋‹ค.

 

1. Character ํด๋ž˜์Šค

Character ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” C++ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. Character ํด๋ž˜์Šค๋Š” Pawn ํด๋ž˜์Šค์˜ ์ž์‹์œผ๋กœ ์ด์กฑ ๋ณดํ–‰๊ณผ ๊ฐ™์€ ์•„๋ฐ”ํƒ€์— ์‚ฌ์šฉ๋œ๋‹ค.

 

Character ํด๋ž˜์Šค


์ƒ์„ฑํ•œ Character ํด๋ž˜์Šค๋ฅผ ๋ฒ ์ด์Šค๋กœ ๋ธ”๋ฃจํ”„๋ฆฐํŠธ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๊ทธ ํ›„ ์Šค์ผˆ๋ ˆํƒˆ ๋ฉ”์‹œ, ๋จธํ„ฐ๋ฆฌ์–ผ, ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ ์šฉ ๋ฐฉ๋ฒ•์€ ์ด ๊ธ€์„ ์ฐธ๊ณ ํ•˜๋ฉด ๋œ๋‹ค.

 

Enemy Character ๋ธ”๋ฃจํ”„๋ฆฐํŠธ ํด๋ž˜์Šค

 

2. AI Controller ํด๋ž˜์Šค

์–ธ๋ฆฌ์–ผ ์—”์ง„์—์„œ๋Š” ์บ๋ฆญํ„ฐ๋Š” controller์˜ ์ง€๋ฐฐ๋ฅผ ๋ฐ›๋Š”๋‹ค. ํ”Œ๋ ˆ์ด์–ด ์บ๋ฆญํ„ฐ๋Š” Player Controller์— ๋น™์˜๋˜๊ณ  ๋™์ผํ•˜๊ฒŒ AI ์บ๋ฆญํ„ฐ๋„ AI Controller์— ๋น™์˜๋˜๊ฒŒ ๋œ๋‹ค. ์ง€๊ธˆ์€ AI ์บ๋ฆญํ„ฐ๋ฅผ ๊ตฌํ˜„ ์ค‘์ด๋‹ˆ AI Controller๋ฅผ ์ƒ์†๋ฐ›๋Š” C++ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

 

AI Controller ํด๋ž˜์Šค

 

์ƒ์„ฑํ•œ AI ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋ฒ ์ด์Šค๋กœ ํ•˜๋Š” ๋ธ”๋ฃจํ”„๋ฆฐํŠธ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ์ƒ์„ฑํ•œ AI ์ปจํŠธ๋กค๋Ÿฌ ๋ธ”๋ฃจํ”„๋ฆฐํŠธ ํด๋ž˜์Šค๋Š” ์ด์ „์— ์ƒ์„ฑํ•œ AI ์บ๋ฆญํ„ฐ ๋ธ”๋ฃจํ”„๋ฆฐํŠธ ํด๋ž˜์Šค์—์„œ ๋“ฑ๋ก ๊ฐ€๋Šฅํ•˜๋‹ค.

 

AI Controller Class

  • Auto Possess AI
    • Disabled: ๋น„ํ™œ์„ฑํ™”
    • Placed In World: ํฐ์ด ๋ฐฐ์น˜๋œ ๊ฒฝ์šฐ์—๋งŒ AI ์ปจํŠธ๋กค๋Ÿฌ ์†Œ์œ 
    • Spawned: ๋กœ๋“œ๋œ ํ›„ ํฐ์ด ์Šคํฐ๋œ ๊ฒฝ์šฐ์—๋งŒ AI ์ปจํŠธ๋กค๋Ÿฌ ์†Œ์œ 
    • Placed In World Or Spawned: ํฐ์€ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค AI ์ปจํŠธ๋กค๋Ÿฌ์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์†Œ์œ 

 

3. NavMeshBoundsVolume

NavMeshBoundsVolume๋Š” AI๊ฐ€ ์›€์ง์ผ ์ˆ˜ ์žˆ๋Š” ์˜์—ญ์ด๋‹ค. ๋งต์˜ ์ „์ฒด๋ฅผ ๊ฐ์‹ธ๋„๋ก ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•˜๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ดˆ๋ก์ƒ‰ ์˜์—ญ ์•ˆ์—์„œ AI๊ฐ€ ์›€์ง์ด๊ฒŒ ๋œ๋‹ค.

 

NavMeshBoundsVolume

 

์ถ”๊ฐ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด Static Mesh์˜ ๋‚ด๋ถ€์ธ๋ฐ๋„ ์›ํ•˜์ง€ ์•Š์€ ๊ณณ๊นŒ์ง€ NavMesh๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. Static Mesh๋Š” Collision์ด๋‚˜ Blocking Volume์„ ์ด์šฉํ•˜์—ฌ Blocking์ด ์„ค์ •๋œ ์ƒํƒœ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์™œ ์ฐจ๋‹จ๋˜์ง€ ์•Š๊ณ  NavMesh๊ฐ€ ์ƒ๊ฒผ์„๊นŒ?

 

Nav Mesh

 

Collision๊ณผ Blocking Volume์€ ๋‚ด๋ถ€๋ผ๋Š” ๊ฐœ๋…์ด ์—†๊ณ  ์ฐจ๋‹จ ๋ฉด์ด๋‹ค. ์ฆ‰, ๋‚ด๋ถ€๋Š” ๋น„์–ด์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ถ”๊ฐ€ ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.

 

1) MinRegionArea

NavMesh์˜ MinRegionArea ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋ฉด, NavMesh ๋‚ด ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ ์ž‘์€ ์˜์—ญ๋“ค ์ค‘ ์ด ๊ฐ’๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ถ€ ์ง€์—ญ์€ ์ œ๊ฑฐ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. NavMesh๋Š” ํƒ€์ผ ๊ทธ๋ฆฌ๋“œ๋กœ ๋ณ‘๋ ฌ๋กœ ์ œ์ž‘๋˜๋Š”๋ฐ, ์˜์—ญ์ด ํƒ€์ผ ๊ฒฝ๊ณ„์— ๊ฑธ์ณ ์žˆ์œผ๋ฉด ๊ทธ ์˜์—ญ์ด ์ œ๊ฑฐ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

2) NavModifierVolume

NavModifierVolume์„ ๋ฐฐ์น˜ํ•œ ํ›„ NavArea_Null๋กœ ์„ค์ •ํ•œ๋‹ค. MinRegionArea๋กœ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์˜์—ญ์„ NavModifierVolume์œผ๋กœ ์ œ๊ฑฐํ•˜๋ฉด ๋œ๋‹ค.

 

NavModifierVolume

 

4. ๋ธ”๋ž™๋ณด๋“œ

๋ธ”๋ž™๋ณด๋“œ๋Š” AI์˜ ๋‘๋‡Œ ์—ญํ• ์„ ํ•˜๋ฉฐ AI๊ฐ€ ์•Œ์•„์•ผ ํ•˜๋Š” ๋ชจ๋“  ์š”์†Œ๋Š” ๋ธ”๋ž™๋ณด๋“œ ํ‚ค๋ฅผ ํ†ตํ•ด ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ธ”๋ž™๋ณด๋“œ

 

ํ”Œ๋ ˆ์ด์–ด ํŠธ๋ž˜ํ‚น์„ ์œ„ํ•œ ๋ธ”๋ž™๋ณด๋“œ ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

  • EnemyActor: ํ”Œ๋ ˆ์ด์–ด
  • HasLineOfSight: AI๊ฐ€ ํ”Œ๋ ˆ์ด์–ด์— ๋Œ€ํ•œ ์‹œ์•ผ๋ฅผ ํ™•๋ณดํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํŠธ๋ž˜ํ‚น ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.
  • PatrolLocation: AI๊ฐ€ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์ถ”๊ฒฉํ•˜๋Š” ์ค‘์ด ์•„๋‹ ๋•Œ ์ด๋™ ๊ฐ€๋Šฅํ•œ ๋ ˆ๋ฒจ ๋‚ด ์œ„์น˜๋ฅผ ํŠธ๋ž˜ํ‚น ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

 

5. ๋น„ํ—ค์ด๋น„์–ด ํŠธ๋ฆฌ

๋น„ํ—ค์ด๋น„์–ด ํŠธ๋ฆฌ๋Š” AI๊ฐ€ ์ง„์ž…ํ•  ์Šคํ…Œ์ดํŠธ์˜ ๋ ˆ์ด์•„์›ƒ์„ ๊ตฌ์„ฑํ•œ๋‹ค.

 

๋น„ํ—ค์ด๋น„์–ด ํŠธ๋ฆฌ

 

๊ทธ๋ž˜ํ”„์—์„œ ๋ฃจํŠธ๋ฅผ ๋“œ๋ž˜๊ทธํ•˜๋ฉด ์ปดํฌ์ง“(Composite) ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ปดํฌ์ง“์€ ํ๋ฆ„ ์ œ์–ด์˜ ํ˜•ํƒœ์ด๋ฉฐ ์—ฐ๊ฒฐ๋œ ์ž์† ๋ถ„๊ธฐ์˜ ์‹คํ–‰ ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•œ๋‹ค.

 

์ปดํฌ์ง“ ๋…ธ๋“œ

  • ๋ ‰ํ„ฐ(Selector): ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ถ„๊ธฐ๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ, ๋ณดํ†ต์€ ๋ณต์ˆ˜์˜ ์„œ๋ธŒํŠธ๋ฆฌ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
  • ์‹œํ€€์Šค(Sequence): ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ถ„๊ธฐ๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ, ๋ณดํ†ต์€ ๋ณต์ˆ˜์˜ ์ž์†์„ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
  • ๋‹จ์ˆœ ๋ณ‘๋ ฌ(Simple Parallel)

 

์ถ”๊ฐ€๋กœ ์กฐ๊ฑด์‹ ์„œ๋ธŒ ๋…ธ๋“œ๋ผ๊ณ ๋„ ์•Œ๋ ค์ง„ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ(Decorator)๋Š” ์ปดํฌ์ง“ ๋˜๋Š” ํƒœ์Šคํฌ ๋…ธ๋“œ์— ๋ถ™์„ ์ˆ˜ ์žˆ๊ณ  ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋ถ„๊ธฐ ๋˜๋Š” ๋‹จ์ผ ๋…ธ๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ •์˜ํ•œ๋‹ค.

 

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ

 

๊ทธ์ค‘ ๋ธ”๋ž™๋ณด๋“œ(Blackboard) ๋…ธ๋“œ๋Š” ํŠน์ • ๋ธ”๋ž™๋ณด๋“œ ํ‚ค์— ๊ฐ’์ด ์„ค์ •๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

 

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๋ธ”๋ž™๋ณด๋“œ

  • Nofity Observer(๊ด€์ฐฐ์ž ์•Œ๋ฆผ)
    • On Result Change: ์กฐ๊ฑด์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ๋งˆ๋‹ค ์žฌ์‹œ์ž‘ํ•œ๋‹ค.
    • On Value Change: ๊ด€์ฐฐ๋˜๋Š” ๋ธ”๋ž™๋ณด๋“œ ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์žฌ์‹œ์ž‘ํ•œ๋‹ค.
  • Observer Aborts(๊ด€์ฐฐ์ง€ ์ค‘๋‹จ) 
    • None: ์•„๋ฌด๊ฒƒ๋„ ์ค‘๋‹จํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • Self: ์ž์‹ ๊ณผ ์ด ๋…ธ๋“œ ์•„๋ž˜ ์‹คํ–‰ ์ค‘์ธ ์„œ๋ธŒ ํŠธ๋ฆฌ๋„ ์ค‘๋‹จํ•œ๋‹ค.
    • Lower Priority: ์ด ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ค‘๋‹จํ•œ๋‹ค.
    • Both: ์ž์‹ , ๊ทธ ์•„๋ž˜ ์‹คํ–‰ ์ค‘์ธ ์„œ๋ธŒ ํŠธ๋ฆฌ, ์ด ๋…ธ๋“œ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ค‘๋‹จํ•œ๋‹ค.
  • Key Query
    • Is Set: ๊ฐ’์ด ์„ค์ •๋œ ์ƒํƒœ์ด๋‹ค. (true)
    • Is Not Set ๊ฐ’์ด ์„ค์ •๋˜์ง€ ์•Š์€ ์ƒํƒœ์ด๋‹ค. (false)

 

์ด์ œ ๋น„ํ—ค์ด๋น„์–ด ํŠธ๋ฆฌ์˜ ํ”„๋ ˆ์ž„ ์›Œํฌ๋ฅผ ๊ตฌํ˜„ํ•  ๊ฒƒ์ด๋‹ค. ๋…ธ๋“œ์˜ ์šฐ์ธก ์ƒ๋‹จ ์ˆซ์ž๋Š” ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ, ์œ„์—์„œ ์•„๋ž˜๋กœ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋…ธ๋“œ์˜ ๋ฐฐ์—ด์ด ์ค‘์š”ํ•˜๋‹ค. ๋ณดํ†ต AI์—๊ฒŒ ์ค‘์š”๋„๊ฐ€ ๋†’์€ ์•ก์…˜์„ ์™ผ์ชฝ์— ๋ฐฐ์น˜ํ•˜๊ณ  ๋œ ์ค‘์š”ํ•œ ์•ก์…˜์€ ์˜ค๋ฅธ์ชฝ์— ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค. ์ž์† ๋ถ„๊ธฐ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจํ•˜๋ฉด ์ „์ฒด ๋ถ„๊ธฐ๊ฐ€ ์‹คํ–‰์„ ์ค‘์ง€ํ•˜๊ณ  ํŠธ๋ฆฌ๋ฅผ ๊ฑฐ์Šฌ๋Ÿฌ ๋‹ค์‹œ ์˜ฌ๋ผ๊ฐ„๋‹ค.

 

๋น„ํ—ค์ด๋น„์–ด ํŠธ๋ฆฌ ๋™์ž‘

  1. AI Root: ์‹ค์ œ ๋ฃจํŠธ๋กœ์„œ ์ž์† ๋ถ„๊ธฐ ์‚ฌ์ด๋ฅผ ์ „ํ™˜ํ•œ๋‹ค.
  2. Chase Player ์‹œํ€€์Šค: HasLineOfSight(ํ”Œ๋ ˆ์ด์–ด ๋ฐœ๊ฒฌ)๊ฐ€ Is Set์ผ ๋•Œ ๋ถ„๊ธฐ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
    1. BTT_ChasePlayer: ์ด๋™ ์†๋„๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ , AI Move To ๋…ธ๋“œ๋ฅผ ์ด์šฉํ•ด ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์ถ”๊ฒฉํ•˜๋Š” ์ปค์Šคํ…€ ํƒœ์Šคํฌ์ด๋‹ค.
  3. Patrol ์‹œํ€€์Šค: HasLineOfSight(ํ”Œ๋ ˆ์ด์–ด ๋ฐœ๊ฒฌ)๊ฐ€ Is Not Set์ผ ๋•Œ ๋ถ„๊ธฐ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ๋งต์—์„œ ๋žœ๋ค ์œ„์น˜๋ฅผ ์ฐพ์•„ ์ด๋™ํ•˜๊ณ  ๊ทธ ์œ„์น˜์—์„œ ์ž ์‹œ ๋Œ€๊ธฐํ•˜๋‹ค๊ฐ€, ๋‹ค์‹œ ๋ฐ˜๋ณตํ•˜๋Š” ์‹œํ€€์Šค์ด๋‹ค.
    1. BTT_FindRandomPatrol: PatrolLocation(๋žœ๋ค ์œ„์น˜)๋ฅผ ์ฐพ๋Š” ์ปค์Šคํ…€ ํƒœ์Šคํฌ์ด๋‹ค.
    2. Move To: PatrolLocation(๋žœ๋ค ์œ„์น˜)์œผ๋กœ ์ด๋™ํ•˜๋„๋ก ์ง€์‹œํ•˜๋Š” ํƒœ์Šคํฌ์ด๋‹ค.
    3. Wait: PatrolLocation(๋žœ๋ค ์œ„์น˜)์—์„œ 4~5์ดˆ ๋™์•ˆ ๋Œ€๊ธฐํ•œ๋‹ค.

 

BTT_ChasePlayer ๊ตฌํ˜„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

BTT_ChasePlayer

 

BTT_FindRandomPatrol ๊ตฌํ˜„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

BTT_FindRandomPatrol

 

๋ฌผ๋ก  BTT๋„ C++ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

6. AIPerceptionComponent

๋จผ์ € ์ƒ์„ฑํ•œ BT๋ฅผ ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

UPROPERTY(EditDefaultsOnly)
TArray<UBehaviorTree*> BehaviorTree;
RunBehaviorTree(BehaviorTree);

 

AIPerceptionComponent๋„ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ด ์ปดํฌ๋„ŒํŠธ๋Š” AI ํผ์…‰์…˜ ์‹œ์Šคํ…œ์—์„œ ์ž๊ทน ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ˜์‘ํ•˜๋„๋ก ๋“ฑ๋ก๋œ ์ž๊ทน์„ ์ˆ˜์ง‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ํ†ตํ•ด AI๊ฐ€ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๋ณด๊ณ  ๋ฐ˜์‘ํ•˜๋„๋ก ๊ตฌ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ž๊ทน ์ค‘ ์‹œ๊ฐ์„ ํ™œ์šฉํ•  ์˜ˆ์ •์ด๊ธฐ ๋•Œ๋ฌธ์— AIPerceptionSignt๋„ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

UPROPERTY()
UAIPerceptionComponent* AIPerceptionComponent;

UPROPERTY()
UAISenseConfig_Sight* AIPerceptionSignt;
AEnemyAIController::AEnemyAIController()
{
	AIPerceptionComponent = CreateDefaultSubobject<UAIPerceptionComponent>(TEXT("AIPerception"));
	AIPerceptionSignt = CreateDefaultSubobject<UAISenseConfig_Sight>("Sight");

	AIPerceptionComponent->ConfigureSense(*AIPerceptionSignt);
	AIPerceptionComponent->SetDominantSense(AIPerceptionSignt->GetSenseImplementation());

	AIPerceptionSignt->SightRadius = 1500.f;
	AIPerceptionSignt->LoseSightRadius = 2000.f;
	AIPerceptionSignt->PeripheralVisionAngleDegrees = 60.0f;
	AIPerceptionSignt->DetectionByAffiliation.bDetectEnemies = true;
	AIPerceptionSignt->DetectionByAffiliation.bDetectNeutrals = true;
	AIPerceptionSignt->DetectionByAffiliation.bDetectFriendlies = false;

	AIPerceptionComponent->OnTargetPerceptionUpdated.AddDynamic(this, &AEnemyAIController::TargetPerceptionUpdated);
}

void AEnemyAIController::TargetPerceptionUpdated(AActor* Actor, FAIStimulus Stimulus)
{
	if (Actor->ActorHasTag("Player") && Stimulus.WasSuccessfullySensed())
	{
		GetBlackboardComponent()->SetValueAsBool("HasLineOfSight", true);
		GetBlackboardComponent()->SetValueAsObject("EnemyActor", Actor);

		GetWorld()->GetTimerManager().ClearTimer(LineOfSightTimerHandle);
	}
	else
	{
		GetWorld()->GetTimerManager().ClearTimer(LineOfSightTimerHandle);
		GetWorld()->GetTimerManager().SetTimer(LineOfSightTimerHandle, FTimerDelegate::CreateLambda([&]()
			{
				GetBlackboardComponent()->SetValueAsBool("HasLineOfSight", false);
				GetBlackboardComponent()->SetValueAsObject("EnemyActor", NULL);

				GetWorld()->GetTimerManager().ClearTimer(LineOfSightTimerHandle);
			}), 2, false);
	}
}
  • ์†Œ์† ๊ฐ์ง€(DetectionbyAffiliation): ๊ฐ™์€ ์†Œ์† ํŒ€์›๋“ค๊ณผ ํ•จ๊ป˜ ์ƒ๋Œ€ ํŒ€์›๋“ค์„ ๊ณต๊ฒฉํ•˜๋Š” ํŒ€ ๊ธฐ๋ฐ˜ AI๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์•กํ„ฐ๋Š” ๋””ํดํŠธ๋กœ ์†Œ์†์ด ํ• ๋‹น๋˜์ง€ ์•Š์•„ ์ค‘๋ฆฝ์œผ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค.
    • ์ค‘๋ฆฝ ํƒ์ง€(Detect Neutrals): ํ˜„์žฌ ๋ธ”๋ฃจํ”„๋ฆฐํŠธ๋ฅผ ํ†ตํ•ด ์†Œ์†์„ ํ• ๋‹นํ•  ์ˆ˜ ์—†์–ด ์ค‘๋ฆฝ ํƒ์ง€ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ  ์•กํ„ฐ ํƒœ๊ทธ ์ง€์ •์„ ๋Œ€์‹  ์‚ฌ์šฉํ•˜์—ฌ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ํŒ๋‹จํ•  ๊ฒƒ์ด๋‹ค.
  • TargetPerceptionUpdated()
    • ํ”Œ๋ ˆ์ด์–ด ์‹œ๊ฐ ์ •๋ณด๊ฐ€ ๋“ค์–ด์˜จ๋‹ค๋ฉด, HasLineOfSight๋ฅผ true๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  EnemyActor๋ฅผ ํ”Œ๋ ˆ์ด์–ด๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.
    • ์‹œ๊ฐ ์ •๋ณด๊ฐ€ ์—†๋‹ค๋ฉด, 2์ดˆ ๋’ค HasLineOfSight๋ฅผ false๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  EnemyActor๋ฅผ NULL๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค. 2์ดˆ์˜ ํ…€์„ ์ฃผ๋Š” ์ด์œ ๋Š” ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ ๋ฐ”๋กœ ์ถ”์ ์„ ํฌ๊ธฐํ•œ๋‹ค๋ฉด ์–ด์ƒ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— 2์ดˆ์˜ ๋”œ๋ ˆ์ด๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

 

์ถ”๊ฐ€๋กœ AI๊ฐ€ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ”Œ๋ ˆ์ด์–ด ๋ธ”๋ฃจํ”„๋ฆฐํŠธ ํด๋ž˜์Šค์—์„œ Tag๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

 

Tag

 

์ด์ œ ์  ์บ๋ฆญํ„ฐ์˜ ์‹œ์•ผ์— ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ๋”ฐ๋ผ๊ฐ„๋‹ค.

 

AI ์บ๋ฆญํ„ฐ ์ ์šฉ

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
'๐Ÿ“ Game/โœ Unreal' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Unreal] ์ง€ํ˜• ๋งŒ๋“ค๊ธฐ (Light, Landscape, Water Plugin)
  • [Unreal] ํƒ€์ž„๋ผ์ธ(Timeline)
  • [Unreal][C++] ์•„์ดํ…œ ํš๋“, ์ฐฉ์šฉ
  • [Unreal][C++] ํ”Œ๋ ˆ์ด์–ด ์บ๋ฆญํ„ฐ
Blxxming
Blxxming
CS ์ง€์‹๊ณผ ๊ณต๋ถ€ํ•˜๋‹ค ๋ฐฐ์šด ๊ฒƒ, ๊ฒฝํ—˜ํ•œ ๊ฒƒ ๋“ฑ์„ ๊ธฐ๋กํ•˜๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
  • Blxxming
    ๐Ÿ’ก๋ฒˆ๋œฉ๐Ÿ’ก
    Blxxming
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
  • ๊ณต์ง€์‚ฌํ•ญ

    • Tech Interview
    • ๐Ÿ“š Tech (246)
      • ๐Ÿ“ Computer Science (96)
        • โœ OS (12)
        • โœ Network & Web (10)
        • โœ Database (11)
        • โœ Data Structure (6)
        • โœ Algorithm (40)
        • โœ Design Pattern (9)
        • โœ Cloud Computing (3)
        • โœ (5)
      • ๐Ÿ“ Language (73)
        • โœ Language (6)
        • โœ C & C++ (11)
        • โœ C# (19)
        • โœ JAVA (37)
      • ๐Ÿ“ Game (43)
        • โœ Computer Graphics (2)
        • โœ Unity (14)
        • โœ Unreal (26)
        • โœ (1)
      • ๐Ÿ“ Book (34)
        • โœ Effective (3)
        • โœ Game Server (16)
        • โœ Clean Code (14)
        • โœ (1)
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
Blxxming
[Unreal][C++] AI ์บ๋ฆญํ„ฐ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”