diff --git a/Content/Henry_AnimBP.uasset b/Content/Henry_AnimBP.uasset index 05870afd948cb969132676b5e9baec7ad3ba23c9..ea2e31a0c56aceb81ee264e8865db921a6896501 100644 --- a/Content/Henry_AnimBP.uasset +++ b/Content/Henry_AnimBP.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a04e2d39d8a78c9210e211b72ed9b75015400338f3a07748fe9790b01a7838fc -size 561028 +oid sha256:358161d2ff518f553ae57bb58882c8b845cda55eb74f582dab8d73b93ca3ffc5 +size 601257 diff --git a/Source/CharacterPlugin/Private/VHPointing.cpp b/Source/CharacterPlugin/Private/VHPointing.cpp index 8e3063d879152670110db6ca8047b188b5d2189e..e5c523a4481b8c2b20e7262e9079b28368acb934 100644 --- a/Source/CharacterPlugin/Private/VHPointing.cpp +++ b/Source/CharacterPlugin/Private/VHPointing.cpp @@ -2,6 +2,7 @@ #include "VHPointing.h" +#include "Helper/CharacterPluginLogging.h" // Sets default values for this component's properties UVHPointing::UVHPointing() @@ -18,8 +19,7 @@ UVHPointing::UVHPointing() void UVHPointing::BeginPlay() { Super::BeginPlay(); - - // ... + } @@ -28,7 +28,44 @@ void UVHPointing::BeginPlay() void UVHPointing::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) { Super::TickComponent(DeltaTime, TickType, ThisTickFunction); - - // ... + if (VHAnimInstance == nullptr) { + if (Cast<USkeletalMeshComponent>(GetOwner()->GetComponentByClass(USkeletalMeshComponent::StaticClass()))->GetAnimInstance()) + { + VHAnimInstance = Cast<UVHAnimInstance>(Cast<USkeletalMeshComponent>(GetOwner()->GetComponentByClass(USkeletalMeshComponent::StaticClass()))->GetAnimInstance()); + } + else + { + VH_ERROR("[UVHPointing::TickComponent] No VHAnimInstance component attached"); + } + } + else + { + VHAnimInstance->EffectorPosition = PointingTarget; + if (bIsPointing) + { + FVector DirVHTarget = PointingTarget - GetOwner()->GetActorLocation(); + float AngleLeftRight = FVector::DotProduct(FVector::CrossProduct(GetOwner()->GetActorUpVector().GetSafeNormal(), DirVHTarget.GetSafeNormal()), GetOwner()->GetActorForwardVector().GetSafeNormal()); + float AngleFrontTarget = FMath::Acos(FVector::DotProduct(DirVHTarget.GetSafeNormal(), GetOwner()->GetActorForwardVector().GetSafeNormal())); + if (AngleFrontTarget > (180-BlindAngle)*PI/180.0) { + VHAnimInstance->PointingUseHand = EPointingHand::HandNone; + } + else + { + if (AngleLeftRight > 0) { + VHAnimInstance->PointingUseHand = EPointingHand::HandLeft; + } + else + { + VHAnimInstance->PointingUseHand = EPointingHand::HandRight; + } + } + } + else + { + VHAnimInstance->PointingUseHand = EPointingHand::HandNone; + } + + } + } diff --git a/Source/CharacterPlugin/Public/VHAnimInstance.h b/Source/CharacterPlugin/Public/VHAnimInstance.h index daa7905879ae711f1f230ed43fe0944dee77e7ab..6ca57d6906b27b951170199fb6536a1788b2cc62 100644 --- a/Source/CharacterPlugin/Public/VHAnimInstance.h +++ b/Source/CharacterPlugin/Public/VHAnimInstance.h @@ -6,6 +6,14 @@ #include "Animation/AnimInstance.h" #include "VHAnimInstance.generated.h" +UENUM() +enum EPointingHand +{ + HandNone = 0 UMETA(DisplayName = "None"), + HandLeft = 1 UMETA(DisplayName = "Left Hand"), + HandRight = 2 UMETA(DisplayName = "Right Hand") +}; + UCLASS() class CHARACTERPLUGIN_API UVHAnimInstance : public UAnimInstance { GENERATED_UCLASS_BODY() @@ -34,4 +42,10 @@ public: UPROPERTY(EditAnywhere, BlueprintReadWrite) FRotator SkelControl_Head = FRotator(0.0f, 0.0f, 0.0f); + UPROPERTY(VisibleAnywhere, BlueprintReadWrite) + TEnumAsByte<EPointingHand> PointingUseHand = EPointingHand::HandNone; + + UPROPERTY(EditAnywhere, BlueprintReadWrite) + FVector EffectorPosition; + }; diff --git a/Source/CharacterPlugin/Public/VHPointing.h b/Source/CharacterPlugin/Public/VHPointing.h index 3a704758dfbd3f4da95dd782fe2c4bf533b3f2cc..93d7620af1372f579bc7b4f3a31c24600cf9a05c 100644 --- a/Source/CharacterPlugin/Public/VHPointing.h +++ b/Source/CharacterPlugin/Public/VHPointing.h @@ -4,9 +4,11 @@ #include "CoreMinimal.h" #include "Components/ActorComponent.h" +#include "VHAnimInstance.h" #include "VHPointing.generated.h" + UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) ) class CHARACTERPLUGIN_API UVHPointing : public UActorComponent { @@ -20,12 +22,17 @@ protected: // Called when the game starts virtual void BeginPlay() override; +private: + UVHAnimInstance* VHAnimInstance; + public: // Called every frame virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override; UPROPERTY(EditAnywhere, BlueprintReadWrite) - bool isPointing; + bool bIsPointing; UPROPERTY(EditAnywhere, BlueprintReadWrite) FVector PointingTarget; - + // Angle of back area at which pointing stops in degrees. + UPROPERTY(EditAnywhere, BlueprintReadWrite) + float BlindAngle = 30.0; };