๐TIL - ์ธ๋ฆฌ์ผ AI ๊ด๋ จ ๊ฐ๋
์ ์ฉํ ์ ๋์ก๊ธฐ ๊ฒ์ ์ค๊ณ
๋ฐฐ๊ฒฝ
AI ๊ฒ์ ๋์์ธ ๊ฐ์์ Behavior Tree, Blackboard ๋ฑ ์ธ๋ฆฌ์ผ AI ๊ฐ๋
์ ํ์ตํ๋ฉด์
์ด๋ก ์ ์ค์ ๊ฒ์ ์ค๊ณ์ ์ ์ฉํด๋ณด๊ณ ์ ํ๋ค.
๊ฐ์์ AI ๊ธฐ๋ฐ ๊ฒ์ ๊ธฐํ ์์๋ฅผ ์ฐธ๊ณ ํด,
์ํ์ ๋ฐ๋ผ ํ๋์ด ๋ฐ๋๋ ๊ตฌ์กฐ๋ฅผ ์ง์ ์ค๊ณํ๋ ๋ฐฉํฅ์ผ๋ก
์ ๋์ก๊ธฐ ๊ฒ์ ๊ธฐํ์ ์งํํ๋ค.
์์ธ ์ค๊ณ ๊ตฌ์กฐ
์ด๋ฒ ์ ๋์ก๊ธฐ ๊ฒ์์ ๋จ์ํ โ์ก๊ณ ๋๋ง๊ฐ๋ ๊ฒ์โ์ด ์๋๋ผ,
์บ๋ฆญํฐ์ ์ญํ ์ํ์ ๋ฐ๋ผ ์
๋ ฅ, AI, ํ์, ํด ์งํ์ด ๋ชจ๋ ๋ฐ๋๋ ๊ตฌ์กฐ๋ก ์ค๊ณํ๋ค.
๊ฐ์ฅ ์ค์ฌ์ด ๋๋ ๊ฐ์ bIsTagger์ด๋ค.
bIsTagger == true โ ์ ๋
bIsTagger == false โ ๋๋ง์
์ด ๊ฐ์ CharacterBase์ ๋๊ณ , ํ๋ ์ด์ด์ Enemy AI๊ฐ ๋ชจ๋ ๊ณต์ ํ๋๋ก ํ๋ค.
ํด๋์ค ๊ตฌ์กฐ
์ ์ฒด ํด๋์ค ๊ตฌ์กฐ๋ ๋ค์์ฒ๋ผ ์ก์ ์ ์๋ค.
TagGameMode
โโ ํ์ฌ ํด ๊ด๋ฆฌ
โโ ์ต์ด ์ ๋ ์ง์
โโ ์ก๊ธฐ ์ฑ๊ณต ์ฒ๋ฆฌ
โโ ๊ฒ์ ์ข
๋ฃ ํ๋จ
TagCharacterBase
โโ bIsTagger
โโ TagIndicatorMesh
โโ SetTaggerState()
โโ TryCatchTarget()
โโ OnTaggerStateChanged()
PlayerTagCharacter
โโ ํ๋ ์ด์ด ์
๋ ฅ ์ฒ๋ฆฌ
EnemyTagCharacter
โโ AIController์ BehaviorTree ๊ธฐ๋ฐ ํ๋ ์ฒ๋ฆฌ
EnemyTagAIController
โโ Blackboard ๊ฐ ๊ฐฑ์
โโ BehaviorTree ์คํ
์ด๋ ๊ฒ ํ๋ฉด ์ ๋ ์ฌ๋ถ์ ๊ณตํต ์ํ ์ฒ๋ฆฌ๋ CharacterBase๊ฐ ๋ด๋นํ๊ณ ,
ํ๋ ์ด์ด ์กฐ์๊ณผ AI ํ๋จ์ ๊ฐ๊ฐ ๋ถ๋ฆฌํด์ ๊ด๋ฆฌํ ์ ์๋ค.
CharacterBase ์ญํ
TagCharacterBase๋ ํ๋ ์ด์ด์ AI๊ฐ ๊ณตํต์ผ๋ก ์ฌ์ฉํ๋ ๊ธฐ์ค ํด๋์ค๋ค.
์ฌ๊ธฐ์๋ ์ ๋์ก๊ธฐ ๊ฒ์์์ ๋ฐ๋์ ๊ณต์ ํด์ผ ํ๋ ์ํ์ ๊ธฐ๋ฅ์ ๋ฃ๋๋ค.
TagCharacterBase
โโ bIsTagger
โโ CatchRange
โโ CatchCooldown
โโ TagIndicatorMesh
โโ SetTaggerState()
โโ CanCatch()
โโ TryCatchTarget()
โโ GetNearestCatchTarget()
bIsTagger๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋จธ๋ฆฌ ์ ํ์๋ ํจ๊ป ๋ณ๊ฒฝํ๋ค.
SetTaggerState(true)
โ bIsTagger = true
โ TagIndicatorMesh Visible
SetTaggerState(false)
โ bIsTagger = false
โ TagIndicatorMesh Hidden
์ฆ, ์ ๋ ์ฌ๋ถ์ ์๊ฐ์ ํ์๊ฐ ๋ฐ๋ก ๋์ง ์๋๋ก
์ํ ๋ณ๊ฒฝ ํจ์ ์์์ ๊ฐ์ด ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด ์ข๋ค.
์ก๊ธฐ ์ฒ๋ฆฌ ๊ตฌ์กฐ
์ก๊ธฐ ๊ธฐ๋ฅ์ ์ ๋์ผ ๋๋ง ๊ฐ๋ฅํด์ผ ํ๋ค.
bIsTagger == true
โ ์ก๊ธฐ ๊ฐ๋ฅ
bIsTagger == false
โ ์ก๊ธฐ ๋ถ๊ฐ๋ฅ
์ก๊ธฐ ํ๋ฆ์ ๋ค์์ฒ๋ผ ์ ๋ฆฌํ ์ ์๋ค.
์ก๊ธฐ ์
๋ ฅ ๋๋ AI ์ก๊ธฐ ์๋
โ ํ์ฌ ์บ๋ฆญํฐ๊ฐ ์ ๋์ธ์ง ํ์ธ
โ ์ฟจํ์ ํ์ธ
โ ๋ฒ์ ๋ด ๋์ ํ์
โ ๋์์ด ์ ๋๊ฐ ์๋์ง ํ์ธ
โ GameMode์ ์ก๊ธฐ ์ฑ๊ณต ์์ฒญ
โ ์ญํ ๊ต์ฒด
์ค์ํ ์ ์ CharacterBase๊ฐ ์ง์ ํด์ ๋ฐ๊พธ์ง ์๊ณ ,
GameMode์ ์์ฒญํ๋ ๊ตฌ์กฐ๋ก ๊ฐ๋ ๊ฒ์ด๋ค.
CharacterBase
โ RequestCatch(Target)
โ TagGameMode
โ ProcessCatch(CurrentTagger, Target)
์ด๋ ๊ฒ ํด์ผ ํด ์ฆ๊ฐ, ๊ฒ์ ์ข ๋ฃ, ์ญํ ๊ต์ฒด ๊ฐ์ ๊ท์น์ด ํ ๊ณณ์์ ๊ด๋ฆฌ๋๋ค.
GameMode ์ญํ
TagGameMode๋ ๊ฒ์ ๊ท์น์ ๋ด๋นํ๋ค.
TagGameMode
โโ CurrentTurn
โโ MaxTurn = 4
โโ CurrentTagger
โโ AllPlayers
โโ StartGame()
โโ SelectFirstTagger()
โโ ProcessCatch()
โโ AdvanceTurn()
โโ EndGame()
๊ฒ์ ์์ ์ 4๋ช ์ค ํ ๋ช ์ ์ ๋๋ก ์ง์ ํ๋ค.
๊ฒ์ ์์
โ ๋ชจ๋ ์บ๋ฆญํฐ ๋ฑ๋ก
โ ์ต์ด ์ ๋ 1๋ช
์ ํ
โ ๋๋จธ์ง๋ ๋๋ง์ ์ํ
โ 1ํด ์์
์ก๊ธฐ ์ฑ๊ณต ์์๋ ๋ค์ ํ๋ฆ์ผ๋ก ์ฒ๋ฆฌํ๋ค.
์ก๊ธฐ ์ฑ๊ณต
โ ๊ธฐ์กด ์ ๋ bIsTagger = false
โ ์กํ ๋์ bIsTagger = true
โ CurrentTagger ๊ฐฑ์
โ CurrentTurn ์ฆ๊ฐ
โ 4ํด์ด๋ฉด ๊ฒ์ ์ข
๋ฃ
์ด ๊ตฌ์กฐ๋ก ํ๋ฉด ๊ท์น์ด ๋ช ํํด์ง๋ค.
ํ๋ ์ด์ด ์ ๋ ฅ ์ค๊ณ
ํ๋ ์ด์ด ์
๋ ฅ์ ํญ์ ๊ฐ์ ๋ฒํผ์ ๋๋ฌ๋,
ํ์ฌ ์ํ์ ๋ฐ๋ผ ๋์ ์ฌ๋ถ๊ฐ ๋ฌ๋ผ์ง๋๋ก ์ค๊ณํ๋ค.
MoveAction
LookAction
CatchAction
CatchAction์ ์ ๋์ผ ๋๋ง ์ค์ ๋ก ๋์ํ๋ค.
CatchAction ์
๋ ฅ
โ bIsTagger ํ์ธ
โ true๋ฉด TryCatchTarget()
โ false๋ฉด ๋ฌด์
์ด ๋ฐฉ์์ด ์ข์ ์ด์ ๋ ์
๋ ฅ ๋งคํ์ ๋งค๋ฒ ์ถ๊ฐ/์ญ์ ํ์ง ์์๋ ๋๊ณ ,
์ํ ๊ฒ์ฌ๋ง์ผ๋ก ๋์์ ์ ์ดํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
AI Blackboard ์ค๊ณ
AI๋ Blackboard ๊ฐ์ ๊ธฐ์ค์ผ๋ก BehaviorTree์์ ๋ถ๊ธฐํ๋ค.
Blackboard
โโ IsTagger
โโ CurrentTaggerActor
โโ TargetActor
โโ EscapeLocation
โโ LastKnownTaggerLocation
๊ฐ ๊ฐ์ ์ญํ ์ ๋ค์๊ณผ ๊ฐ๋ค.
| Key | ์ญํ |
|---|---|
| IsTagger | ํ์ฌ AI๊ฐ ์ ๋์ธ์ง ํ๋จ |
| CurrentTaggerActor | ํ์ฌ ์ ๋ ์กํฐ |
| TargetActor | ์ ๋์ผ ๋ ์ถ์ ํ ๋์ |
| EscapeLocation | ๋๋ง์์ผ ๋ ์ด๋ํ ์์น |
| LastKnownTaggerLocation | ๋ง์ง๋ง์ผ๋ก ์ธ์ํ ์ ๋ ์์น |
BehaviorTree ๊ตฌ์กฐ
BehaviorTree๋ ์ต์๋จ์์ ์ ๋ ์ฌ๋ถ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋๋๋ค.
Root
โโ Selector
โโ Sequence: ์ ๋ ํ๋
โ โโ Decorator: IsTagger == true
โ โโ FindNearestRunner
โ โโ MoveTo TargetActor
โ โโ TryCatch
โ
โโ Sequence: ๋๋ง์ ํ๋
โโ Decorator: IsTagger == false
โโ FindCurrentTagger
โโ CalculateEscapeLocation
โโ MoveTo EscapeLocation
์ด ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ Enemy AI๋ผ๋
์ ๋์ผ ๋๋ ์ถ๊ฒฉ์, ์๋ ๋๋ ๋๋ง์๋ก ์์ฐ์ค๋ฝ๊ฒ ๋์ํ๋ค.
์ ๋ AI ์ธ๋ถ ํ๋ฆ
์ ๋ AI๋ โ์ก์ ๋์ ์ฐพ๊ธฐ โ ์ถ๊ฒฉ โ ์ก๊ธฐโ๊ฐ ํต์ฌ์ด๋ค.
IsTagger == true
โ ์ฃผ๋ณ ์บ๋ฆญํฐ ํ์
โ bIsTagger == false ์ธ ๋์๋ง ํํฐ๋ง
โ ๊ฐ์ฅ ๊ฐ๊น์ด ๋์ ์ ํ
โ TargetActor์ ์ ์ฅ
โ MoveTo
โ CatchRange ์์ ๋ค์ด์ค๋ฉด TryCatch
๋์ ์ ํ ๊ธฐ์ค์ ์ฒ์์๋ ๊ฐ์ฅ ๊ฐ๊น์ด ๋์์ผ๋ก ์ก๊ณ ,
๋์ค์ ๋์ด๋์ ๋ฐ๋ผ ๋ฐ๊ฟ ์ ์๋ค.
1์์: ๊ฐ์ฅ ๊ฐ๊น์ด ๋์
2์์: ์์ผ ์์ ์๋ ๋์
3์์: ํ๋ ์ด์ด ์ฐ์ ์ถ์
๋๋ง AI ์ธ๋ถ ํ๋ฆ
๋๋ง AI๋ ํ์ฌ ์ ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ์ด๋ํ๋ค.
IsTagger == false
โ CurrentTaggerActor ํ์ธ
โ ์ ๋ ์์น์ ๋ด ์์น ๋น๊ต
โ ๋ฐ๋ ๋ฐฉํฅ ๊ณ์ฐ
โ NavMesh ์ ์ ํจ ์์น ํ์
โ EscapeLocation์ผ๋ก ์ด๋
๋จ์ํ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก๋ง ๋๋ง๊ฐ๋ฉด ๋ฒฝ์ ๋งํ ์ ์์ผ๋ฏ๋ก,
์ต์ข
์์น๋ NavMesh ๊ธฐ์ค์ผ๋ก ๋ณด์ ํ๋ ๊ฒ์ด ์ข๋ค.
๋๋ง ๋ฐฉํฅ = ๋ด ์์น - ์ ๋ ์์น
๋ชฉํ ์์น = ๋ด ์์น + ๋๋ง ๋ฐฉํฅ * ๊ฑฐ๋ฆฌ
NavMesh ProjectPointToNavigation
์ํ ๋๊ธฐํ ๊ตฌ์กฐ
์ ๋ ์ํ๊ฐ ๋ฐ๋๋ฉด ์ฌ๋ฌ ์์คํ ์ด ๊ฐ์ด ๊ฐฑ์ ๋์ด์ผ ํ๋ค.
SetTaggerState()
โ TagIndicatorMesh ํ์ ๊ฐฑ์
โ AI Blackboard IsTagger ๊ฐฑ์
โ Player UI ๊ฐฑ์
โ ์
๋ ฅ ๊ฐ๋ฅ ์ฌ๋ถ ๊ฐฑ์
๊ทธ๋์ ๋จ์ํ bIsTagger ๊ฐ๋ง ๋ฐ๊พธ๋ ๊ฒ์ด ์๋๋ผ,
์ํ ๋ณ๊ฒฝ์ฉ ํจ์๋ฅผ ๋ง๋ค์ด ํ ๋ฒ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ข๋ค.
ํด ๊ด๋ฆฌ ๊ตฌ์กฐ
์ด ๊ฒ์์ ์ด 4ํด์ผ๋ก ์งํ๋๋ฏ๋ก,
์ก๊ธฐ ์ฑ๊ณต์ด ๊ณง ํด ์งํ ์กฐ๊ฑด์ด ๋๋ค.
CurrentTurn = 1
MaxTurn = 4
์ก๊ธฐ ์ฑ๊ณต ์ CurrentTurn++
CurrentTurn > MaxTurn์ด๋ฉด ๊ฒ์ ์ข
๋ฃ
ํด๋ง๋ค ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋กํ๋ฉด ๋์ค์ ์นํจ ์กฐ๊ฑด๋ ์ฝ๊ฒ ๋ง๋ค ์ ์๋ค.
TurnResult
โโ TurnNumber
โโ PreviousTagger
โโ NewTagger
โโ CatchTime
์ต์ข ํ๋ฆ
์ ์ฒด ํ๋ฆ์ ๋ค์์ฒ๋ผ ์ ๋ฆฌํ ์ ์๋ค.
๊ฒ์ ์์
โ ์บ๋ฆญํฐ 4๋ช
๋ฑ๋ก
โ ์ต์ด ์ ๋ ์ง์
โ bIsTagger ์ํ ๋ฐ์
โ ์ ๋ ํ์ ํ์ฑํ
โ AI Blackboard ๊ฐฑ์
โ ํ๋ ์ด์ด ์
๋ ฅ ์ํ ๊ฐฑ์
โ ์ ๋๋ ์ถ๊ฒฉ
โ ๋๋ง์๋ ํํผ
โ ์ก๊ธฐ ์ฑ๊ณต
โ GameMode์์ ์ญํ ๊ต์ฒด
โ ํด ์ฆ๊ฐ
โ 4ํด ์ข
๋ฃ ์ ๊ฒ์ ์ข
๋ฃ
์ค๋์ ์ ๋ฆฌ
์ด๋ฒ ์ค๊ณ์ ํต์ฌ์
bIsTagger๋ฅผ ๋จ์ํ Boolean ๊ฐ์ผ๋ก๋ง ์ฐ๋ ๊ฒ์ด ์๋๋ผ,
๊ฒ์ ์ ์ฒด ํ๋ฆ์ ๋ฐ๊พธ๋ ์ค์ฌ ์ํ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
์ด ๊ฐ ํ๋๋ฅผ ๊ธฐ์ค์ผ๋ก
- ํ๋ ์ด์ด ์ ๋ ฅ
- AI BehaviorTree
- ๋จธ๋ฆฌ ์ ์ ๋ ํ์
- ์ก๊ธฐ ๊ฐ๋ฅ ์ฌ๋ถ
- ํด ์งํ
- ๊ฒ์ ์ข ๋ฃ ์กฐ๊ฑด
์ด ๋ชจ๋ ์ฐ๊ฒฐ๋๋ค.