반복적으로 액터 크기 조정 구현하기

김민수·2025년 1월 22일

언리얼 C++

목록 보기
17/32

1. Sin 함수와 Lerp 함수 활용한 구현

헤더 파일

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Star.generated.h"

UCLASS()
class CH3CPP_API AStar : public AActor
{
    GENERATED_BODY()

public:
    AStar();

protected:
    virtual void BeginPlay() override;
    virtual void Tick(float DeltaTime) override;

private:
    FVector StartScale; // 초기 크기
    
    float RunningTime;  // 누적 시간
    float ScaleSpeed = 1.0f; // 크기 변화 속도
    float MinScale = 0.5f; // 최소 크기 비율
    float MaxScale = 1.5f; // 최대 크기 비율
};

CPP 파일

#include "Star.h"

AStar::AStar()
{
    PrimaryActorTick.bCanEverTick = true; // Tick 함수 활성화
}

void AStar::BeginPlay()
{
    Super::BeginPlay();
    StartScale = GetActorScale3D(); // 액터의 초기 크기 저장
}

void AStar::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);

    // 누적 시간 증가
    RunningTime += DeltaTime;

    // ScaleFactor 계산: Sin 함수로 부드러운 변화 생성 (0 ~ 1 범위)
    float ScaleFactor = (FMath::Sin(ScaleSpeed * RunningTime) + 1.0f) * 0.5f;

    // 현재 크기 계산: MinScale과 MaxScale 사이에서 보간
    float CurrentScale = FMath::Lerp(MinScale, MaxScale, ScaleFactor);

    // 새로운 크기 설정
    FVector NewScale = StartScale * CurrentScale;
    SetActorScale3D(NewScale);
}
  1. RunningTime 증가: 매 프레임마다 DeltaTime을 더해 시간을 누적한다.
  2. FMath::Sin() 계산: RunningTimeScaleSpeed를 곱해 사인 함수를 계산하고, 이를 (0~1) 범위로 변환한다.
    • FMath::Sin()의 결과는 -1~1 범위이므로, +1을 더하고 0.5를 곱해 0~1로 변환된다.
  3. FMath::Lerp()로 보간: ScaleFactor를 사용해 MinScaleMaxScale 사이에서 선형 보간된 현재 크기를 계산한다.
  4. 크기 설정: StartScale에 보간된 값을 곱해 새로운 크기를 계산하고, SetActorScale3D() 함수로 적용한다.
profile
안녕하세요

0개의 댓글