Added NPC logic

This commit is contained in:
2026-06-01 22:04:31 +03:00
parent 06fb3353b2
commit a87964e119
37 changed files with 156 additions and 41 deletions
+22 -4
View File
@@ -2,8 +2,12 @@
#include "NPC.h"
#include "BrainComponent.h"
#include "NPCTypeDefinition.h"
#include "NPCAIController.h"
#include "NPCTargetLocation.h"
#include "BehaviorTree/BlackboardComponent.h"
#include "Components/SkeletalMeshComponent.h"
#include "GameFramework/CharacterMovementComponent.h"
@@ -58,15 +62,26 @@ void ANPC::ActivateFromPool(const FVector& Location, const FRotator& Rotation)
Move->SetComponentTickEnabled(true);
Move->SetMovementMode(MOVE_Walking);
}
OnActivatedFromPool();
if (ANPCAIController* NPCController = Cast<ANPCAIController>(GetController()))
{
NPCController->RunCustomBehaviorTree();
NPCController->GetBlackboardComponent()->SetValueAsBool(TEXT("bHasReacted"), false);
}
}
void ANPC::DeactivateToPool()
{
// Drop any active observation so a pooled-out NPC stops contributing to the player's embarrassment.
if (ANPCAIController* NPCController = Cast<ANPCAIController>(GetController()))
{
NPCController->ClearObservation();
if (UBrainComponent* Brain = NPCController->GetBrainComponent())
{
Brain->StopLogic(TEXT("Moved to pool"));
}
NPCController->ClearFocus(EAIFocusPriority::Default);
}
if (UCharacterMovementComponent* Move = GetCharacterMovement())
{
@@ -74,9 +89,12 @@ void ANPC::DeactivateToPool()
Move->DisableMovement();
Move->SetComponentTickEnabled(false);
}
if (TargetLocationActor)
{
TargetLocationActor->Release(this);
}
SetActorHiddenInGame(true);
SetActorEnableCollision(false);
OnDeactivatedToPool();
}
+3 -5
View File
@@ -7,6 +7,7 @@
#include "NPCType.h"
#include "NPC.generated.h"
class ANPCTargetLocation;
class UNPCTypeDefinition;
UCLASS()
@@ -44,9 +45,6 @@ public:
void DeactivateToPool();
protected:
UFUNCTION(BlueprintImplementableEvent, Category = "NPC")
void OnActivatedFromPool();
UFUNCTION(BlueprintImplementableEvent, Category = "NPC")
void OnDeactivatedToPool();
UPROPERTY(BlueprintReadWrite, Category = "NPC")
TObjectPtr<ANPCTargetLocation> TargetLocationActor;
};
@@ -45,6 +45,11 @@ void ANPCAIController::ClearObservation()
}
}
void ANPCAIController::RunCustomBehaviorTree()
{
RunBehaviorTree(BehaviorTreeAsset);
}
float ANPCAIController::GetObservationWeight() const
{
if (const ANPC* NPC = Cast<ANPC>(GetPawn()))
+1
View File
@@ -27,6 +27,7 @@ public:
// Clears any active observation of the player (used on un-possess and when the NPC is pooled out).
void ClearObservation();
void RunCustomBehaviorTree();
protected:
UFUNCTION()
@@ -0,0 +1,29 @@
// © 2025 Naked People Team. All Rights Reserved.
#include "NPCTargetLocation.h"
#include "NPC.h"
ANPCTargetLocation::ANPCTargetLocation()
{
PrimaryActorTick.bCanEverTick = false;
}
bool ANPCTargetLocation::TryClaim(ANPC* InClaimant)
{
if (Claimant.IsValid() && Claimant.Get() != InClaimant)
return false;
Claimant = InClaimant;
return true;
}
void ANPCTargetLocation::Release(ANPC* Requester)
{
if (!Claimant.IsValid() || Claimant.Get() != Requester)
return;
Claimant = nullptr;
}
@@ -0,0 +1,31 @@
// © 2025 Naked People Team. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "NPCTargetLocation.generated.h"
class ANPC;
UCLASS()
class NAKEDDESIRE_API ANPCTargetLocation : public AActor
{
GENERATED_BODY()
public:
ANPCTargetLocation();
UFUNCTION(BlueprintCallable)
bool TryClaim(ANPC* InClaimant);
UFUNCTION(BlueprintPure)
bool IsClaimed() const { return Claimant.IsValid(); }
UFUNCTION(BlueprintCallable)
void Release(ANPC* Requester);
private:
UPROPERTY()
TWeakObjectPtr<ANPC> Claimant = nullptr;
};