๊ตฌํ ๋ฐฐ๊ฒฝ
์ด์ ์๋ ์ ๋/๋๋ง์ ์ํ๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒ์ ํ๋ฆ๊ณผ AI ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ๋ ๋จ๊ณ์๋ค๋ฉด,
์ค๋์ ์ค์ ์ธ๋ฆฌ์ผ C++ ์ฝ๋์ BehaviorTree๋ฅผ ์ฐ๊ฒฐํด์
AI๊ฐ ์ค์ ๋ก ์ถ์ ํ๊ณ ๋๋ง๊ฐ๋ ํ๋ฆ์ ๊ตฌํํ๋ ์์
์ ์งํํ๋ค.
์ค๋์ BehaviorTree์์ ์ฌ์ฉํ Task๋ค์ ์ค์ C++ ํด๋์ค๋ก ๊ตฌํํ๋ค.
BTTask_FindNearestRunner
BTTask_CalculateEscapeLocation
BTTask_TryCatchTarget
์ ๋ AI๊ฐ ๊ฐ์ฅ ๊ฐ๊น์ด ๋๋ง์๋ฅผ ํ์ํ๋ ๋ก์ง์ด๋ค.
ํ์ฌ Pawn ๊ฐ์ ธ์ค๊ธฐ
โ IsTagger ํ์ธ
โ ๋ฑ๋ก๋ ์บ๋ฆญํฐ ์ํ
โ ์ ๋๊ฐ ์๋ ๋์๋ง ํํฐ๋ง
โ ๊ฑฐ๋ฆฌ ๊ณ์ฐ
โ ๊ฐ์ฅ ๊ฐ๊น์ด ๋์ ์ ํ
โ Blackboard TargetActor ์ ์ฅ
๊ฑฐ๋ฆฌ ๊ณ์ฐ์ FVector::DistSquared ๊ธฐ๋ฐ์ผ๋ก ์ฒ๋ฆฌํด์
๋ถํ์ํ sqrt ์ฐ์ฐ์ ์ค์๋ค.
const float DistSq = FVector::DistSquared(
SelfLocation,
CandidateLocation
);
Blackboard ์ ์ฅ์ ์๋ ๋ฐฉ์์ผ๋ก ์ฐ๊ฒฐํ๋ค.
Blackboard->SetValueAsObject(
TEXT("TargetActor"),
BestTarget
);
๋๋ง์ AI๋ ์ ๋ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ์ด๋ํ๋๋ก ๊ตฌํํ๋ค.
ํ์ฌ ์ ๋ ์์น ๊ฐ์ ธ์ค๊ธฐ
โ ๋ด ์์น์ ๋ฐฉํฅ ๊ณ์ฐ
โ Normalize
โ ์ผ์ ๊ฑฐ๋ฆฌ๋งํผ ์ด๋ ์์น ๊ณ์ฐ
โ NavMesh ๊ธฐ์ค ์์น ๋ณด์
โ EscapeLocation ์ ์ฅ
ํต์ฌ์ ๋จ์ ๋ฐฉํฅ ๊ณ์ฐ๋ง ํ์ง ์๊ณ
ProjectPointToNavigation()์ผ๋ก ์ค์ ์ด๋ ๊ฐ๋ฅํ ์์น๋ฅผ ์ฐพ๋ ๋ถ๋ถ์ด์๋ค.
NavSys->ProjectPointToNavigation(
RawEscapeLocation,
ProjectedLocation
);
์ด ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์ผ๋ฉด ๋ฒฝ์ด๋ ์ฅ์ ๋ฌผ ์ชฝ์ผ๋ก ์ด๋ ์์น๊ฐ ์กํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ค.
์ฒ์์๋ MoveTo ์๋ฃ ํ ์ก๊ธฐ ํ์ ์ ์๋ํ๋๋ฐ,
๋ฐ์์ด ๋๋ ค์ ๊ตฌ์กฐ๋ฅผ ์์ ํ๋ค.
BTService_TryCatchTarget
โ ์ผ์ ์ฃผ๊ธฐ Tick
โ TryCatchTarget() ํธ์ถ
โ CatchRange ์์ด๋ฉด ์ฆ์ ์ก๊ธฐ
์๋น์ค Tick ๊ฐ๊ฒฉ์ ์๋์ฒ๋ผ ์งง๊ฒ ์ค์ ํ๋ค.
Interval = 0.15f;
RandomDeviation = 0.05f;
์ด ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํ๋๊น
์ถ๊ฒฉ ๋์ค์๋ ๊ณ์ ์ก๊ธฐ ํ์ ์ ์๋ํด์
AI ๋ฐ์์ด ํจ์ฌ ์์ฐ์ค๋ฌ์์ก๋ค.
์ค๋ ๊ตฌํ์์ ๊ฐ์ฅ ํฐ ๋ถ๋ถ์
AI ๊ฐ์ง ๊ตฌ์กฐ๋ฅผ ์ค์ ๋ก ๋ถ์ธ ๋ถ๋ถ์ด์๋ค.
UAIPerceptionComponent
UAISenseConfig_Sight
UAISenseConfig_Hearing
AIController์์ PerceptionComponent๋ฅผ ์์ฑํ๊ณ ,
์์ผ์ ์ฒญ๊ฐ ๊ฐ์ง๋ฅผ ๊ฐ๊ฐ ์ค์ ํ๋ค.
PerceptionComp->ConfigureSense(*SightConfig);
PerceptionComp->ConfigureSense(*HearingConfig);
์ ๋ AI๋ ์์ผ ์์ ๋๋ง์๊ฐ ๋ค์ด์ค๋ฉด
TargetActor๋ฅผ Blackboard์ ์ ์ฅํ๋๋ก ํ๋ค.
๋๋ง์ ๊ฐ์ง
โ WasSuccessfullySensed ํ์ธ
โ Blackboard TargetActor ์ ์ฅ
โ LastKnownRunnerLocation ์ ์ฅ
BB->SetValueAsObject(
TEXT("TargetActor"),
Actor
);
์์ผ๋ฅผ ์์ผ๋ฉด TargetActor๋ ์ ๊ฑฐํ๊ณ ,
๋ง์ง๋ง ์์น๋ง ์ ์งํ๋๋ก ์ฒ๋ฆฌํ๋ค.
BB->ClearValue(TEXT("TargetActor"));
๋๋ง์๋ ์ด๋ ์ค ์ผ์ ์๋ ์ด์์ด๋ฉด
Footstep Noise๋ฅผ ๋ฐ์์ํค๋๋ก ๊ตฌํํ๋ค.
์๋ ์ฒดํฌ
โ Noise Timer ์ฆ๊ฐ
โ ์ผ์ ์ฃผ๊ธฐ๋ง๋ค Noise ๋ฐ์
โ Hearing ๊ฐ์ง
โ LastHeardLocation ์ ์ฅ
Noise ๋ฐ์์ ์๋ ํจ์๋ก ์ฒ๋ฆฌํ๋ค.
UAISense_Hearing::ReportNoiseEvent(
GetWorld(),
GetActorLocation(),
FootstepNoiseLoudness,
this
);
์ด ๊ตฌ์กฐ ๋๋ถ์
๊ตฌ์กฐ๋ฌผ ๋ค์ ์จ์ด ์์ด๋ ๋ฐ์ด๋ค๋๋ฉด
์ ๋ AI๊ฐ ์์น๋ฅผ ์ถ์ ํ ์ ์๊ฒ ๋๋ค.
๊ตฌ์กฐ๋ฌผ ๋ค์ ์จ์ ์ ์๋ ๊ตฌ์กฐ๋ ๊ฐ์ด ์ ์ฉํ๋ค.
์ค์ํ๋ ๋ถ๋ถ์ Collision ์ค์ ์ด์๋ค.
Visibility = Block
์ด ์ค์ ์ด ๋์ด ์์ด์ผ
AI Sight LineTrace๊ฐ ๊ตฌ์กฐ๋ฌผ์ ๋งํ๋ฉด์
๋๋ง์๊ฐ ์์ผ์์ ์ฌ๋ผ์ก๋ค.
๋ณ๋ ๋ณต์กํ ์ฝ๋ ์์ด๋
์ธ๋ฆฌ์ผ ๊ธฐ๋ณธ Perception ๊ตฌ์กฐ๋ง์ผ๋ก ๊ฝค ์์ฐ์ค๋ฝ๊ฒ ๋์ํ๋ค.
๊ธฐ์กด Blackboard์ ์๋ Key๋ค์ ์ถ๊ฐํ๋ค.
IsTagger
TargetActor
EscapeLocation
LastKnownRunnerLocation
LastHeardLocation
ํนํ LastKnownRunnerLocation๊ณผ
LastHeardLocation์ด ๋ค์ด๊ฐ๋ฉด์
AI๊ฐ ๋จ์ ํ์ฌ ์์น๋ง ๋ฐ๋ผ๊ฐ๋ ๊ตฌ์กฐ์์ ๋ฒ์ด๋๊ธฐ ์์ํ๋ค.
์ต์ข ์ ์ผ๋ก๋ ์๋ ํ๋ฆ์ผ๋ก ์ ๋ฆฌํ๋ค.
์ ๋
โ TargetActor ์์ผ๋ฉด ์ถ๊ฒฉ
โ ์ถ๊ฒฉ ์ค ๊ณ์ ์ก๊ธฐ ์๋
โ ์ ๋ณด์ด๋ฉด ๋ง์ง๋ง ์์น ์์
๋๋ง์
โ ์ ๋ ๋ฐ๋ ๋ฐฉํฅ ๊ณ์ฐ
โ NavMesh ์์น ์ด๋
MoveTo๋ง ์ฌ์ฉํ๋ ๋จ์ AI๋ณด๋ค
ํจ์ฌ ์์ฐ์ค๋ฝ๊ฒ ๋์ํ๋ ๋๋์ด ๋ฌ๋ค.
- ์ค๋์ ๋จ์ BehaviorTree ์ค๊ณ ์์ค์์ ๋ฒ์ด๋,
Perception๊ณผ Blackboard๋ฅผ ์ค์ ์ฐ๊ฒฐํด์ ๊ฐ์ง ๊ธฐ๋ฐ AI ํ๋ฆ์ ๊ตฌํํ๋ค.- ํนํ ์์ผ, ๋ฐ์๋ฆฌ, ๋ง์ง๋ง ๊ฐ์ง ์์น ๊ฐ์ ์์๋ค์ด ๋ค์ด๊ฐ๋ฉด์
AI ์์ง์์ด ๋จ์ ์ขํ ์ด๋๋ณด๋ค ํจ์ฌ ์์ฐ์ค๋ฝ๊ฒ ๋ณด์ด๊ธฐ ์์ํ๋ค.