Create TaskCreateLineOfSight
This commit is contained in:
parent
2ab85e21d7
commit
e001931bb6
|
@ -0,0 +1,62 @@
|
|||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
|
||||
|
||||
#include "TaskCheckLineOfSight.h"
|
||||
#include <BehaviorTree/BlackboardComponent.h>
|
||||
#include "NakatomiCharacter.h"
|
||||
#include "PlayerCharacter.h"
|
||||
|
||||
EBTNodeResult::Type UTaskCheckLineOfSight::ExecuteTask(UBehaviorTreeComponent& owner, uint8* memory)
|
||||
{
|
||||
auto BlackboardComponent = owner.GetBlackboardComponent();
|
||||
|
||||
if (!BlackboardComponent)
|
||||
{
|
||||
return EBTNodeResult::Failed;
|
||||
}
|
||||
|
||||
auto selfActor = Cast<ANakatomiCharacter>(
|
||||
BlackboardComponent->GetValueAsObject(SelfActorKey.SelectedKeyName));
|
||||
|
||||
if (!selfActor)
|
||||
{
|
||||
return EBTNodeResult::Failed;
|
||||
}
|
||||
|
||||
AWeapon* CurrentWeapon = selfActor->GetCurrentWeapon();
|
||||
|
||||
if (!CurrentWeapon)
|
||||
{
|
||||
return EBTNodeResult::Failed;
|
||||
}
|
||||
|
||||
// Calculate starting position and direction
|
||||
FVector TraceStart = selfActor->GetTransform().GetLocation();
|
||||
FRotator PlayerRot = selfActor->GetTransform().GetRotation().Rotator();
|
||||
TraceStart = selfActor->GetRootComponent()->GetComponentLocation();
|
||||
FVector AimDir = PlayerRot.Vector();
|
||||
AimDir.Z = 0.0;
|
||||
|
||||
TraceStart = TraceStart + AimDir * ((selfActor->GetInstigator()->GetActorLocation() - TraceStart) | AimDir);
|
||||
|
||||
// Calculate the hit results from the trace
|
||||
TArray<FHitResult> HitResults;
|
||||
|
||||
// Set up the collision query params, use the Weapon trace settings, Ignore the actor firing this trace
|
||||
FCollisionQueryParams TraceParams(SCENE_QUERY_STAT(WeaponTrace), true, selfActor->GetInstigator());
|
||||
TraceParams.bReturnPhysicalMaterial = true;
|
||||
|
||||
FVector MaxHitLoc = TraceStart + (AimDir * CurrentWeapon->GetWeaponProperties()->ProjectileRange);
|
||||
|
||||
GetWorld()->LineTraceMultiByChannel(HitResults, TraceStart, MaxHitLoc, ECC_GameTraceChannel1, TraceParams);
|
||||
|
||||
for (FHitResult Result : HitResults)
|
||||
{
|
||||
if (Cast<APlayerCharacter>(Result.GetActor()))
|
||||
{
|
||||
return EBTNodeResult::Succeeded;
|
||||
}
|
||||
}
|
||||
|
||||
return EBTNodeResult::Failed;
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "BehaviorTree/BTTaskNode.h"
|
||||
#include "TaskCheckLineOfSight.generated.h"
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
UCLASS()
|
||||
class NAKATOMI_API UTaskCheckLineOfSight : public UBTTaskNode
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
public:
|
||||
UPROPERTY(EditAnywhere, Category = "Options",
|
||||
Meta = (AllowPrivateAccess = "true", DisplayName = "Self Actor Key"))
|
||||
FBlackboardKeySelector SelfActorKey;
|
||||
|
||||
public:
|
||||
virtual EBTNodeResult::Type ExecuteTask(UBehaviorTreeComponent& owner, uint8* memory) override;
|
||||
};
|
Loading…
Reference in New Issue