Behaviour Trees for AI : How they work , By Project Zomboid

์ด์ค€ํ˜ธยท2024๋…„ 1์›” 1์ผ
1

AI์˜ ํ–‰๋™ ํŠธ๋ฆฌ : ์ž‘๋™ ๋ฐฉ์‹

Behaviour Tree์˜ ๋Œ€ํ•œ ์†Œ๊ฐœ๋กœ, ์˜ˆ์ œ์™€ ์‹ฌ์ธต์ ์ธ ์„ค๋ช…๊ณผ ๊ฐ•๋ ฅํ•œ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ช‡๊ฐ€์ง€์˜ ํŒ๋„ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.



๐Ÿ“Œ Introduction (์†Œ๊ฐœ)

์ธํ„ฐ๋„ท์—๋Š” Behaviour Tree ํŠœํ† ๋ฆฌ์–ผ๊ณผ ๊ฐ€์ด๋“œ๊ฐ€ ๋งŽ์ด ์žˆ์ง€๋งŒ Behaviour Tree ์˜ ์‹ค์ œ ์ฝ”๋“œ ๊ตฌํ˜„์— ์ค‘์ ์„ ๋‘๊ฑฐ๋‚˜, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ์˜ˆ ์—†์ด ์ผ๋ฐ˜ ๋ฌธ๋งฅ์ด ์—†๋Š” ๋…ธ๋“œ์˜ ํ๋ฆ„์—๋งŒ ์ˆœ์ˆ˜ํ•˜๊ฒŒ ์ดˆ์ ์ด ๋งž์ถฐ์ €์žˆ๋‹ค.

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

์ด ๊ธ€์€ JBT - Java Behaviour Trees(http://sourceforge.net/projects/jbt/)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๋…ธ๋“œ ์œ ํ˜• ์ค‘ ์ผ๋ถ€๋Š” ์‹ค์ œ๋กœ ์ผ๋ฐ˜์ ์ธ Behaviour Tree๊ฐ€ ์•„๋‹Œ JBT์— ๊ณ ์œ ํ•œ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ PZ Behaviour Tree๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ†ตํ•ฉ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๊ตฌํ˜„์„ ๊ณ ํ˜€๋ž˜ ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค. ๊ท€ํ•˜์˜ ํŠน์ • Behaviour Tree๋Š” ์ด๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค.

Project Zomboid NPC์˜ ๊ฐœ๋ฐœ์„ ํ†ตํ•ด ๊ฝค ํ™•์‹คํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ์œผ๋ฏ€๋กœ ์ ์–ด๋„ Behaviour Tree๋กœ ๋ฌด์—‡์„ ์„ฑ์ทจํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ์•Œ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๊ตฌํ˜„์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•˜์ง€๋Š” ์•Š๊ณ  Project Zomboid์—์„œ ์‚ฌ์šฉ๋œ ๋ช‡ ๊ฐ€์ง€ ์ถ”์ƒ์ ์ธ ์˜ˆ๋งŒ ์ œ๊ณตํ•  ๊ฒƒ์ด๋‹ค.












๐Ÿ“Œ Basic (๊ธฐ์ดˆ)

์œ ํ•œ ์ƒํƒœ ๋จธ์‹ (Finite State Machine)์ด๋‚˜ AI ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐํƒ€ ์‹œ์Šคํ…œ๊ณผ ๋‹ฌ๋ฆฌ Behaviour Tree๋Š” AI entity์˜ ์˜์‚ฌ ๊ฒฐ์ • ํ๋ฆ„์„ ์ œ์–ดํ•˜๋Š” ๊ณ„์ธต์  ๋…ธ๋“œ ํŠธ๋ฆฌ์ด๋‹ค.
Tree ๋ฒ”์œ„์—์„œ Leaf(์žŽ)์€ AI ๊ฐœ์ฒด๋ฅผ ์ œ์–ดํ•˜๋Š” ์‹ค์ œ ๋ช…๋ น์ด๊ณ , ๊ฐ€์ง€๋ฅผ ํ˜•์„ฑํ•˜๋Š” ๊ฒƒ์€ ์ƒํ™ฉ์— ๊ฐ€์žฅ ์ ‘ํ•ฉํ•œ ๋ช…๋ น Sequence(์‹œํ€€์Šค)์— ๋„๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด AI๊ฐ€ ๋‚˜๋ฌด๋ฅผ ๋”ฐ๋ผ ๋‚ด๋ ค๊ฐ€๋Š” ๊ฒƒ์„ ์ œ์–ดํ•˜๋Š” ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋…ธ๋“œ์ด๋‹ค.

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












๐Ÿ“Œ Data Driven vs Code Driven (๋ฐ์ดํ„ฐ ์ค‘์‹ฌ vs ์ฝ”๋“œ ์ค‘์‹ฌ)

์ด๋Ÿฌํ•œ ๊ตฌ๋ณ„์€ ์ด ๊ฐ€์ด๋“œ์™€ ๊ฑฐ์˜ ๊ด€๋ จ์ด ์—†์ง€๋งŒ Behaviour Tree์—๋Š” ๋‹ค์–‘ํ•œ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋Š” ์ ์— ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค. ์ฃผ์š” ์ฐจ์ด์ ์€ ํŠธ๋ฆฌ๊ฐ€ ์ฝ”๋“œ๋ฒ ์ด์Šค ์™ธ๋ถ€์—์„œ (์˜ˆ : XML ๋˜๋Š” ๋…์  ํ˜•์‹์œผ๋กœ ์ •์˜๋˜์–ด ์™ธ๋ถ€ ํŽธ์ง‘๊ธฐ๋กœ ์กฐ์ž‘๋˜๋Š”์ง€) ๋˜๋Š” ํŠธ๋ฆฌ ๊ตฌ์กฐ๊ฐ€ ์ค‘์ฒฉ๋œ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์—์„œ ์ง์ ‘ ์ •์˜๋˜๋Š”์ง€ ์—ฌ๋ถ€์ด๋‹ค.

JBT๋Š” ์ด ๋‘๊ฐ€์ง€์˜ ํ˜ผํ•ฉ์„ ์‚ฌ์šฉํ•œ๋‹ค. ์—ฌ๊ธฐ์—์„œ Behaviour Tree๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํŽธ์ง‘๊ธฐ๊ฐ€ ์ œ๊ณต๋˜์ง€๋งŒ ๋‚ด๊ณ ๋‚ด๊ธฐ ๋ช…๋ น์ค„ ๋„๊ตฌ๋Š” ์‹ค์ œ๋กœ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์˜ Behaviour Tree๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด Java์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

์–ด๋–ค ๊ตฌํ˜„์„ ํ•˜๋“  ์‹ค์žฌ๋กœ ๊ฒŒ์ž„ ํŠน์ • ์—…๋ฌด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์บ๋ฆญํ„ฐ๋ฅผ ์ œ์–ดํ•˜๊ฑฐ๋‚˜ ์บ๋ฆญํ„ฐ์˜ ์ƒํ™ฉ์ด๋‚˜ ์ฃผ๋ณ€ ํ™˜๊ฒฝ์„ ํ™•์ธํ•˜๋Š” ๋…ธ๋“œ์ธ Leaf Node(๋ฆฌํ”„ ๋…ธ๋“œ)๋Š” ์ฝ”๋“œ์—์„œ ์ง์ ‘ ์ •์˜ํ•ด์•ผ ํ•˜๋Š” ํ•ญ๋ชฉ์ด๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํŠธ๋ฆฌ์—์„œ ์ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ณต์žกํ•œ ๋™์ž‘์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋…ธ๋“œ๊ฐ€ ์–ผ๋งˆ๋‚˜ ํ‘œํ˜„๋ ฅ์ด ๋›ฐ์–ด๋‚œ์ง€, ๋•Œ๋กœ๋Š” ๋‹จ์ˆœํ•œ ๋ฌธ์ž ๋ช…๋ น์ด ์•„๋‹ˆ๋ผ ํŠธ๋ฆฌ ์ž์ฒด ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋” ๋งŽ์ด ์ž‘๋™ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์–ด Behaviour Tree๋ฅผ ํฅ๋ฏธ๋กญ๊ฒŒ ๋งŒ๋“ ๋‹ค.












๐Ÿ“Œ Tree Traversal (ํŠธ๋ฆฌ ์ˆœํšŒ)

Behaviour Tree์˜ ํ•ต์‹ฌ ์ธก๋ฉด์€ ์ฝ”๋“œ๋ฒ ์ด์Šค ๋‚ด์˜ ๋ฐฉ๋ฒ•๊ณผ ๋‹ฌ๋ฆฌ ํŠธ๋ฆฌ์˜ ํŠน์ • ๋…ธ๋“œ๋‚˜ ๋ถ„๊ธฐ๋ฅผ ์™„๋ฃŒํ•˜๋Š” ๋ฐ ๊ฒŒ์ž„์˜ ๋งฃ์€ ํ‹ฑ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. Behaviour Tree์˜ ๊ธฐ๋ณธ ๊ตฌํ˜„์—์„œ ์‹œ์Šคํ…œ์€ ๋งค ํ”„๋ ˆ์ž„๋งˆ๋‹ค ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ์—์„œ ์•„๋ž˜๋กœ ์ด๋™ํ•˜์—ฌ ํŠธ๋ฆฌ ์•„๋ž˜์˜ ๊ฐ ๋…ธ๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜์—ฌ ์–ด๋Š ๋…ธ๋“œ๊ฐ€ ํ™œ์„ฑํ™” ์ƒํƒœ์ธ์ง€ ํ™•์ธํ•˜๊ณ  ํ˜„์žฌ ํ™˜์„ฑ ๋…ธ๋“œ์— ๋„๋‹ฌํ•  ๋•Œ ๊นŒ์ง€์˜ ๋ชจ๋“  ๋ชจ๋“œ๋ฅผ ๋‹ค์‹œ ํ™•์ธํ•œ๋‹ค. (ํ•ญ์ƒ ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ฒ€ํ† ,์ฒดํฌ ํ•ด์•ผํ•œ๋‹ค)

์ด๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ ๋งค์šฐ ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ๋‹ค. ํŠนํžˆ ๊ฐœ๋ฐœ์ค‘์— Behaviour Tree๊ฐ€ ๊ฐœ๋ฐœ๋˜๊ณ  ํ™•์žฅ๋จ์— ๋”ฐ๋ผ Behaviour Tree๊ฐ€ ๋” ๊นŠ์–ด์งˆ ์ˆ˜๋ก ๊ทธ๋ ‡๋‹ค. ๊ตฌํ˜„ํ•˜๋Š” ๋ชจ๋“  Behaviour Tree๋Š” ํ˜„์žฌ ์ฒ˜๋ฆฌ ์ค‘์ธ ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•˜์—ฌ ์ „์ฒด ํŠธ๋ฆฌ๋ฅผ ํ‹ฑ ๋‹จ์œ„๋กœ ์ˆœํšŒ๋‚˜๋Š” ๋Œ€์‹  Behaviour Tree ์—”์ง„ ๋‚ด์—์„œ ์ง์ ‘ ํ‹ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผํ•œ๋‹ค. (JBT๋Š” ์ด ๋ฒ”์ฃผ์— ์†ํ•œ๋‹ค.)

โž” ํ‹ฑ ์ด๋ž€?

"ํ‹ฑ"์ด๋ผ๋Š” ์šฉ์–ด๋Š” ๊ฒŒ์ž„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋‚˜ ์ธ๊ณต ์ง€๋Šฅ (AI) ๋ถ„์•ผ์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์šฉ์–ด์ด๋‹ค. ์—ฌ๋Ÿฌ ๋™์ž‘์ด๋‚˜ ์ฒ˜๋ฆฌ๊ฐ€ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ฐ˜๋ณต๋˜๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ด๋Š” ๊ฒŒ์ž„ ๋ฃจํ”„๋‚˜ AI์—”์ง„์—์„œ ๋งค ํ”„๋ ˆ์ž„์ด๋‚˜ ์ฃผ๊ธฐ๋งˆ๋‹ค ์ˆ˜ํ–‰๋˜๋Š” ์ž‘์—…์„ ์˜๋ฏธํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” "ํ‹ฑ"์€ ์—”์ง„์ด๋‚˜ ์‹œ์Šคํ…œ์ด ํŠน์ • ๊ฐ„๊ฒฉ์œผ๋กœ ์ฃผ๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ฒŒ์ž„ ๋ฃจํ”„์—์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ดˆ๋‹น ๋ช‡ ๋ฒˆ์˜ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€๋ฅผ ํƒ€๋‚˜๋‚ด๋Š” ๋‹จ์œ„๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

๋˜ํ•œ, Behaviour Tree(๋™์ž‘ ํŠธ๋ฆฌ)์˜ "ํ‹ฑ"์€ ํŠธ๋ฆฌ์˜ ๊ฐ ๋…ธ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ฃผ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. Behaviour Tree(๋™์ž‘ ํŠธ๋ฆฌ)๋Š” ๊ฒŒ์ž„ ์—”์ง„์ด๋‚˜ AI์‹œ์Šคํ…œ์—์„œ ์ฃผ์–ด์ง„ ์ฃผ๊ธฐ์— ๋”ฐ๋ผ ๋…ธ๋“œ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์›ํ•˜๋Š” ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.












๐Ÿ“Œ Flow (ํ๋ฆ„)

Behaviour Tree๋Š” ์—ฌ๋Ÿฌ ์œ ํ˜•์˜ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋˜์ง€๋งŒ ์ผ๋ถ€ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์€ Behaviour Tree์˜ ๋ชจ๋“  ๋…ธ๋“œ ์œ ํ˜•์— ๊ณตํ†ต๋œ๋‹ค. ์ด๋Š” ์„ธ ๊ฐ€์ง€ ์ƒํƒœ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. (Behaviour Tree์˜ ๊ตฌํ˜„์— ๋”ฐ๋ผ ์„ธ ๊ฐ€์ง€ ์ด์ƒ์˜ ๋ฐ˜ํ™˜์ƒํƒœ๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค.)

์„ธ ๊ฐ€์ง€ ์ผ๋ฐ˜์ ์ธ ์ƒํƒœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • Success (์„ฑ๊ณต)
  • Failure (์‹คํŒจ)
  • Running (์‹คํ–‰์ค‘)

์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์ฒ˜์Œ ๋‘ ๊ฐœ๋Š” ๋ถ€๋ชจ์—๊ฒŒ ์ž์‹ ์˜ ์ž‘์—…์ด ์„ฑ๊ณตํ–ˆ๊ฑฐ๋‚˜ ์‹คํŒจํ–ˆ์Œ์„ ์•Œ๋ฆฐ๋‹ค. ์„ธ ๋ฒˆ์งธ๋Š” ์„ฑ๊ณต์ด๋‚˜ ์‹คํŒจ๊ฐ€ ์•„์ง ๊ฒฐ์ •๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ, ๋…ธ๋“œ๊ฐ€ ๊ณ„์† ์‹คํ–‰ ์ค‘์ด๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค. ๋‹ค์Œ์— ํŠธ๋ฆฌ๊ฐ€ ํ‹ฑ ๋  ๋•Œ ๋…ธ๋“œ๊ฐ€ ๋‹ค์‹œ ํ‹ฑ ๋˜๋ฉฐ, ์ด ์‹œ์ ์—์„œ ๋‹ค์‹œ ์„ฑ๊ณต, ์‹คํŒจ ๋˜๋Š” ๊ณ„์† ์‹คํ–‰๋  ๊ธฐํšŒ๋ฅผ ๊ฐ–๊ฒŒ ๋œ๋‹ค.

์ด ๊ธฐ๋Šฅ์€ ๊ฒŒ์ž„์˜ ์—ฌ๋Ÿฌ ํ‹ฑ ๋™์•ˆ ๋…ธ๋“œ์˜ ์ฒ˜๋ฆฌ๊ฐ€ ์ง€์†๋˜๋„๋ก ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Behaviour Tree์˜ ๊ฐ•๋ ฅํ•œ ํ•ต์‹ฌ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Walk ๋…ธ๋“œ๋Š” ๊ฒฝ๋กœ ๊ณ„์‚ฐ์„ ์‹œ๋„ํ•˜๋Š” ๋™์•ˆ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์บ๋ฆญํ„ฐ๊ฐ€ ์ง€์ •๋œ ์œ„์น˜๊นŒ์ง€ ๊ฑท๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ ๋™์•ˆ Running ์ƒํƒœ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์–ด๋–ค ์ด์œ ๋กœ๋“  ๊ฒฝ๋กœ ์ฐพ๊ธฐ๊ฐ€ ์‹คํŒจํ–ˆ๊ฑฐ๋‚˜ ์บ๋ฆญํ„ฐ๊ฐ€ ๋Œ€์‚ฐ ์œ„์น˜์— ๋„๋‹ฌํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ๊ฑท๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ํ•ฉ๋ณ‘์ฆ์ด ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ ๋…ธ๋“œ๋Š” ์‹คํŒจ๋ฅผ ๋ถ€๋ชจ์—๊ฒŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์–ด๋Š ์‹œ์ ์—์„œ๋“  ์บ๋ฆญํ„ฐ์˜ ํ˜„์žฌ ์œ„์น˜๊ฐ€ ๋Œ€์‚ฐ ์œ„์น˜์™€ ๊ฐ™์œผ๋ฉด Walk ๋ช…๋ น์ด ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์„ฑ๊ณต(Success)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

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

์ด ๊ณต์œ  ๊ธฐ๋Šฅ์„ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋™์ž‘ ํŠธ๋ฆฌ ๋…ธ๋“œ์˜ ์„ธ ๊ฐ€์ง€ ์ฃผ์š” ์›ํ˜•์ด ์žˆ๋‹ค.

  • ๋ณตํ•ฉ (Comoisite)
  • ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ (Decorator)
  • ๋ฆฌํ”„ (Leaf)

โž” Composite (๋ณตํ•ฉ)

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

๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ณตํ•ฉ ๋…ธ๋“œ(Composite Node)๋Š” ์‹œํ€€์Šค(Sequence)์ด๋‹ค. ์ด๋Š” ๋‹จ์ˆœํžˆ ๊ฐ ์ž์‹ ํ•ญ๋ชฉ์„ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•˜๊ณ , ์ž์‹ ํ•ญ๋ชฉ ์ค‘ ํ•˜๋‚˜๋‹ค๋ผ๋„ ์‹คํŒจํ•  ๋•Œ ์‹คํŒจ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๋ชจ๋“  ์ž์‹ ํ•ญ๋ชฉ์ด ์„ฑ๊ณต ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์„ฑ๊ณต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

โž” Decorator (๋ฐ์ฝ”๋ ˆ์ดํ„ฐ)

๋ณตํ•ฉ ๋…ธ๋“œ(Composite Node)์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๋…ธ๋“œ(Decorator Node)์—๋Š” ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ๋ณตํ•ฉ ๋…ธ๋“œ์™€ ๋‹ฌ๋ฆฌ ๊ตฌ์ฒด์ ์œผ๋กœ ์ž์‹ ๋…ธ๋“œ๋Š” ํ•˜๋‚˜๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋“ค์˜ ๊ธฐ๋Šฅ์€ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๋…ธ๋“œ์˜ ์œ ํ˜•์— ๋”ฐ๋ผ ์ž์‹ ๋…ธ๋“œ์˜ ์ƒํƒœ์—์„œ ๋ฐ›์€ ๊ฒฐ๊ณผ๋ฅผ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ์ž์‹์„ ์ข…๋ฃŒํ•˜๊ฑฐ๋‚˜ ์ž์‹ ์ฒ˜๋ฆฌ๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์˜ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์˜ˆ๋Š” ๋‹จ์ˆœํžˆ ํ•˜์œ„ ํ•ญ๋ชฉ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜์ „์‹œํ‚ค๋Š” Inverter์ด๋‹ค. ์ž์‹์ด ์‹คํŒจํ•˜๋ฉด ๋ถ€๋ชจ์—๊ฒŒ ์„ฑ๊ณต์„ ๋Œ๋ ค์ฃผ๊ฑฐ๋‚˜, ์ž์‹์ด ์„ฑ๊ณตํ•˜๋ฉด ์‹คํŒจ๋ฅผ ๋ถ€๋ชจ์—๊ฒŒ ๋Œ๋ ค์ค€๋‹ค.

โž” Leaf (์žŽ)

๊ฐ€์žฅ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ๋…ธ๋“œ ์œ ํ˜•์ด๋ฉฐ ์ž์‹์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Leaf(์žŽ)๋Š” ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ๋…ธ๋“œ ์œ ํ˜•์ด๋‹ค. ์ด๋Š” ํŠธ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ์œ ์šฉํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒŒ์ž„๋ณ„ ๋˜๋Š” ์บ๋ฆญํ„ฐ๋ณ„ ํ…Œ์ŠคํŠธ๋‚˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๊ฒŒ์ž„์—์„œ ์ •์˜ํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์œ„์—์„œ ์‚ฌ์šฉํ•œ ์˜ˆ๋Š” Walk์ด๋‹ค. Walk Leaf Node๋Š” ์บ๋ฆญํ„ฐ๊ฐ€ ์ง€๋„์˜ ํŠน์ • ์ง€์ ์œผ๋กœ ๊ฑธ์–ด๊ฐ€๋„๋ก ํ•˜๊ณ  ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ์„ฑ๊ณต ๋˜๋Š” ์‹คํŒจ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Leaf Node๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ง์ ‘ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—(์ข…์ข… ์•„์ฃผ ์ตœ์†Œํ•œ์˜ ์ฝ”๋“œ๋กœ)๋ณตํ•ฉ(Comosite) ๋ฐ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์œ„์— ๊ณ„์ธกํ™”ํ•  ๋•Œ ๋งค์šฐ ํ‘œํ˜„๋ ฅ์ด ๋›ฐ์–ด๋‚˜๋ฉฐ ๋งค์šฐ ๋ณต์žกํ•œ ๊ณ„์ธตํ™”๋˜๊ณ  ์ง€๋Šฅ์ ์œผ๋กœ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์ง€์ •๋œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ๋™์ž‘ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

๊ฒŒ์ž„ ์ฝ”๋“œ์˜ ๋น„์œ ๋กœ ์„ค๋ช…ํ•˜๋ฉด, Composite, Decorator๋ฅผ ํ•จ์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ , if๋ฌธ , while ๋ฃจํ”„ ๋ฐ ๊ธฐํƒ€ ์–ธ์–ด ๊ตฌ์กฐ๋ฅผ ์ฝ”๋“œ์˜ ํ๋ฆ„์„ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋ฉด Leaf Node๋Š” ์‹ค์ œ๋กœ AI ์บ๋ฆญํ„ฐ์— ๋Œ€ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ์ƒํƒœ ๋˜๋Š” ์ƒํ™ฉ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒŒ์ž„ ํŠน์ • ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋…ธ๋“œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Walk ๋ฆฌํ”„ ๋…ธ๋“œ์—๋Š” ์บ๋ฆญํ„ฐ๊ฐ€ ์ด๋™ํ•  ์ขŒํ‘œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํŠธ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” AI ์บ๋ฆญํ„ฐ์˜ ์ปจํ…์ŠคํŠธ(๋ฌธ๋งฅ) ๋‚ด์— ์ €์žฅ๋œ ๋ณ€์ˆ˜์—์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋™ํ•  ์œ„์น˜๋Š” 'GetSafeLocation' ๋…ธ๋“œ์—์„œ ๊ฒฐ์ •๋˜์–ด ๋ณ€์ˆ˜์— ์ €์žฅ๋˜๊ณ , ๊ทธ๋Ÿผ ๋‹ค์Œ 'Walk' ๋…ธ๋“œ๋Š” ์ปจํ…์ŠคํŠธ(๋ฌธ๋งฅ)์— ์ €์žฅ๋œ ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชฉ์ ์ง€๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠธ๋ฆฌ ์ฒ˜๋ฆฌ ์ค‘์— ์ž„์˜์˜ ์ง€์† ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋“œ ๊ฐ„์— ๊ณต์œ ๋œ ์ปจํ…์ŠคํŠธ(๋ฌธ๋งฅ)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด Behaviour Tree๋ฅผ ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋ถ€๋ถ„์ด๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ์ข…๋ฅ˜์˜ ๋ฆฌํ”„ ๋…ธ๋“œ๋Š” ๋‹ค๋ฅธ Behaviour Tree๋ฅผ ํ˜ธ์ถœํ•˜๋ฉฐ, ํ˜ธ์ถœ๋œ ํŠธ๋ฆฌ๋กœ ๊ธฐ์กด ํŠธ๋ฆฌ์˜ ๋ฐ์ดํ„ฐ ์ปจํ…์ŠคํŠธ(๋ฌธ๋งฅ)๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ๋…ธ๋“œ๋“ค์€ Behaviour Tree๋ฅผ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ Behaviour Tree๋ฅผ ๋ฌด์ˆ˜ํžˆ ๋งŽ์€ ์žฅ์†Œ์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ์•„๋งˆ๋„ ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ ํŠน์ • ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 'Break into Building' ํ–‰๋™์€ 'targetBuilding' ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋”ฐ๋ผ์„œ ๋ถ€๋ชจ ํŠธ๋ฆฌ๋Š” ์ด ๋ณ€์ˆ˜๋ฅผ ์ปจํ…์ŠคํŠธ์—์„œ ์„ค์ •ํ•œ ๋‹ค์Œ ํ•˜์œ„ ํŠธ๋ฆฌ Leaf ๋…ธ๋“œ๋ฅผ ํ†ตํ•ด ํ•˜์œ„ ํŠธ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.












๐Ÿ“Œ Composite Nodes (๋ณตํ•ฉ ๋…ธ๋“œ)

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

โž” Sequences (์‹œํ€€์Šค)

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

Behaviour Tree์˜ ๋…ธ๋“œ ์œ ํ˜•์ด ๋‹ค์–‘ํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ช…ํ™•ํžˆ ํ•ด์•ผ ํ•œ๋‹ค. ์‹œํ€€์Šค์˜ ๊ฐ€์žฅ ๋ช…๋ฐฑํ•œ ์‚ฌ์šฉ๋ฒ•์€ ์™„์ „ํžˆ ์™„๋ฃŒํ•ด์•ผ ํ•˜๋Š” ์ผ๋ จ์˜ ์ž‘์—…์„ ์ •์˜ํ•˜๊ณ , ๊ทธ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์‹คํŒจํ•˜๋ฉด ํ•ด๋‹น ์ž‘์—… ์‹œํ€€์Šค์˜ ์ถ”๊ฐ€ ์ฒ˜๋ฆฌ๊ฐ€ ๋ถˆํ•„์š”ํ•ด์ง„ ๊ฒฝ์šฐ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด :

์ด ์‹œํ€€์Šค๋Š” ์•„๋งˆ๋„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋“œ๋Ÿฌ๋‚˜๋“ฏ์ด ์ฃผ์–ด์ง„ ์บ๋ฆญํ„ฐ๊ฐ€ ๋ฌธ์„ ํ†ต๊ณผํ•˜๊ณ  ๋’ค๋กœ ๋ฌธ์„ ๋‹ซ๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ด๋‹ค. ์‚ฌ์‹ค, ์‹ค์ œ๋กœ๋Š” ์ด๋Ÿฌํ•œ ๋…ธ๋“œ๋“ค์ด ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ๋” ์ถ”์ƒํ™”๋˜๊ณ  ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค. Walk(์œ„์น˜), Open(์—ด ์ˆ˜ ์žˆ๋Š” ๋Œ€์ƒ), Walk(์œ„์น˜), Close(์—ด ์ˆ˜ ์žˆ๋Š” ๋Œ€์ƒ)

๋”ฐ๋ผ์„œ ์ฒ˜๋ฆฌ ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค :

์‹œํ€€์Šค โž” ๋ฌธ๊นŒ์ง€ ๊ฑท๊ธฐ(์„ฑ๊ณต) โž” ์‹œํ€€์Šค(์‹คํ–‰์ค‘) โž” ๋ฌธ ์—ด๊ธฐ(์„ฑ๊ณต) โž” ์‹œํ€€์Šค(์‹คํ–‰์ค‘) โž” ๋ฌธ ํ†ต๊ณผํ•˜๊ธฐ(์„ฑ๊ณต) โž” ์‹œํ€€์Šค(์‹คํ–‰์ค‘) โž” ๋ฌธ ๋‹ซ๊ธฐ(์„ฑ๊ณต) โž” ์‹œํ€€์Šค(์„ฑ๊ณต) โž” ์ด ์‹œ์ ์—์„œ ์‹œํ€€์Šค๋Š” ์ž์‹ ์˜ ๋ถ€๋ชจ์—๊ฒŒ ์„ฑ๊ณต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์บ๋ฆญํ„ฐ๊ฐ€ ๋ฌธ์œผ๋กœ ๊ฑท๋Š” ๋ฐ ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ(๊ธธ์ด ๋ง‰ํ˜€์žˆ๋Š” ๋“ฑ), ๋ฌธ์„ ์—ด์–ด๋ณด๊ฑฐ๋‚˜ ํ†ต๊ณผํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์€ ๋” ์ด์ƒ ๊ด€๋ จ์ด ์—†๋‹ค. ์‹œํ€€์Šค๋Š” ๊ฑท๊ธฐ๊ฐ€ ์‹คํŒจํ•œ ์ˆœ๊ฐ„์— ์‹คํŒจ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ์‹œํ€€์Šค์˜ ๋ถ€๋ชจ๋Š” ์‹คํŒจ๋ฅผ ์šฐ์•„ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹œํ€€์Šค๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์บ๋ฆญํ„ฐ ์ž‘์—…์˜ ์ˆœ์„œ๋กœ ์ด์–ด์ง€๋ฉฐ, AI Behaviour Tree๊ฐ€ ์ด๊ฒƒ์ด ์œ ์ผํ•œ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ œ์•ˆํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์—ฌ๋Ÿฌ ์‹œํ€€์Šค๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฑธ ๊ณ ๋ คํ•ด๋ณด๋ผ :

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

์œ„ ์„น์…˜์—์„œ ์–ธ๊ธ‰ํ•œ Inverter Decorator(์ธ๋ฒ„ํ„ฐ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ)๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด๋ณด๊ฒ ๋‹ค.

์ด์ „ ์˜ˆ์™€ ๊ธฐ๋Šฅ์ ์œผ๋กœ ๋™์ผํ•˜๋ฉฐ ์—ฌ๊ธฐ์„œ๋Š” ์ธํ„ฐ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ๋ฌดํšจํ™”ํ•˜๊ณ  NOT ๊ฒŒ์ดํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค€๋‹ค. ์ฆ‰, ์บ๋ฆญํ„ฐ๋‚˜ ๊ฒŒ์ž„ ์„ธ๊ณ„์˜ ์กฐ๊ฑด์„ ํ…Œ์ŠคํŠธ ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋…ธ๋“œ์˜ ์–‘์„ ๋Œ€ํญ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

โž” Selector (์„ ํƒ์ž)

์„ ํƒ์ž๋Š” ์‹œํ€€์Šค์˜ ์–‘(+)์— ๋Œ€ํ•œ ์Œ(-)์ด๋‹ค.(์ฆ‰, ๋ฐ˜๋Œ€) ์‹œํ€€์Šค๊ฐ€ ๋ชจ๋“  ์ž์‹์ด ์„ฑ๊ณตํ•ด์•ผ ์„ฑ๊ณต์œผ๋กœ ๋ฐ˜ํ™˜๋˜๋Š” AND ์—ฐ์‚ฐ๊ณผ๋Š” ๋‹ฌ๋ฆฌ, ์„ ํƒ์ž๋Š” ๊ทธ ์ž์‹ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์„ฑ๊ณตํ•˜๋ฉด ์„ฑ๊ณต์œผ๋กœ ๋ฐ˜ํ™˜๋˜๊ณ  ๊ทธ ์ดํ›„์˜ ์ž์‹์€ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ž์‹์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ์‹คํŒจํ•˜๋ฉด ๋‘ ๋ฒˆ์งธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ทธ๊ฒƒ๋„ ์‹คํŒจํ•˜๋ฉด ์„ธ ๋ฒˆ์งธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ์„ฑ๊ณต์ด ๋‚˜์˜ค๋ฉด ์ฆ‰์‹œ ์„ฑ๊ณต์œผ๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค. ๋ชจ๋“  ์ž์‹์ด ์‹คํŒจํ•˜๋ฉด ์‹คํŒจํ•œ๋‹ค. ์ด๋Š” ์„ ํƒ์ž๊ฐ€ OR ๊ฒŒ์ดํŠธ์™€ ์œ ์‚ฌํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ ์กฐ๊ฑด์„ ํ™•์ธํ•˜์—ฌ ๊ทธ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ฐธ์ธ์ง€ ํ™•์ธํ•˜๋Š” ์กฐ๊ฑด๋ฌธ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

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

์ด์ „์— ์–ธ๊ธ‰ํ•œ ๋ฌธ ์‹œํ€€์Šค ์˜ˆ์ œ๋ฅผ ๋‹ค์‹œ ์‚ดํŽด๋ณด๊ฒ ๋‹ค. ์ด๋ฒˆ์—๋Š” ์ž ์žฌ์ ์ธ ๋ฌธ์ œ์™€ ๊ทธ๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์„ ํƒ์ž๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

๊ทธ๋ ‡๋‹ค, ์—ฌ๊ธฐ์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ์ž ๊ธด ๋ฌธ์„ ์ง€๋Šฅ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด ์„ ํƒ์ž๊ฐ€ ์ฒ˜๋ฆฌ๋  ๋•Œ ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚ ๊นŒ?

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

๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์ด ์ž ๊ฒจ์žˆ์–ด ์—ด๋ฆฌ์ง€ ์•Š์œผ๋ฉด ๋ฌธ ์—ด๊ธฐ ๋…ธ๋“œ๊ฐ€ ์‹คํŒจํ•˜๊ณ  ์‹คํŒจ๋ฅผ ๋ถ€๋ชจ ์„ ํƒ๊ธฐ์— ์ „๋‹ฌํ•œ๋‹ค. ์ด ์‹œ์ ์—์„œ ์„ ํƒ์ž๋Š” ๋‘ ๋ฒˆ์งธ ๋…ธ๋“œ ๋˜๋Š” ๋‘ ๋ฒˆ์งธ๋กœ ์„ ํ˜ธ๋˜๋Š” ์ž‘์—…์„ ์‹œ๋„ํ•œ๋‹ค. ์ฆ‰, ๋ฌธ์„ ์—ด๊ธฐ ์ „์— ๋ฌธ์„ ์—ด ์ˆ˜ ์žˆ๋Š”์ง€ ์‹œ๋„ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ ์‹œํ€€์Šค๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค(์„ ํƒ์ž์— ์„ฑ๊ณต์„ ๋‹ค์‹œ ์ „๋‹ฌํ•˜๋ ค๋ฉด ์™„์ „ํžˆ ์™„๋ฃŒ๋˜์–ด์•ผ ํ•จ) ์šฐ๋ฆฌ๊ฐ€ ๋จผ์ € ๋ฌธ์„ ์—ด๊ธฐ ์ „์— ๋ฌธ์„ ์ž ๊ธˆ ํ•ด์ œํ•˜๊ณ  ๊ทธ๋Ÿฐ ๋‹ค์Œ ์—ด์–ด๋ณด๋ ค๊ณ  ์‹œ๋„ํ•œ๋‹ค.

๋ฌธ์„ ์—ด ๋•Œ ์ž ๊ธˆ ํ•ด์ œ ๋‹จ๊ณ„ ์ค‘ ์–ด๋Š ํ•˜๋‚˜๊ฐ€ ์‹คํŒจํ•˜๋ฉด(AI๊ฐ€ ์—ด์‡ ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๊ฑฐ๋‚˜, ํ•„์š”ํ•œ ์ž๋ฌผ์‡  ๋”ฐ๋Š” ๊ธฐ์ˆ ์ด ์—†์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋˜๋Š” ์ž๋ฌผ์‡ ๋ฅผ ํ’€์–ด๋ณด์•˜์ง€๋งŒ ๋ฌธ์„ ์—ด๋ ค๊ณ  ์‹œ๋„ํ•  ๋•Œ ๋ฌธ์ด ๋ชป์œผ๋กœ ๋‹ซํ˜€ ์žˆ๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์„ ์ง€๋„ ๋ชจ๋ฅธ๋‹ค), ์‹คํŒจ๋ฅผ ์„ ํƒ์ž์— ๋ฐ˜ํ™˜ํ•˜๊ณ  ์„ ํƒ์ž๋Š” ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ฝ”์Šค์˜ ์„ธ ๋ฒˆ์งธ๋กœ ๋„˜์–ด๊ฐ€ ๋ฌธ์„ ๋ถ€์ˆ˜๊ฒŒ ๋œ๋‹ค.

์บ๋ฆญํ„ฐ๊ฐ€ ์ถฉ๋ถ„ํžˆ ๊ฐ•ํ•˜์ง€ ์•Š๋‹ค๋ฉด ์ด ์ž‘์—…์ด ์‹คํŒจํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋” ์ด์ƒ ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ์น˜๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์„ ํƒ์ž๋Š” ์‹คํŒจํ•˜๊ณ  ์ด๋กœ ์ธํ•ด ์„ ํƒ์ž์˜ ๋ถ€๋ชจ ์‹œํ€€์Šค๊ฐ€ ์‹คํŒจํ•˜์—ฌ ๋ฌธ์„ ํ†ต๊ณผํ•˜๋ ค๋Š” ์‹œ๋„๋ฅผ ํฌ๊ธฐํ•œ๋‹ค.

์ด๋ฅผ ํ•œ ๋‹จ๊ณ„ ๋” ๋‚˜์•„๊ฐ€๋ฉด, ์•„๋งˆ๋„ ์ด ์„ ํƒ๊ธฐ ์œ„์—๋Š” ์ด ์‹œํ€€์Šค์˜ ์‹คํŒจ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค๋ฅธ ์กฐ์น˜๋ฅผ ์„ ํƒํ•  ์„ ํƒ์ž๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” ์ตœ์ƒ์œ„์— ์„ ํƒ์ž๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค. ์ขŒ์ธก(๊ฐ€์žฅ ์„ ํ˜ธํ•˜๋Š” ์ชฝ)์—์„œ๋Š” ๋ฌธ์„ ํ†ตํ•ด ๋“ค์–ด๊ฐ€๋ ค๊ณ  ํ•˜๋ฉฐ, ๊ทธ ์‹คํŒจ ์‹œ์—๋Š” ์ฐฝ๋ฌธ์„ ํ†ตํ•ด ๋“ค์–ด๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค. ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๊ฒƒ์ด ์ด๋ ‡๊ฒŒ ๋ณด์ด์ง€๋Š” ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์œผ๋ฉฐ, ์ด๊ฒƒ์€ Project Zomboid์—์„œ ํ•œ ๊ฒƒ์„ ๋‹จ์ˆœํ™”ํ•œ ๊ฒƒ์ด๋‹ค. ๋‚˜์ค‘์— ๋” ์ผ๋ฐ˜์ ์ด๊ณ  ์œ ์šฉํ•œ ๊ตฌํ˜„์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ฒ ๋‹ค.

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

Behaviour Tree์—์„œ์˜ ์ค‘์š”ํ•œ ์š”์†Œ ์ค‘ ํ•˜๋‚˜๋Š” ์‹คํŒจ๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋ ค๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์น˜๋ช…์ ์ธ ์ค‘๋‹จ์ด ์•„๋‹ˆ๋ผ ๊ฒฐ์ • ํ”„๋กœ์„ธ์Šค์˜ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ถ€๋ถ„์ด๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ์ด์ „ ์‹œ๋„์— ๋น„ํ•ด AI๊ฐœ๋ฐœ์„ ํฌ๊ฒŒ ๋‹จ์ˆœํ™”์‹œํ‚จ ๊ฒƒ์ด๋‹ค. (์–ด, ๊ฒฝ๋กœ์ฐพ๊ธฐ ์‹คํŒจ, ์ด์ œ ์–ด๋–กํ•˜์ง€?) ์‹คํŒจ๋Š” AI์‹œ์Šคํ…œ์˜ ํŒจ๋Ÿฌ๋‹ค์ž„์— ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ ํ•ฉํ•œ ์˜์‚ฌ ๊ฒฐ์ • ๊ณผ์ •์˜ ์ผ๋ถ€๋กœ ๊ฐ„์ฃผ๋œ๋‹ค.

๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ƒํ™ฉ์— ๋Œ€ํ•ด ์•ˆ์ „ ์žฅ์น˜์™€ ๋Œ€์ฒด ์กฐ์น˜๋ฅผ ๊ณ„์ธตํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค. Project Zomboid์˜ ์˜ˆ๋Š” EnacheItemInInventory ๋™์ž‘์ด๋‹ค.

์ด ๋™์ž‘์€ ์ธ๋ฒคํ† ๋ฆฌ ์•„์ดํ…œ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉฐ ์„ ํƒ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•„์ดํ…œ์ด NPC์˜ ์ธ๋ฒคํ† ๋ฆฌ์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ™์€ ๋™์ž‘์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ํ•ญ๋ชฉ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์žฌ๊ท€ ํ˜ธ์ถœ์„ ํฌํ•จํ•œ๋‹ค.

๋จผ์ € ๋™์ž‘์€ ์•„์ดํ…œ์ด ์บ๋ฆญํ„ฐ์˜ ์ฃผ์š” ์ตœ์ƒ์œ„ ์ธ๋ฒคํ† ๋ฆฌ์— ์ด๋ฏธ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ์ด๊ฒƒ์€ ์ด์ƒ์ ์ธ ์ƒํ™ฉ์œผ๋กœ, ์•„๋ฌด๋Ÿฐ ์กฐ์น˜๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค. ์•„์ดํ…œ์ด ์ด๋ฏธ ์žˆ์œผ๋ฉด ์„ ํƒ์ž๊ฐ€ ์„ฑ๊ณตํ•˜๊ณ  ๋”ฐ๋ผ์„œ ์ „์ฒด ๋™์ž‘์ด ์„ฑ๊ณตํ•œ๋‹ค. EnacheItemInInventory๊ฐ€ ์„ฑ๊ณตํ•˜๊ณ  ์•„์ดํ…œ์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

์•„์ดํ…œ์ด ์บ๋ฆญํ„ฐ์˜ ์ธ๋ฒคํ† ๋ฆฌ์— ์—†๋Š” ๊ฒฝ์šฐ ๊ฐ€๋ฐฉ์ด๋‚˜ ๋ฐฐ๋‚ญ์˜ ๋‚ด์šฉ์„ ํ™•์ธํ•œ๋‹ค. ์•„์ดํ…œ์„ ์ฐพ์œผ๋ฉด ํ•ด๋‹น ์•„์ดํ…œ์„ ๊ฐ€๋ฐฉ์—์„œ ์ตœ์ƒ์œ„ ์ธ๋ฒคํ† ๋ฆฌ๋กœ ์ „์†กํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์„ฑ๊ณต ๊ธฐ์ค€์ด ์ถฉ์กฑ๋˜๋ฏ€๋กœ ์„ฑ๊ณตํ•œ๋‹ค.

์ด ๊ฒฝ์šฐ์—๋„ ์‹คํŒจํ•˜๋ฉด ์„ ํƒ์ž์˜ ์„ธ ๋ฒˆ์งธ ๋ถ„๊ธฐ์—์„œ ์•„์ดํ…œ์ด ์บ๋ฆญํ„ฐ๊ฐ€ ํ˜„์žฌ ๋จธ๋ฌผ๋Ÿฌ ์žˆ๋Š” ๊ฑด๋ฌผ์— ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์บ๋ฆญํ„ฐ๋Š” ์•„์ดํ…œ์ด ๋“ค์–ด ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ์œ„์น˜๋กœ ์ด๋™ํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ์—์„œ ์•„์ดํ…œ์„ ๊ฐ€์ ธ์˜จ๋‹ค. ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ธฐ์ค€์ด ์ถฉ์กฑ๋˜๋ฏ€๋กœ ์„ฑ๊ณต์ด๋‹ค.

๋งŒ์•ฝ ์ด๊ฒƒ๋„ ์‹คํŒจํ•˜๋ฉด NPC ์Šฌ๋ฆฌ๋ธŒ์— ๋˜ ๋‹ค๋ฅธ ํŠธ๋ฆญ์ด ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ทธ๋“ค์€ ์›ํ•˜๋Š” ์•„์ดํ…œ์„ ์–ป๊ธฐ ์œ„ํ•œ ์ œ์ž‘ ๋ ˆ์‹œํ”ผ ๋ชฉ๋ก์„ ๋ฐ˜๋ณตํ•˜๊ณ , ๊ฐ ๋ ˆ์‹œํ”ผ์— ๋Œ€ํ•ด ๊ฐ ์›๋ฃŒ ์•„์ดํ…œ์„ ๋ฐ˜๋ณตํ•˜๋ฉฐ, ๊ฐ๊ฐ์˜ ์•„์ดํ…œ์— ๋Œ€ํ•ด ์ˆœํ™˜์ ์œผ๋กœ EnsureItemInInventory ๋™์ž‘์„ ํ˜ธ์ถœํ•œ๋‹ค. ์ด ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์„ฑ๊ณตํ•˜๋ฉด NPC๊ฐ€ ์ด์ œ ์›ํ•˜๋Š” ์•„์ดํ…œ์„ ์ œ์ž‘ํ•  ์ˆ˜ ์ž‡๋Š” ๋ชจ๋“  ์›๋ฃŒ๋ฅผ ์†Œ์œ ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ทธ ์บ๋ฆญํ„ฐ๋Š” ๊ทธ ์›๋ฃŒ๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ์•„์ดํ…œ์„ ์ œ์ž‘ํ•œ ๋‹ค์Œ ์„ฑ๊ณต์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์•„์ดํ…œ์ด ์žˆ์Œ์„ ์ถฉ์กฑํ•œ๋‹ค.

๋งŒ์•ฝ ์ด๊ฒƒ๋„ ์‹คํŒจํ•œ๋‹ค๋ฉด, EnsureItemInInventory ๋™์ž‘์€ ๋” ์ด์ƒ ๋Œ€๋น„์ฑ…์ด ์—†์ด ์‹คํŒจํ•˜๊ณ , NPC๋Š” ๊ทธ ์•„์ดํ…œ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์•ž์œผ๋กœ์˜ ์•ฝํƒ„ ๋ฏธ์…˜ ์ค‘์— ์ฃผ์˜ํ•ด์•ผ ํ•  ์•„์ดํ…œ ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•˜๊ณ  ๊ทธ ์•„์ดํ…œ ์—†์ด ์‚ด์•„๊ฐ€๊ฒŒ ๋œ๋‹ค.

์ด ๊ฒฐ๊ณผ๋กœ NPC๋Š” ํ•„์š”ํ•œ ์žฌ๋ฃŒ๊ฐ€ ์žˆ์œผ๋ฉด ๊ฒŒ์ž„์—์„œ ์›ํ•˜๋Š” ์•„์ดํ…œ์„ ์ œ์ž‘ํ•˜๊ฑฐ๋‚˜ ํ•ด๋‹น ์žฌ๋ฃŒ๋ฅผ ๊ฑด๋ฌผ์—์„œ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

ํ–‰๋™์˜ ๋ฐ˜๋ณต์ ์ธ ํŠน์„ฑ์œผ๋กœ ์ธํ•ด ์žฌ๋ฃŒ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ, ๋” ๋‚ฎ์€ ์ˆ˜์ค€์˜ ์žฌ๋ฃŒ์—์„œ ์ œ์ž‘์„ ์‹œ๋„ํ•˜๋ฉฐ ํ•„์š”ํ•œ ํ•ญ๋ชฉ์„ ์ œ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฑด๋ฌผ์„ ์ฐพ์•„๊ฐ€๊ณ  ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์˜ ์•„์ดํ…œ์„ ์ œ์ž‘ํ•˜์—ฌ ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ์•„์ดํ…œ์„ ์ œ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

Project Zomboid NPCs by Youtube

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

๊ฐœ๋ฐœ ์ค‘ ์–ด๋Š ์‹œ์ ์—์„œ ์šฐ๋ฆฌ๋Š” ๋” ๋งŽ์€ ๋Œ€์•ˆ์„ ์ถ”๊ฐ€ํ•˜์—ฌ NPC๊ฐ€ ์‹ค์ œ๋กœ ํ•„์ˆ˜๋กœ ์›ํ•˜๋Š” ํ•ญ๋ชฉ์„ ์ฐพ์•„๋‚˜๊ฐ€๋„๋ก ํ•  ๊ฒƒ์ด๋ฉฐ, ํ•ด๋‹น ํ•ญ๋ชฉ์„ ๊ฐ€์žฅ ๋งŽ์ด ํฌํ•จํ•˜๊ณ  ์žˆ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ์•ฝํƒˆ ๋Œ€์ƒ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•  ๊ฒƒ์ด๋‹ค.

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

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

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

โž” Random Selectors / Sequences (๋ฌด์ž‘์œ„ ์„ ํƒ์ž / ์‹œํ€€์Šค)

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












๐Ÿ“Œ Decorator Nodes (๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๋…ธ๋“œ)

โž” Inverter (์ธ๋ฒ„ํ„ฐ)

์ด๋ฏธ ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋‹ค๋ฃจ์—ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ ํ•˜์œ„ ๋…ธ๋“œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜์ „ํ•˜๊ฑฐ๋‚˜ ๋ฌดํšจํ™”ํ•œ๋‹ค. ์„ฑ๊ณต์€ ์‹คํŒจ๊ฐ€ ๋˜๊ณ , ์‹คํŒจ๋Š” ์„ฑ๊ณต์ด ๋œ๋‹ค. ์กฐ๊ฑด๋ถ€ ํ…Œ์ŠคํŠธ์— ๊ฐ€์žฅ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.

โž” Succeeder (์„ฑ๊ณต)

Succeccder๋Š” ํ•˜์œ„ ๋…ธ๋“œ๊ฐ€ ์‹ค์ œ๋กœ ๋ฌด์—‡์„ ๋ฐ˜ํ™˜ํ–ˆ๋Š”์ง€์— ๊ด€๊ณ„์—†์ด ํ•ญ์ƒ ์„ฑ๊ณต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋Š” ์‹คํŒจ๊ฐ€ ์˜ˆ์ƒ๋˜๊ฑฐ๋‚˜ ์˜ˆ์ƒ๋˜๋Š” ํŠธ๋ฆฌ์˜ ๋ถ„๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์ง€๋งŒ ๋ถ„๊ธฐ๊ฐ€ ์žˆ๋Š” ์‹œํ€€์Šค์˜ ์ฒ˜๋ฆฌ๋ฅผ ํฌ๊ธฐํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๋‹ค. ์ด ์œ ํ˜•์˜ ๋…ธ๋“œ์™€ ๋ฐ˜๋Œ€๋˜๋Š” ๋…ธ๋“œ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ƒ์œ„ ๋…ธ๋“œ์— ์˜ค๋ฅ˜๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ธ๋ฒ„ํ„ฐ๊ฐ€ ํ›„์† ๋…ธ๋“œ๋ฅผ '์‹คํŒจ์ž'๋กœ ์ „ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

โž” Repeater (๋ฐ˜๋ณต์ž)

๋ฆฌํ”ผํ„ฐ(Repeater)๋Š” ํ•˜์œ„ ๋…ธ๋“œ๊ฐ€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ํ•˜์œ„ ๋…ธ๋“œ๋ฅผ ๋‹ค์‹œ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ด๋“ค์€ ํŠธ๋ฆฌ๋ฅผ ๊ณ„์†ํ•ด์„œ ์‹คํ–‰ํ•˜๋„๋ก ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ฃผ๋กœ ํŠธ๋ฆฌ์˜ ๋งจ ์•„๋ž˜์—์„œ ์‚ฌ์šฉ๋œ๋‹ค. ๋ฆฌํ”ผํ„ฐ๋Š” ์„ ํƒ์ ์œผ๋กœ ํ•˜์œ„ ํ•ญ๋ชฉ์„ ์„ค์ •๋œ ํšŸ์ˆ˜๋งŒํผ ์‹คํ–‰ํ•œ ๋‹ค์Œ ๋ถ€๋ชจ๋กœ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

โž” Repeat Until Fail (์‹คํŒจํ•  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต)

๋ฆฌํ”ผํ„ฐ์ฒ˜๋Ÿผ ์ด ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ๊ณ„์†ํ•ด์„œ ์ž์‹์„ ์žฌ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ด๋Š” ์ž์‹์ด ์ตœ์ข…์ ์œผ๋กœ ์‹คํŒจ๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ๊นŒ์ง€ ์ด๋ฉฐ, ๊ทธ ์‹œ์ ์—์„œ ๋ฆฌํ”ผํ„ฐ๋Š” ๋ถ€๋ชจ์—๊ฒŒ ์„ฑ๊ณต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.












๐Ÿ“Œ Data Context (๋ฐ์ดํ„ฐ ์ปจํ…์ŠคํŠธ)

์ด์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ๋™์ž‘ ํŠธ๋ฆฌ์˜ ์‹ค์ œ ๊ตฌํ˜„, ์‚ฌ์šฉ๋œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋ฐ ๊ธฐํƒ€ ๋ชจ๋“  ๋ฐฉ์‹์— ๋‹ฌ๋ ค ์žˆ์œผ๋ฏ€๋กœ ์ด ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค์†Œ ์ถ”์ƒ์ ์ด๊ณ  ๊ฐœ๋…์ ์œผ๋กœ ์œ ์ง€ํ•˜๊ฒ ๋‹ค.

Behaviour Tree๊ฐ€ AI ์—”ํ„ฐํ‹ฐ์—์„œ ํ˜ธ์ถœ๋  ๋•Œ ๋ฐ์ดํ„ฐ ์ปจํ…์ŠคํŠธ๋„ ์ƒ์„ฑ๋œ๋‹ค. ์ด ๋ฐ์ดํ„ฐ ์ปจํ…์ŠคํŠธ๋Š” ๋…ธ๋“œ์— ์˜ํ•ด ํ•ด์„๋˜๊ณ  ๋ณ€๊ฒฝ๋˜๋Š” ์ž„์˜์˜ ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. (C#์˜ Dictionary์—์„œ ๋ฌธ์ž์—ด/๊ฐ์ฒด ์Œ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, Java์˜ HashMaep, ์•„๋งˆ๋„ C++์˜ ๋ฌธ์ž์—ด/void*STL ๋งต ๋“ฑ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค. ๋‹ค๋งŒ C++์„ ์‚ฌ์šฉํ•œ ๊ฒƒ์€ ์˜ค๋ž˜์ „์ด๋ผ ๋” ๋‚˜์€ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.)

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

โž” Entitiy & Literal

  • Entity : ์‹ค์ฒด, ๊ฐ์ฒด๋ผ๋Š” ์˜๋ฏธ, ์—…๋ฌด์— ํ•„์š”ํ•˜๊ณ  ์œ ์šฉํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ง‘ํ•ฉ

  • Literal : ๋ฐ์ดํ„ฐ(๊ฐ’) ๊ทธ ์ž์ฒด๋ฅผ ๋œปํ•œ๋‹ค. ์ฆ‰, ๋ณ€์ˆ˜์— ๋„ฃ๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ.
    const a = 1; (a๋Š” ์ƒ์ˆ˜, 1์€ ๋ฆฌํ„ฐ๋Ÿด)

โž” Defining Leaf Nodes (๋ฆฌํ”„ ๋…ธ๋“œ ์ •์˜)

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ด์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ๋‚ด์šฉ์€ Behaviour Tree์˜ ์‹ค์ œ ๊ตฌํ˜„์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค. ๋ฆฌํ”„ ๋…ธ๋“œ์— ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ๊ฒŒ์ž„ ํŠน์ • ๊ธฐ๋Šฅ์„ Behaviour Tree์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€๋ถ€๋ถ„์˜ ์‹œ์Šคํ…œ์€ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ๋‘ ๊ฐ€์ง€ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  • init : ๋…ธ๋“œ๊ฐ€ ์ฒ˜์Œ์œผ๋กœ ๋ฐฉ๋ฌธ๋  ๋•Œ ๋ถ€๋ชจ์— ์˜ํ•ด ํ˜ธ์ถœ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‹œํ€€์Šค ๋…ธ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ฐจ๋ก€๊ฐ€ ๋  ๋•Œ ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ๋ถ€๋ชจ๊ฐ€ ์ฒ˜๋ฆฌ๋ฅผ ์™„๋ฃŒํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ถ€๋ชจ์—๊ฒŒ ๋ฐ˜ํ™˜ํ•œ ํ›„์— ๋‹ค์Œ ๋ฒˆ ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ๋ฐœ๋™๋  ๋•Œ๊นŒ์ง€ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ๋…ธ๋“œ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ๋…ธ๋“œ๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฑท๊ธฐ ์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๊ฒฝ๋กœ ์ฐพ๊ธฐ ์ž‘์—…์„ ์‹œ์ž‘ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

  • process : ๋…ธ๋“œ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋Š” ๋™์•ˆ ๋งค ํ‹ฑ๋งˆ๋‹ค ํ˜ธ์ถœ๋œ๋‹ค. ์ด ํ•จ์ˆ˜๊ฐ€ Success ๋˜๋Š” Failure๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์ฒ˜๋ฆฌ๊ฐ€ ์ข…๋ฃŒ๋˜๊ณ  ๊ฒฐ๊ณผ๊ฐ€ ๋ถ€๋ชจ์—๊ฒŒ ์ „๋‹ฌ๋œ๋‹ค. Running์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋‹ค์Œ ํ‹ฑ์—์„œ ๋‹ค์‹œ ์ฒ˜๋ฆฌ๋˜๋ฉฐ, ๊ณ„์†ํ•ด์„œ Success ๋˜๋Š” Failure๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต๋œ๋‹ค. ๊ฑท๊ธฐ ์˜ˆ์ œ์—์„œ๋Š” ๊ฒฝ๋กœ ์ฐพ๊ธฐ๊ฐ€ ์„ฑ๊ณตํ•˜๊ฑฐ๋‚˜ ์‹คํŒจํ•  ๋•Œ๊นŒ์ง€ Running์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋…ธ๋“œ๋Š” ๋ช…์‹œ์ ์œผ๋กœ ๋ฆฌํ„ฐ๋Ÿด ๋งค๊ฐœ๋ณ€์ˆ˜๋‚˜ ์ œ์–ด๋˜๋Š” AI ์—”ํ„ฐํ‹ฐ์˜ ๋ฐ์ดํ„ฐ ์ปจํ…์ŠคํŠธ ๋‚ด ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ฐธ์กฐ์™€ ๊ด€๋ จ๋œ ์†์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์— ๋Œ€ํ•ด์„œ๋Š” ์–ธ์–ด ๋ฐ Behaviour Tree(ํ–‰๋™ ํŠธ๋ฆฌ)์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ ๋‹ค๋ฃจ์ง€ ์•Š๊ฒ ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ Behaviour Tree ์ธ์Šคํ„ด์Šค ๋‚ด์—์„œ์˜ ์ž„์˜ ๋ฐ์ดํ„ฐ ์ €์žฅ์ด๋ผ๋Š” ๊ฐœ๋…์€ ๊ฝค ๋ฒ”์šฉ์ ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, Walk ๋…ธ๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.

Walk (character, destination)

  • success: ๋ชฉ์ ์ง€์— ๋„๋‹ฌํ•จ
  • failure: ๋ชฉ์ ์ง€์— ๋„๋‹ฌํ•˜์ง€ ๋ชปํ•จ
  • running: ์ด๋™ ์ค‘

์ด ๊ฒฝ์šฐ Walk์—๋Š” ๋‘ ๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์บ๋ฆญํ„ฐ์™€ ๋ชฉ์ ์ง€์ด๋‹ค. AI ๋™์ž‘์„ ์‹คํ–‰ํ•˜๋Š” ์บ๋ฆญํ„ฐ๊ฐ€ ๋…ธ๋“œ์˜ ์ฃผ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ช…์‹œ์ ์œผ๋กœ ์ „๋‹ฌํ•  ํ•„์š”๊ฐ€ ๋ฒ—์„ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์ž‡์ง€๋งŒ, 'Walk'๊ฐ€ ๊ฝค ์•ˆ์ „ํ•œ ์„ ํƒ์ด๊ธฐ๋Š” ํ•˜์ง€๋งŒ ์ด ๊ฐ€์ •์„ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹๋‹ค. ํŠนํžˆ ์กฐ๊ฑด ๋…ธ๋“œ์—์„œ ๋‹ค๋ฅธ ์บ๋ฆญํ„ฐ์˜ ์ƒํƒœ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ฑฐ๋‚˜ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋“  ์ƒํ˜ธ์ž‘์šฉํ•ด์•ผ ํ•  ๋•Œ ๋…ธ๋“œ๋ฅผ ๋‹ค์‹œ ์ฝ”๋”ฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•˜๋‹ค. ๊ฑฐ์˜ ํ™•์‹คํ•˜๋”๋ผ๋„ ๋™์ž‘์„ ์‹คํ–‰ํ•˜๋Š” AI๋งŒ ํ•„์š”ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐ๋œ๋‹ค๋ฉด ๋ช…๋ น์ด ์ ์šฉ๋˜๋Š” ์บ๋ฆญํ„ฐ๋ฅผ ์ถ”๊ฐ€๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ๊ฐ€์žฅ ์ข‹๋‹ค.

์•ž์—์„œ ์–ธ๊ธ‰ํ•œ ๋Œ€๋กœ ์ „๋‹ฌ๋œ ์œ„์น˜๋Š” ์ˆ˜๋™์œผ๋กœ x, y, z ์ขŒ๋ฃŒํฌ ์ž…๋ ฅ๋  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์œ„์น˜๋Š” ์ž์ฃผ ๋‹ค๋ฅธ ๋…ธ๋“œ์— ์˜ํ•ด ๋ณ€์ˆ˜๋กœ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ๋˜๋ฉฐ, ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ๋‚˜ ๊ฑด๋ฌผ์˜ ์œ„์น˜๋ฅผ ์–ป๊ฑฐ๋‚˜ NPC์ฃผ๋ณ€์˜ ์•ˆ์ „ํ•œ ๊ณณ์„ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

โž” Stacks (์Šคํƒ)

Behaviour Tree๋ฅผ ์ฒ˜์Œ ์‚ดํŽด๋ณผ ๋•Œ, ๋ณดํ†ต ๋…ธ๋“œ๋“ค์„ ์บ๋ฆญํ„ฐ์˜ ํ–‰๋™์ด๋‚˜ ์บ๋ฆญํ„ฐ ๋˜๋Š” ํ™˜๊ฒฝ๊ณผ ๊ด€๋ จ๋œ ์กฐ๊ฑด ํ…Œ์ŠคํŠธ๋กœ๋งŒ ์ œํ•œํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ์ œํ•œ์ด ๋™์ž‘ ํŠธ๋ฆฌ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๊ฐ•๋ ฅํ•œ์ง€๋ฅผ ์ดํ•ดํ•˜๊ธฐ์—๋Š” ๋‹ค์†Œ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค.

์Šคํƒ ์—ฐ์‚ฐ์„ ๋…ธ๋“œ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ๋…ธ๋“œ์˜ ์œ ์šฉ์„ฑ์ด ๋‚˜์—๊ฒŒ ์ •๋ง๋กœ ๋ช…๋ฐฑํ•ด์กŒ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฒŒ์ž„์— ๋‹ค์Œ ๋…ธ๋“œ ๊ตฌํ˜„์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

PushToStack(item, stackVar)
PopFromStack(stack, itemVar)
IsEmpty(stack)

์ด ์„ธ๊ฐ€์ง€ ๋…ธ๋“œ์—๋Š” ๋‹จ ๋ช‡ ์ค„์˜ ์ฝ”๋“œ๋กœ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์Šคํƒ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ init / process ํ•จ์ˆ˜๋งŒ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๊ฒƒ์œผ๋กœ ๋‹ค์–‘ํ•œ ๊ฐ€๋Šฅ์„ฑ์ด ์—ด๋ฆฐ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, PushToStack์€ ์ƒˆ ์Šคํƒ์„ ์ƒ์„ฑํ•˜๊ณ  ์ „๋‹ฌ๋œ ๋ณ€์ˆ˜ ์ด๋ฆ„์— ์ €์žฅํ•œ ๋‹ค์Œ 'item'๊ฐ์ฒด๋ฅผ ์Šคํƒ์— ํ‘ธ์‹œํ•œ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ pop์€ ์Šคํƒ์—์„œ ํ•ญ๋ชฉ์„ ํŒํ•˜๊ณ  itemVar ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๋ฉฐ, ์Šคํƒ์ด ์ด๋ฏธ ๋น„์–ด์žˆ๋Š” ๊ฒฝ์šฐ ์‹คํŒจํ•˜๋ฉฐ IsEmpty๋Š” ์ „๋‹ฌ๋œ ์Šคํƒ์ด ๋น„์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๋น„์–ด ์žˆ์œผ๋ฉด ์„ฑ๊ณต์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‹คํŒจ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด์ œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ์ฒด ์Šคํƒ์„ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

Until Fail ๋ฆฌํ”ผํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์Šคํƒ์—์„œ ํ•ญ๋ชฉ์„ ๊ณ„์†ํ•ด์„œ ํŒํ•˜๊ณ  ํ•ด๋‹น ํ•ญ๋ชฉ์— ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์Šคํƒ์ด ๋น„์–ด ์ž‡๋Š” ์ง€์ ์—์„œ PopFromStack์ด ์‹คํŒจ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  Until Fail ํ”ผ๋ฆฌํ„ฐ์—์„œ ๋น ์ ธ๋‚˜์˜ฌ ๊ฒƒ์ด๋‹ค.

๊ทธ ๋‹ค์Œ์œผ๋กœ ์ •๊ธฐ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋…ธ๋“œ๋“ค์ด ์žˆ๋‹ค.

SetVariable(varName, object)
IsNull(object)

์ด๋“ค์€ Composite(๋ณตํ•ฉ)์™€ Decorator(๋ฐ์ฝ”๋ ˆ์ดํ„ฐ)๊ฐ€ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ํŠธ๋ฆฌ ์ƒ์œ„๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์ถฉ๋ถ„ํ•œ ์„ธ๋ถ„์„ฑ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์„ ๋•Œ Behaviour Tree์ „์ฒด์—์„œ ์ž„์˜์˜ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. ์ž ์‹œ ํ›„์— ์ด์™€ ๊ฐ™์€ ์ƒํ™ฉ์— ์ง๋ฉดํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ํ•„์š”ํ•˜์ง€ ์•Š๋„๋ก ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์˜์‹ฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ด์ œ GetDoorStackFromBuilding ์ด๋ผ๋Š” ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ๋‹ค. ์ด ๋…ธ๋“œ์—๋Š” ๊ฑด๋ฌผ ๊ฐ์ฒด๊ฐ€ ์ „๋‹ฌ๋˜๋ฉฐ ํ•ด๋‹น ๊ฑด๋ฌผ์˜ ์™ธ๋ถ€ ๋ฌธ ๊ฐœ์ฒด ๋ชฉ๋ก์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ด๋ฅผ ์ฑ„์šฐ๊ณ  ์ดˆ๊ธฐํ™”ํ•œ ์Šคํƒ์— ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค. ๊ทธ๋Ÿผ ์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

์ด๊ฒŒ ์กฐ๊ธˆ ๋ณต์žกํ•ด์ง„ ๊ฒƒ ๊ฐ™๊ณ , ์ฒ˜์Œ์—๋Š” ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ํŒ๋‹จํ•˜๊ธฐ ์–ด๋ ค์›Œ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์–ด๋–ค ์–ธ์–ด๋“ ์ง€ ๊ฒฐ๊ตญ์€ ํ•œ๋ˆˆ์— ์ฝ๊ธฐ ์‰ฌ์›Œ์ง€๊ณ  ๊ฐ€๋…์„ฑ์„ ์žƒ๋”๋ผ๋„ ์œ ์—ฐ์„ฑ์„ ์–ป๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ž˜์„œ ์ด๊ฒŒ ๋ฌด์Šจ ์ผ์„ ํ•˜๋Š” ๊ฑธ๊นŒ? ์ฒ˜์Œ์—๋Š” ๋ณต์žกํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋…ธ๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๊ณ  ์„ฑ๊ณต๊ณผ ์‹คํŒจ๊ฐ€ ํŠธ๋ฆฌ๋ฅผ ํšก๋‹นํ•˜๋Š” ๋ฐฉ์‹์— ์ต์ˆ™ํ•ด์ง€๋ฉด ์‹œ๊ฐํ™”ํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ์‰ฌ์›Œ์ง„๋‹ค. ์„ค๋ช…์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๋ฉด ํŠธ๋ฆฌ๋ฅผ ๋”ฐ๋ผ๊ฐ€๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์ด ์„น์…˜์„ ํ™•์žฅํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ, ๊ฑด๋ฌผ์˜ ๋ชจ๋“  ๋ฌธ์„ ๊ฒ€์ƒ‰ํ•œ ๋‹ค์Œ ๋“ค์–ด๊ฐ€๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ , ์บ๋ฆญํ„ฐ๊ฐ€ ๋ฌธ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋“ค์–ด๊ฐ€๋Š” ๋ฐ ์„ฑ๊ณตํ•˜๋ฉด ์„ฑ๊ณต์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์‹คํŒจํ•˜๋ฉด ์‹คํŒจ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋™์ž‘์ด๋‹ค.

๋จผ์ € ๊ฑด๋ฌผ๋กœ ๋“ค์–ด๊ฐ€๋Š” ๋ชจ๋“  ์ถœ์ž…๊ตฌ๊ฐ€ ํฌํ•จ๋œ ์Šคํƒ์„ ๊ฐ€์ ธ์˜จ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ž์‹์ด ์‹คํŒจ๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ๊นŒ์ง€ ์ž์‹์„ ๊ณ„์† ์žฌ์ฒ˜๋ฆฌํ•˜๋Š” Until Fail ๋ฆฌํ”ผํ„ฐ ๋…ธ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

์‹œํ€€์Šค์ธ ํ•ด๋‹น ์ž์‹์€ ๋จผ์ € ๋ฌธ์„ ํŒํ•˜๊ณ  ์ด๋ฅผ door ๋ณ€์ˆ˜์— ์ €์žฅํ•œ๋‹ค.

๋ฌธ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์Šคํƒ์ด ๋น„์–ด ์žˆ๋‹ค๋ฉด, ์ด ๋…ธ๋“œ๋Š” Until Fail ๋ฆฌํ”ผํ„ฐ๋ฅผ ์„ฑ๊ณต์œผ๋กœ ๊ฐ„์ฃผํ•˜์—ฌ ๋ถ€๋ชจ ์‹œํ€€์Šค๋ฅผ ๊ณ„์† ์ง„ํ–‰ํ•œ๋‹ค. (Until Fail์€ ํ•ญ์ƒ ์„ฑ๊ณต์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ) ๋ถ€๋ชจ ์‹œํ€€์Šค์—๋Š” 'usedDoor'์— ๋Œ€ํ•œ ๋ฐ˜์ „๋œ 'IsNull' ์ฒดํฌ๊ฐ€ ์žˆ๋‹ค. ์ด ์ฒดํฌ๋Š” 'usedDoor'๊ฐ€ null์ธ ๊ฒฝ์šฐ์— ์‹คํŒจํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๋…ธ๋“œ๋Š” ์Šคํƒ์ด ๋น„์–ด์žˆ๋Š” ์ƒํƒœ์—์„œ ์ด๋ฏธ Until Fall ๋ฆฌํ”ผํ„ฐ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— 'usedDoor' ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•  ๊ธฐ์™ธ๊ฐ€ ์—†์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์‹คํŒจ๋Š” ์ „์ฒด ๋™์ž‘์„ ์‹คํŒจ ์ƒํƒœ๋กœ ๋งŒ๋“ค๊ฒŒ ๋œ๋‹ค.

์Šคํƒ์ด ๋ฌธ์„ ์žก๋Š” ๋ฐ ์„ฑ๊ณตํ•˜๋ฉด, ๋ฌธ์œผ๋กœ ๊ฑธ์–ด๊ฐ€์„œ ๋ฌธ์„ ์—ด๊ณ  ํ†ต๊ณผํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์‹œํ€€์Šค(์ธ๋ฒ„ํ„ฐ ํฌํ•จ)๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

๋งŒ์•ฝ NPC๊ฐ€ ์ด์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ˆ˜๋‹จ์œผ๋กœ ๋ฌธ์„ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•œ๋‹ค๋ฉด(๋ฌธ์ด ์ž ๊ฒจ์žˆ๊ฑฐ๋‚˜ NPC๊ฐ€ ๋ฌธ์„ ๋ถ€์ˆ˜๊ธฐ์— ๋„ˆ๋ฌด ์•ฝํ•˜๋‹ค๋ฉด), ์„ ํƒ์ž(Selecotor)๋Š” ์‹คํŒจํ•˜๊ณ  ์ด ์‹คํŒจ๋ฅผ ์ƒ์œ„ ์ธ๋ฒ„ํ„ฐ(Inverter)์— ๋ฐ˜ํ™˜ํ•œ๋‹ค. Inverter๋Š” ์ด ์‹คํŒจ๋ฅผ ์„ฑ๊ณต์œผ๋กœ ๋ฐ˜์ „์‹œํ‚จ๋‹ค. ๋”ฐ๋ผ์„œ Until Fail ๋ฆฌํ”ผํ„ฐ์—์„œ ๋น ์ ธ๋‚˜๊ฐ€์ง€ ์•Š๊ฒŒ ๋˜๊ณ , ์ด๋Š” ๋ฐ˜๋ณต๋˜์–ด ๋‹ค์Œ ๋ฌธ์„ ์Šคํƒ์—์„œ ๊บผ๋‚ด์–ด(Pop) NPC๊ฐ€ ๋‹ค์Œ ๋ฌธ์„ ์‹œ๋„ํ•˜๋Š” ์ƒˆ๋กœ์šด ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๋งŒ์•ฝ NPC๊ฐ€ ๋ฌธ์„ ํ†ต๊ณผํ•˜๋Š” ๋ฐ ์„ฑ๊ณตํ•œ๋‹ค๋ฉด, ํ•ด๋‹น ๋ฌธ์„ 'usedDoor' ๋ณ€์ˆ˜์— ์„ค์ •ํ•˜๊ฒŒ ๋˜๊ณ , ์ด ์‹œ์ ์—์„œ ์‹œํ€€์Šค๋Š”์„ฑ๊ณต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ์„ฑ๊ณต์€ ์‹คํŒจ๋กœ ๋ฐ˜์ „๋˜์–ด Until Fail ๋ฆฌํ”ผํ„ฐ๋ฅผ ๋น ์ ธ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

์ด ๊ฒฝ์šฐ์—๋Š” null์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— 'UsedDoor'์— ๋Œ€ํ•œ IsNull ๊ฒ€์‚ฌ๊ฐ€ ์‹คํŒจํ•˜๊ฒŒ ๋˜๋ฉฐ, ์ด๋Š” ์„ฑ๊ณต์œผ๋กœ ๋ฐ˜์ „๋˜์–ด ์ „์ฒด ๋™์ž‘์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๊ฒŒ ๋œ๋‹ค. ๋ถ€๋ชจ๋Š” NPC๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ๋ฌธ์„ ์ฐพ์•„ ๊ฑด๋ฌผ๋กœ ๋“ค์–ด๊ฐ”์Œ์„ ์•Œ๊ฒŒ ๋œ๋‹ค.

๋งŒ์•ฝ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํŒจํ•œ๋‹ค๋ฉด, ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ 'GetWindowStackFromBuilding' ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฐฝ๋ฌธ์„ ๋Œ€์ƒ์œผ๋กœ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ช‡ ใ„ฑ์ง€ ์ถ”๊ฐ€์ ์ธ ์Šคํƒ ์กฐ์ž‘ ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 'GetDoorStackFromBuilding' ์™€ 'GetWindowStackFromBuilding'์„ ์—ฐ์ด์–ด ํ˜ธ์ถœํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ฐฝ๋ฌธ์„ ๋ฌธ ์Šคํƒ ๋์— ์ถ”๊ฐ€ํ•˜๊ณ  ๋™์ผํ•œ 'Until Fail' ๋ฃจํ”„ ๋‚ด์—์„œ ์ด๋“ค์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ฌธ๊ณผ ์ฐฝ๋ฌธ ๋ชจ๋‘ ์ƒํ˜ธ์ž‘์šฉ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” Open, Unlock, Smash, Close์™€ ๊ฐ™์€ ์ž‘์—…์ด ๋ฌธ๊ณผ ์ฐฝ๋ฌธ์˜ ์ผ๋ฐ˜ ๋ฒ ์ด์Šค์—์„œ ๋™์ž‘ํ•˜๊ฑฐ๋‚˜ ์ˆ˜ํ–‰ ์ค‘์— ์ž‘์—… ๋Œ€์ƒ ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋Ÿฐํƒ€์ž„ ํƒ€์ž… ์ฒดํฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, ๋ฌธ์„ ๋‹ซ๋Š” ๋…ธ๋“œ์— ๋ถ€๋ชจ๋กœ Succeeder ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์— ์ฃผ๋ชฉํ•  ๊ฒƒ์ด๋‹ค. ์ด๋Š” NPC๊ฐ€ ๋ฌธ์„ ๋ถ€์ˆ˜๋ฉด ๋‹ซ๋Š” ๋ฐ ์‹คํŒจํ•  ๊ฒƒ์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ด๋‹ค.

๋งŒ์•ฝ Succeeder๊ฐ€ ์—†๋‹ค๋ฉด, 'usedDoor' ๋ณ€์ˆ˜๊ฐ€ ์„ค์ •๋˜๊ณ  ๋‹ค์Œ ๋ฌธ์œผ๋กœ ์ด๋™ํ•˜๊ธฐ ์ „์— ์‹œํ€€์Šค๊ฐ€ ์‹คํŒจํ•˜๊ฒŒ ๋œ๋‹ค. ๋˜ ๋‹ค๋ฅธ ํ•ด๊ฒฐ์ฑ…์€ ๋ฌธ์ด ๋ถ€์„œ์ง„ ๊ฒฝ์šฐ์—๋„ 'close Door'๊ฐ€ ํ•ญ์ƒ ์„ฑ๊ณตํ•˜๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ๋ฌธ์„ ๋‹ซ๋Š” ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ๊ณ„์†ํ•ด์„œ ํ…Œ์ŠคํŠธ ํ•˜๊ณ ์‹ถ๋‹ค. (์˜ˆ๋ฅผ ๋“ค์–ด, 'Secure Safehouse' ๋™์ž‘์—์„œ๋Š” ๋ฌธ์ด ๊ฑฐ์น˜๋Œ€์—์„œ ๋–จ์–ด์ ธ ๋‚˜๊ฐ”๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์„ ๋‹ซ๋Š” ๋ฐ ์‹คํŒจํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋จ) ๋”ฐ๋ผ์„œ Succeeder๋ฅผ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ์‹คํŒจ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฒ˜๋ฆฌํ–ˆ๋‹ค.

Stack & Pop

์Šคํƒ์˜ ๊ฐœ๋…

  • ๋ฉ”๋ชจ๋ฆฌ์˜ ์Šคํƒ ์˜์—ญ์€ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ๊ณผ ๊ด€๊ณ„๋˜๋Š” ์ง€์—ญ๋ณ€์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฆฌํ„ด ๊ฐ’๋“ฑ์˜ ์ž„์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.

  • ์Šคํƒ์ด๋ž€ ๋‹จ์–ด '์ฐจ๊ณก ์ฐจ๊ณก ์Œ“์—ฌ์ง„ ๋”๋ฏธ'๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

  • LIFO(Last In First Out, ํ›„์ž… ์„ ์ถœ) ๊ตฌ์กฐ ๋ผ๊ณ ๋„ ํ•œ๋‹ค.

์Šคํƒ์˜ ๊ตฌ์กฐ

  • ๊ฐ€์žฅ ๋จผ์ € ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ์Šคํƒ์˜ ์•„๋ž˜ ์ชฝ(๋†’์€ ์ฃผ์†Œ)๋ถ€ํ„ฐ ์Œ“์ด๊ณ , ๋‹ค์Œ ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋กœ ๊ทธ ์œ„(๋‚ฎ์€ ์ฃผ์†Œ)์— ์Œ“์ธ๋‹ค.

์Šคํƒ์— ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ PUSH๋ผ๊ณ  ํ•œ๋‹ค.
PUSH๋ฅผ ํ•˜๋ฉด ๊ธฐ์กด ๋ฐ์ดํ„ฐ ์œ„์— ์ƒˆ ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์Œ“์•„์ง„๋‹ค.

์Šคํƒ์— ์žˆ๋˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ๋นผ๋‚ด๋Š” ๊ฒƒ์€ POP๋ผ๊ณ  ํ•œ๋‹ค.












๐Ÿ“Œ ์ถœ์ €

0๊ฐœ์˜ ๋Œ“๊ธ€