UENUM(BlueprintType) enum EEnumName { EnumName_ZeroUMETA(DisplayName = "Zero"), EnumName_OneUMETA(DisplayName = "One"), EnumName_TwoUMETA(DisplayName = "Two") }; USTRUCT(Atomic, BlueprintType) struct FStructName { GENERATED_BODY() public: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "USTRUCT") TEnumAsByte EnumName; }; 사용하려는 Enum에 TEnumAsByte를 사용합니다. 혹은 enum 뒤에 uint8을 추가합니다. UENUM(Bluep..
Unreal Engine/C++
블루프린트에서 사용하는 Delay 노드를 C++에서 SetTimer를 활용하여 구현하겠습니다. SetTimer를 활용하여 Delay를 구현하는 2 가지 방법이 있습니다. Lambda를 사용하는 방법과 딜레이 후 함수를 호출하는 방법입니다. 1. Lambda 사용 float DelayTime;// 딜레이 시간 FTimerHandle TimerHandle; GetWorld()->GetTimerManager().SetTimer(TimerHandle, FTimerDelegate::CreateLambda([&]() { // 딜레이 후 동작 구현 }), DelayTime, false); 2. 딜레이 후 함수 호출 - 함수에 매개변수가 있는 경우 float DelayTime;// 딜레이 시간 FTimerHandle ..
UFUNCTION(BlueprintCallable, Category = "PRMovementSystem|DistanceMatching") bool PredictStopLocation(FVector& OutStopLocation, const FVector& CurrentLocation, const FVector& Velocity, const FVector& Acceleration, float Friction, float BrakingDeceleration, const float TimeStep, const int MaxSimulationIterations = 100); 위의 함수는 MovementSystem이라는 ActorComponent에 구현된 static을 사용하지 않은 일반 함수입니다. 일반 함수를..
void UAN_PRFootStep::Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation) { Super::Notify(MeshComp, Animation); APRBaseCharacter* PROwner = Cast(MeshComp->GetOwner()); if(IsValid(PROwner) == true) { FHitResult HitResult; bool bIsHit = false; FVector TraceStart = PROwner->GetActorLocation(); FVector TraceEnd = TraceStart + FVector(0.0f, 0.0f, 150.0f); DrawDebugLine(GetWorld(), T..
TTuple APRPlayerCharacter::GetMovementDirection() const { const FRotator NewControlRotation = FRotator(0.0f, GetControlRotation().Yaw, 0.0f); FVector NewForwardVector = UKismetMathLibrary::GetForwardVector(NewControlRotation); FVector NewRightVector = UKismetMathLibrary::GetRightVector(NewControlRotation); return MakeTuple(NewForwardVector, NewRightVector); }
언리얼 실행 환경은 메모리에 떠있는 언리얼 오브젝트가 사용 중인지 아닌지를 주기적으로 검사하고, 사용하지 않는 물체를 발견하면 메모리에서 자동으로 제거합니다. 이를 가비지 컬렉션(Garbage Collection)이라고 합니다. 언리얼 오브젝트가 사용 중인지 여부는 다른 언리얼 오브젝트가 해당 오브젝트를 참조하는지로 판단하는데, 예를 들어 FHitResult의 멤버 변수 Actor의 선언이 일반 참조로 선언된다면 해당 함수에서의 참조로 인해 제거돼야 할 액터가 메모리에 그대로 남아있는 문제가 발생할 수 있습니다. 이런 문제를 방지하기 위해 FHitResult는 참조로부터 자유롭게 포인터 정보를 전달해주는 약 포인터(TWeakObjectPtr) 방식으로 멤버 변수를 선언했습니다. 약포인터로 지정된 액터에 ..
OwnerPRPlayerCharacter->OnCoolDownRatioChangedDelegate.AddUFunction(this, FName("BindSkillSlot")); OwnerPRPlayerCharacter->OnCoolDownRatioChangedDelegate.AddUObject(this, &UPRSkillPaletteWidget::BindSkillSlot); UObject의 멤버 함수를 바인딩 할 경우 AddUObject를 사용합니다. 멤버 함수 중 UFUNCTION 키워드를 사용하여 선언한 함수는 AddUFunction으로 바인딩 할 수 있습니다. AddUObject의 경우 함수 포인터를 넘겨주고, AddUFunction은 함수 이름을 인자로 넘겨주면 됩니다.
FTimeline TestTimeline; UCurveFloat* TestFloatCurve; UCurveFloat* ChangeFloatCurve; FOnTimelineFloat TimelineProgress; if(TestFloatCurve != nullptr) { TestTimeline.AddInterpFloat(TestFloatCurve, TimelineProgress, NAME_None, TEXT("Test")); } if(ChangeFloatCurve != nullptr) { TestTimeline.SetFloatCurve(ChangeFloatCurve, TEXT("Test")); } TimeLine에 Curve를 등록할 때 TrackName을 설정하고 SetCurve 함수로 TrackName..