1 minute read

블루프린트로 먼저 구현해본 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);	//딜레이 시간 적용하여 계속 반복
}

각 캐릭터 별로 이동 속도가 조금씩 다름

영상

Updated: