8#include "GameFramework/Actor.h"
11UOrbitalBehaviorComponent::UOrbitalBehaviorComponent()
13 PrimaryComponentTick.bCanEverTick =
true;
17void UOrbitalBehaviorComponent::BeginPlay()
21 if (AActor* Owner = GetOwner())
23 AnchorLoc = Owner->GetActorLocation();
28void UOrbitalBehaviorComponent::TickComponent(
float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
30 Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
31 Tick_TargetFloat(DeltaTime);
35void UOrbitalBehaviorComponent::Tick_TargetFloat(
float DeltaTime)
37 AActor* Owner = GetOwner();
38 if (!Owner || !IsValid(TargetActor) || DeltaTime <= 0.f)
42 const FVector TargetCenter = TargetActor->GetActorLocation() + FVector(0.f, 0.f, HeightOffset);
45 AnchorLoc = FMath::VInterpTo(AnchorLoc, TargetCenter, DeltaTime, AnchorLerpSpeed);
51 AngleDeg = FMath::Fmod(AngleDeg + IdleYawSpeedDegPerSec * DeltaTime, 360.f);
52 const float Rad = FMath::DegreesToRadians(AngleDeg);
55 float s = 0.f, c = 0.f;
56 FMath::SinCos(&s, &c, Rad);
59 const float Bob = FMath::Sin(TimeAcc * (2.f * PI) * FMath::Max(0.f, BobSpeed)) * BobAmplitude;
61 const FVector Offset(c * OrbitRadius, s * OrbitRadius, Bob);
62 const FVector NewLoc = AnchorLoc + Offset;
65 Owner->SetActorLocation(NewLoc);
68 if (IsValid(PlayerActor))
70 const FVector ToPlayer = PlayerActor->GetActorLocation() - NewLoc;
71 if (!ToPlayer.IsNearlyZero(1.f))
73 const float DesiredYaw = ToPlayer.Rotation().Yaw;
74 Owner->SetActorRotation(FRotator(0.f, DesiredYaw, 0.f));
80 const FRotator AddYaw(0.f, IdleYawSpeedDegPerSec * DeltaTime, 0.f);
81 Owner->AddActorWorldRotation(AddYaw);
86void UOrbitalBehaviorComponent::SetTargetActor(AActor* NewTarget,
bool bSnapAnchor,
bool bPreserveOrbitPhase)
89 if (TargetActor == NewTarget)
92 AActor* Owner = GetOwner();
93 const FVector OwnerLoc = (Owner ? Owner->GetActorLocation() : FVector::ZeroVector);
95 TargetActor = NewTarget;
98 if (!IsValid(TargetActor))
102 const FVector NewCenter = TargetActor->GetActorLocation() + FVector(0.f, 0.f, HeightOffset);
107 AnchorLoc = NewCenter;
111 if (bPreserveOrbitPhase && Owner)
113 const FVector Rel = OwnerLoc - NewCenter;
114 if (!Rel.IsNearlyZero())
116 AngleDeg = FMath::RadiansToDegrees(FMath::Atan2(Rel.Y, Rel.X));
118 if (AngleDeg < 0.f) AngleDeg += 360.f;
UOrbitalBehaviorComponent 클래스를 선언합니다.