Dev4 Npc 이동
블루프린트로 먼저 구현해본 npc 이동 + 속도 조정
그리고 이걸 c++로 바꾸려는데 상당히 애먹음…
유데미의 도움을 받아 적 ai 이동을 참고하여 구현함
헤더 파일 (원래 틱 함수로 했었는데 변경함)
public:
AYaroCharacter();
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "AI")
class AAIController* AIController;
//virtual void Tick(float DeltaTime) override;
void MoveToPlayer();
protected:
virtual void BeginPlay() override;
cpp파일
BeginPlay()에서 컨트롤러 캐스트하여 할당
void AYaroCharacter::BeginPlay()
{
Super::BeginPlay();
AIController = Cast<AAIController>(GetController());
MoveToPlayer();
}
원래 틱 함수에서 딜레이를 넣었었는데 한 번만 딜레이 적용되고 그 후에 딜레이 적용이 되지 않아서 틱 함수에 넣지 않고
따로 만든 이동 함수에 넣음
void AYaroCharacter::MoveToPlayer()
{
FTimerHandle WaitHandle;
float WaitTime = 1.5f; // 딜레이 타임 설정
GetWorld()->GetTimerManager().SetTimer(WaitHandle, FTimerDelegate::CreateLambda([&]()
{
ACharacter* p = UGameplayStatics::GetPlayerCharacter(this, 0);
AMain* player = Cast<AMain>(p);
float distance = GetDistanceTo(player);
if (distance >= 500.f) //일정 거리 이상 떨어져있다면 속도 높여 달리기
{
//UE_LOG(LogTemp, Log, TEXT("%s"), *(this->GetName()));
if ((this->GetName()).Contains("Momo"))
{
GetCharacterMovement()->MaxWalkSpeed = 600.f;
}
else if ((this->GetName()).Contains("Zizi") || (this->GetName()).Contains("Vivi"))
{
GetCharacterMovement()->MaxWalkSpeed = 500.f;
}
else
{
GetCharacterMovement()->MaxWalkSpeed = 450.f;
}
}
else //가깝다면 속도 낮춰 걷기
{
if ((this->GetName()).Contains("Momo"))
{
GetCharacterMovement()->MaxWalkSpeed = 300.f;
}
else if ((this->GetName()).Contains("Zizi") || (this->GetName()).Contains("Vivi"))
{
GetCharacterMovement()->MaxWalkSpeed = 250.f;
}
else
{
GetCharacterMovement()->MaxWalkSpeed = 225.f;
}
}
FAIMoveRequest MoveRequest;
MoveRequest.SetGoalActor(player);
MoveRequest.SetAcceptanceRadius(5.f);
FNavPathSharedPtr NavPath;
AIController->MoveTo(MoveRequest, &NavPath);
}), WaitTime, true); //딜레이 시간 적용하여 계속 반복
}
각 캐릭터 별로 이동 속도가 조금씩 다름