Add AIControlHub for AI Alert Level Synchronisation
This commit is contained in:
parent
a86eb14b35
commit
13e86b5288
BIN
EndlessVendetta/Content/AI/Enemy/Basic/BP_AIControlHub.uasset
(Stored with Git LFS)
Normal file
BIN
EndlessVendetta/Content/AI/Enemy/Basic/BP_AIControlHub.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
59
EndlessVendetta/Source/EndlessVendetta/AI/AIControlHub.cpp
Normal file
59
EndlessVendetta/Source/EndlessVendetta/AI/AIControlHub.cpp
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "AIControlHub.h"
|
||||||
|
|
||||||
|
#include "EnemyCharacter.h"
|
||||||
|
|
||||||
|
|
||||||
|
// Sets default values
|
||||||
|
AAIControlHub::AAIControlHub()
|
||||||
|
{
|
||||||
|
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
|
||||||
|
PrimaryActorTick.bCanEverTick = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called when the game starts or when spawned
|
||||||
|
void AAIControlHub::BeginPlay()
|
||||||
|
{
|
||||||
|
Super::BeginPlay();
|
||||||
|
|
||||||
|
for (AEnemyCharacter* EnemyActor : EnemyActors)
|
||||||
|
{
|
||||||
|
EnemyActor->SubscribeToAlertLevelEvent(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called every frame
|
||||||
|
void AAIControlHub::Tick(float DeltaTime)
|
||||||
|
{
|
||||||
|
Super::Tick(DeltaTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIControlHub::IncreaseAlertLevel()
|
||||||
|
{
|
||||||
|
AlertLevel = FMath::Clamp(AlertLevel + 1, 0, 3);
|
||||||
|
OnAlertLevelChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIControlHub::DecreaseAlertLevel()
|
||||||
|
{
|
||||||
|
AlertLevel = FMath::Clamp(AlertLevel - 1, 0, 3);
|
||||||
|
OnAlertLevelChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIControlHub::SetAlertLevel(int NewAlertLevel)
|
||||||
|
{
|
||||||
|
AlertLevel = FMath::Clamp(NewAlertLevel, 0, 3);
|
||||||
|
OnAlertLevelChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
int AAIControlHub::GetAlertLevel() const
|
||||||
|
{
|
||||||
|
return AlertLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIControlHub::OnAlertLevelChanged() const
|
||||||
|
{
|
||||||
|
AlertLevelEvent.Broadcast(AlertLevel);
|
||||||
|
}
|
41
EndlessVendetta/Source/EndlessVendetta/AI/AIControlHub.h
Normal file
41
EndlessVendetta/Source/EndlessVendetta/AI/AIControlHub.h
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "EnemyCharacter.h"
|
||||||
|
#include "GameFramework/Actor.h"
|
||||||
|
#include "AIControlHub.generated.h"
|
||||||
|
|
||||||
|
UCLASS()
|
||||||
|
class ENDLESSVENDETTA_API AAIControlHub : public AActor
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
public:
|
||||||
|
// Sets default values for this actor's properties
|
||||||
|
AAIControlHub();
|
||||||
|
|
||||||
|
DECLARE_EVENT_OneParam(AAI_EnemyController, FAlertLevelEvent, int);
|
||||||
|
FAlertLevelEvent AlertLevelEvent;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// Called when the game starts or when spawned
|
||||||
|
virtual void BeginPlay() override;
|
||||||
|
|
||||||
|
public:
|
||||||
|
// Called every frame
|
||||||
|
virtual void Tick(float DeltaTime) override;
|
||||||
|
|
||||||
|
void IncreaseAlertLevel();
|
||||||
|
void DecreaseAlertLevel();
|
||||||
|
void SetAlertLevel(int NewAlertLevel);
|
||||||
|
int GetAlertLevel() const;
|
||||||
|
void OnAlertLevelChanged() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
int AlertLevel = 0;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AI", meta = (AllowPrivateAccess = "true"))
|
||||||
|
TArray<AEnemyCharacter*> EnemyActors;
|
||||||
|
};
|
@ -26,11 +26,12 @@ public:
|
|||||||
virtual void Tick(float DeltaTime) override;
|
virtual void Tick(float DeltaTime) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
UPROPERTY()
|
||||||
class UAISenseConfig_Sight* SightConfig;
|
class UAISenseConfig_Sight* SightConfig;
|
||||||
|
UPROPERTY()
|
||||||
class UAISenseConfig_Hearing* HearingConfig;
|
class UAISenseConfig_Hearing* HearingConfig;
|
||||||
void SetupPerceptionSystem();
|
void SetupPerceptionSystem();
|
||||||
|
|
||||||
UFUNCTION()
|
UFUNCTION()
|
||||||
void OnTargetPerceptionUpdated(AActor* Actor, FAIStimulus const Stimulus);
|
void OnTargetPerceptionUpdated(AActor* Actor, FAIStimulus const Stimulus);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -3,6 +3,10 @@
|
|||||||
|
|
||||||
#include "EnemyCharacter.h"
|
#include "EnemyCharacter.h"
|
||||||
|
|
||||||
|
#include "AIControlHub.h"
|
||||||
|
#include "AIController.h"
|
||||||
|
#include "BehaviorTree/BlackboardComponent.h"
|
||||||
|
|
||||||
|
|
||||||
class UAISense_Sight;
|
class UAISense_Sight;
|
||||||
// Sets default values
|
// Sets default values
|
||||||
@ -24,3 +28,13 @@ void AEnemyCharacter::Tick(float DeltaTime)
|
|||||||
{
|
{
|
||||||
Super::Tick(DeltaTime);
|
Super::Tick(DeltaTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AEnemyCharacter::SubscribeToAlertLevelEvent(AAIControlHub* ControlHub)
|
||||||
|
{
|
||||||
|
AlertLevelDelegateHandle = ControlHub->AlertLevelEvent.AddUObject(this, &AEnemyCharacter::SetAlertLevel);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AEnemyCharacter::SetAlertLevel(const int NewAlertLevel) const
|
||||||
|
{
|
||||||
|
Cast<AAIController>(GetController())->GetBlackboardComponent()->SetValueAsInt("AlertLevel", NewAlertLevel);
|
||||||
|
}
|
||||||
|
@ -24,4 +24,9 @@ protected:
|
|||||||
public:
|
public:
|
||||||
// Called every frame
|
// Called every frame
|
||||||
virtual void Tick(float DeltaTime) override;
|
virtual void Tick(float DeltaTime) override;
|
||||||
|
void SubscribeToAlertLevelEvent(class AAIControlHub* ControlHub);
|
||||||
|
|
||||||
|
private:
|
||||||
|
FDelegateHandle AlertLevelDelegateHandle;
|
||||||
|
void SetAlertLevel(int NewAlertLevel) const;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user