From 141ac232f0371e48fc602dd165f4183b4d77ca78 Mon Sep 17 00:00:00 2001 From: baz Date: Fri, 14 Jun 2024 23:19:05 +0100 Subject: [PATCH] Add basic ai functionality --- Source/vampires/EnemyCharacter.cpp | 15 ++++++++++ Source/vampires/EnemyCharacter.h | 10 ++++++- Source/vampires/VampireAIController.cpp | 37 +++++++++++++++++++++++++ Source/vampires/VampireAIController.h | 3 ++ Source/vampires/VampireCharacter.cpp | 5 ++++ Source/vampires/VampireCharacter.h | 2 ++ 6 files changed, 71 insertions(+), 1 deletion(-) diff --git a/Source/vampires/EnemyCharacter.cpp b/Source/vampires/EnemyCharacter.cpp index c0b961d..4a160fe 100644 --- a/Source/vampires/EnemyCharacter.cpp +++ b/Source/vampires/EnemyCharacter.cpp @@ -5,6 +5,8 @@ AEnemyCharacter::AEnemyCharacter(const FObjectInitializer& ObjectInitializer) { + GetHealthComponent()->OnDamaged.BindUFunction(this, "OnDamaged"); + GetHealthComponent()->OnDeath.BindUFunction(this, "OnDeath"); } void AEnemyCharacter::BeginPlay() @@ -16,3 +18,16 @@ void AEnemyCharacter::Tick(float DeltaTime) { Super::Tick(DeltaTime); } + +UBehaviorTree* AEnemyCharacter::GetBehaviorTree() +{ + return BehaviorTree; +} + +void AEnemyCharacter::OnDamaged() +{ +} + +void AEnemyCharacter::OnDeath() +{ +} diff --git a/Source/vampires/EnemyCharacter.h b/Source/vampires/EnemyCharacter.h index d7dbf2b..f46b115 100644 --- a/Source/vampires/EnemyCharacter.h +++ b/Source/vampires/EnemyCharacter.h @@ -18,7 +18,7 @@ class VAMPIRES_API AEnemyCharacter : public AVampireCharacter private: UPROPERTY(EditDefaultsOnly, Meta = (AllowPrivateAccess = "true")) - UBehaviorTree* BehaviourTree; + UBehaviorTree* BehaviorTree; public: AEnemyCharacter(const FObjectInitializer& ObjectInitializer); @@ -28,4 +28,12 @@ protected: public: virtual void Tick(float DeltaTime) override; + + UBehaviorTree* GetBehaviorTree(); + + UFUNCTION() + virtual void OnDamaged(); + + UFUNCTION() + virtual void OnDeath(); }; diff --git a/Source/vampires/VampireAIController.cpp b/Source/vampires/VampireAIController.cpp index aaa833d..4947de2 100644 --- a/Source/vampires/VampireAIController.cpp +++ b/Source/vampires/VampireAIController.cpp @@ -3,8 +3,15 @@ #include "VampireAIController.h" +#include "BehaviorTree/BlackboardComponent.h" +#include "Components/CapsuleComponent.h" +#include "GameFramework/PawnMovementComponent.h" +#include "Kismet/GameplayStatics.h" + AVampireAIController::AVampireAIController(const FObjectInitializer& object_initializer) { + Blackboard = CreateDefaultSubobject(TEXT("Blackboard")); + BehaviorTree = CreateDefaultSubobject(TEXT("Behavior Tree")); } void AVampireAIController::BeginPlay() @@ -20,12 +27,42 @@ void AVampireAIController::Tick(float DeltaTime) void AVampireAIController::OnPossess(APawn* InPawn) { Super::OnPossess(InPawn); + + EnemyCharacter = Cast(InPawn); + check(EnemyCharacter); + EnemyCharacter->GetHealthComponent()->OnDamaged.BindUFunction(this, "OnDamaged"); + EnemyCharacter->GetHealthComponent()->OnDeath.BindUFunction(this, "OnDeath"); + + if (UBehaviorTree* bt = EnemyCharacter->GetBehaviorTree()) + { + Blackboard->InitializeBlackboard(*bt->BlackboardAsset); + BehaviorTree->StartTree(*bt); + Blackboard->SetValueAsObject("SelfActor", EnemyCharacter); + Blackboard->SetValueAsObject("Player", UGameplayStatics::GetPlayerCharacter(GetWorld(), 0)); + } } void AVampireAIController::OnDamaged(FDamageInfo info) { + if (EnemyCharacter->GetHealthComponent()->GetCurrentHealth() > 0.0f) + { + // TODO: Something + } } void AVampireAIController::OnDeath(FDamageInfo info) { + // TODO: Do stuff here + EnemyCharacter->DetachFromControllerPendingDestroy(); + EnemyCharacter->GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision); + EnemyCharacter->GetCapsuleComponent()->SetCollisionResponseToAllChannels(ECR_Ignore); + + if (UPawnMovementComponent* characterMovementComponent = EnemyCharacter->GetMovementComponent()) + { + characterMovementComponent->StopMovementImmediately(); + characterMovementComponent->StopActiveMovement(); + characterMovementComponent->SetComponentTickEnabled(false); + } + + EnemyCharacter->SetLifeSpan(0.1f); } diff --git a/Source/vampires/VampireAIController.h b/Source/vampires/VampireAIController.h index 755f1a0..8a2407e 100644 --- a/Source/vampires/VampireAIController.h +++ b/Source/vampires/VampireAIController.h @@ -4,6 +4,7 @@ #include "CoreMinimal.h" #include "AIController.h" +#include "EnemyCharacter.h" #include "HealthComponent.h" #include "PlayerCharacter.h" #include "BehaviorTree/BehaviorTreeComponent.h" @@ -24,6 +25,8 @@ private: APlayerCharacter* PlayerCharacter; + AEnemyCharacter* EnemyCharacter; + public: AVampireAIController(const FObjectInitializer& object_initializer); diff --git a/Source/vampires/VampireCharacter.cpp b/Source/vampires/VampireCharacter.cpp index a3b34d8..9e2f3d9 100644 --- a/Source/vampires/VampireCharacter.cpp +++ b/Source/vampires/VampireCharacter.cpp @@ -34,3 +34,8 @@ void AVampireCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputCo } +UHealthComponent* AVampireCharacter::GetHealthComponent() +{ + return HealthComponent; +} + diff --git a/Source/vampires/VampireCharacter.h b/Source/vampires/VampireCharacter.h index ba02b05..4314bea 100644 --- a/Source/vampires/VampireCharacter.h +++ b/Source/vampires/VampireCharacter.h @@ -32,4 +32,6 @@ public: // Called to bind functionality to input virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override; + UHealthComponent* GetHealthComponent(); + };