기존에는:
문제:
BP_LanePathManager
↓
Spawner
↓
Monster
↓
AIController
↓
BehaviorTree
UENUM(BlueprintType)
enum class ELaneType : uint8
{
Left,
Mid,
Right
};
UPROPERTY(EditAnywhere)
TArray<AActor*> LeftLanePoints;
UPROPERTY(EditAnywhere)
TArray<AActor*> MidLanePoints;
UPROPERTY(EditAnywhere)
TArray<AActor*> RightLanePoints;
각 LanePoint는 월드에 배치된 TargetPoint.
ELaneType SpawnLane = WaveData.LaneType;
FVector SpawnLocation = LaneManager->GetSpawnLocation(SpawnLane);
APotatoMonster* Monster = GetWorld()->SpawnActor<APotatoMonster>(...);
Monster->InitLane(SpawnLane);
Spawner는:
UPROPERTY()
ELaneType CurrentLane;
Monster는:
OnPossess 시:
Blackboard->SetValueAsEnum("LaneType", (uint8)Monster->CurrentLane);
Blackboard->SetValueAsInt("LaneIndex", 0);
LaneIndex++;
NextTarget = LanePoints[LaneIndex];
Blackboard->SetValueAsObject("MoveTarget", NextTarget);
LanePoint를 월드에 배치하므로:
AI는:
경로 구조는:
FVector SpawnLoc = BaseSpawnLoc;
SpawnLoc += FVector(0, FMath::RandRange(-100, 100), 0);
Wave Data
↓
Spawner (Lane 결정)
↓
LaneManager (Spawn 위치 + Path 제공)
↓
Monster (Lane 저장)
↓
AIController (Blackboard 설정)
↓
BehaviorTree (MoveTo 반복)