Add basic ai functionality
This commit is contained in:
		
							parent
							
								
									3bd49b0b90
								
							
						
					
					
						commit
						141ac232f0
					
				| @ -5,6 +5,8 @@ | |||||||
| 
 | 
 | ||||||
| AEnemyCharacter::AEnemyCharacter(const FObjectInitializer& ObjectInitializer) | AEnemyCharacter::AEnemyCharacter(const FObjectInitializer& ObjectInitializer) | ||||||
| { | { | ||||||
|  | 	GetHealthComponent()->OnDamaged.BindUFunction(this, "OnDamaged"); | ||||||
|  | 	GetHealthComponent()->OnDeath.BindUFunction(this, "OnDeath"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void AEnemyCharacter::BeginPlay() | void AEnemyCharacter::BeginPlay() | ||||||
| @ -16,3 +18,16 @@ void AEnemyCharacter::Tick(float DeltaTime) | |||||||
| { | { | ||||||
| 	Super::Tick(DeltaTime); | 	Super::Tick(DeltaTime); | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | UBehaviorTree* AEnemyCharacter::GetBehaviorTree() | ||||||
|  | { | ||||||
|  | 	return BehaviorTree; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void AEnemyCharacter::OnDamaged() | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void AEnemyCharacter::OnDeath() | ||||||
|  | { | ||||||
|  | } | ||||||
|  | |||||||
| @ -18,7 +18,7 @@ class VAMPIRES_API AEnemyCharacter : public AVampireCharacter | |||||||
| private: | private: | ||||||
| 
 | 
 | ||||||
| 	UPROPERTY(EditDefaultsOnly, Meta = (AllowPrivateAccess = "true")) | 	UPROPERTY(EditDefaultsOnly, Meta = (AllowPrivateAccess = "true")) | ||||||
| 	UBehaviorTree* BehaviourTree; | 	UBehaviorTree* BehaviorTree; | ||||||
| 	 | 	 | ||||||
| public: | public: | ||||||
| 	AEnemyCharacter(const FObjectInitializer& ObjectInitializer); | 	AEnemyCharacter(const FObjectInitializer& ObjectInitializer); | ||||||
| @ -28,4 +28,12 @@ protected: | |||||||
| 
 | 
 | ||||||
| public: | public: | ||||||
| 	virtual void Tick(float DeltaTime) override; | 	virtual void Tick(float DeltaTime) override; | ||||||
|  | 
 | ||||||
|  | 	UBehaviorTree* GetBehaviorTree(); | ||||||
|  | 
 | ||||||
|  | 	UFUNCTION() | ||||||
|  | 	virtual void OnDamaged(); | ||||||
|  | 
 | ||||||
|  | 	UFUNCTION() | ||||||
|  | 	virtual void OnDeath(); | ||||||
| }; | }; | ||||||
|  | |||||||
| @ -3,8 +3,15 @@ | |||||||
| 
 | 
 | ||||||
| #include "VampireAIController.h" | #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) | AVampireAIController::AVampireAIController(const FObjectInitializer& object_initializer) | ||||||
| { | { | ||||||
|  | 	Blackboard = CreateDefaultSubobject<UBlackboardComponent>(TEXT("Blackboard")); | ||||||
|  | 	BehaviorTree = CreateDefaultSubobject<UBehaviorTreeComponent>(TEXT("Behavior Tree")); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void AVampireAIController::BeginPlay() | void AVampireAIController::BeginPlay() | ||||||
| @ -20,12 +27,42 @@ void AVampireAIController::Tick(float DeltaTime) | |||||||
| void AVampireAIController::OnPossess(APawn* InPawn) | void AVampireAIController::OnPossess(APawn* InPawn) | ||||||
| { | { | ||||||
| 	Super::OnPossess(InPawn); | 	Super::OnPossess(InPawn); | ||||||
|  | 
 | ||||||
|  | 	EnemyCharacter = Cast<AEnemyCharacter>(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) | void AVampireAIController::OnDamaged(FDamageInfo info) | ||||||
| { | { | ||||||
|  | 	if (EnemyCharacter->GetHealthComponent()->GetCurrentHealth() > 0.0f) | ||||||
|  | 	{ | ||||||
|  | 		// TODO: Something
 | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void AVampireAIController::OnDeath(FDamageInfo info) | 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); | ||||||
| } | } | ||||||
|  | |||||||
| @ -4,6 +4,7 @@ | |||||||
| 
 | 
 | ||||||
| #include "CoreMinimal.h" | #include "CoreMinimal.h" | ||||||
| #include "AIController.h" | #include "AIController.h" | ||||||
|  | #include "EnemyCharacter.h" | ||||||
| #include "HealthComponent.h" | #include "HealthComponent.h" | ||||||
| #include "PlayerCharacter.h" | #include "PlayerCharacter.h" | ||||||
| #include "BehaviorTree/BehaviorTreeComponent.h" | #include "BehaviorTree/BehaviorTreeComponent.h" | ||||||
| @ -24,6 +25,8 @@ private: | |||||||
| 
 | 
 | ||||||
| 	APlayerCharacter* PlayerCharacter; | 	APlayerCharacter* PlayerCharacter; | ||||||
| 
 | 
 | ||||||
|  | 	AEnemyCharacter* EnemyCharacter; | ||||||
|  | 
 | ||||||
| public: | public: | ||||||
| 	AVampireAIController(const FObjectInitializer& object_initializer); | 	AVampireAIController(const FObjectInitializer& object_initializer); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -34,3 +34,8 @@ void AVampireCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputCo | |||||||
| 
 | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | UHealthComponent* AVampireCharacter::GetHealthComponent() | ||||||
|  | { | ||||||
|  | 	return HealthComponent; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | |||||||
| @ -32,4 +32,6 @@ public: | |||||||
| 	// Called to bind functionality to input
 | 	// Called to bind functionality to input
 | ||||||
| 	virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override; | 	virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override; | ||||||
| 
 | 
 | ||||||
|  | 	UHealthComponent* GetHealthComponent(); | ||||||
|  | 
 | ||||||
| }; | }; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user