움직이는 발판구현

주상돈·2025년 2월 19일

TIL

목록 보기
32/53

움직이는 발판

발판의 Component

저는 우선 움직이는 발판의 경우

	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Scaffolding|Component")
	USceneComponent* Scene;
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Scaffolding|Component")
	UBoxComponent* Collision;
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Scaffolding|Component")
	UStaticMeshComponent* StaticMesh;

MovingScaffolding.h

    Scene = CreateDefaultSubobject<USceneComponent>(TEXT("Scene"));
    SetRootComponent(Scene);

    Collision = CreateDefaultSubobject<UBoxComponent>(TEXT("Collision"));
    Collision->SetCollisionProfileName(TEXT("OverlapAllDynamic"));
    Collision->SetupAttachment(Scene);

    StaticMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMesh"));
    StaticMesh->SetupAttachment(Collision);

MovingScaffolding.cpp

RootComponent Scene을 달고 그아래에 Box모양의 Collision과 발판의 모양과 재질을 추가해주는 StaticMesh 도 달아주었다

발판 움직이게 하기

public:
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Scaffolding|Component")
	USceneComponent* Scene;
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Scaffolding|Component")
	UBoxComponent* Collision;
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Scaffolding|Component")
	UStaticMeshComponent* StaticMesh;

	virtual void Tick(float DeltaTime) override;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Platform Settings")
	float MoveSpeed = 100.0f;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Platform Settings")
	float MaxRange = 1000.0f;

private:
	FVector StartLocation;
	bool bMovingForward;

MovingScaffolding.h

void AMovingScaffolding::BeginPlay()
{
    Super::BeginPlay();

    // 게임이 시작될 때 초기 위치를 설정
    StartLocation = GetActorLocation();  // 정확한 시작 위치로 설정
}

MovingScaffolding.cpp

AMovingScaffolding::AMovingScaffolding()
{
	PrimaryActorTick.bCanEverTick = true;

    Scene = CreateDefaultSubobject<USceneComponent>(TEXT("Scene"));
    SetRootComponent(Scene);

    Collision = CreateDefaultSubobject<UBoxComponent>(TEXT("Collision"));
    Collision->SetCollisionProfileName(TEXT("OverlapAllDynamic"));
    Collision->SetupAttachment(Scene);

    StaticMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMesh"));
    StaticMesh->SetupAttachment(Collision);

    bMovingForward = true;

}

그 후 생성자에 bMovingForward의 값을 true값을 저장하였습니다. 처음에는 정방향으로 움직여야 하기때문에...

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

    FVector CurrentLocation = GetActorLocation();
    float DistanceTraveled = (CurrentLocation - StartLocation).X;
    
    // 왕복 여부를 판단하는 변수
    if (bMovingForward)
    {
        if (DistanceTraveled >= MaxRange)
        {
            // MaxRange에 도달하면 반대 방향으로 이동
            bMovingForward = false;
        }
    }
    else
    {
        if (DistanceTraveled <= 0.0f)
        {
            // StartLocation으로 돌아오면 다시 정방향으로 이동
            bMovingForward = true;
        }
    }
    // 정방향 또는 반대 방향으로 이동
    FVector MoveDirection = bMovingForward ? FVector(1, 0, 0) : FVector(-1, 0, 0);
    FVector NewLocation = CurrentLocation + MoveDirection * MoveSpeed * DeltaTime;
    SetActorLocation(NewLocation);
}

회전하는 액터

회전하는 액터의 컴포넌트

public:
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Capsule|Component")
	USceneComponent* Scene;
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Capsule|Component")
	UCapsuleComponent* Collision;
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Capsule|Component")
	UStaticMeshComponent* StaticMesh;
	virtual void Tick(float DeltaTime) override;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Platform Settings")
	float RotationSpeed = 10.0f;

RotatorCapsule.h

ARotatorCapsule::ARotatorCapsule()
{
 	
	PrimaryActorTick.bCanEverTick = true;

    Scene = CreateDefaultSubobject<USceneComponent>(TEXT("Scene"));
    SetRootComponent(Scene);

    Collision = CreateDefaultSubobject<UCapsuleComponent>(TEXT("Collision"));
    Collision->SetCollisionProfileName(TEXT("OverlapAllDynamic"));
    Collision->SetupAttachment(Scene);

    StaticMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMesh"));
    StaticMesh->SetupAttachment(Collision);

}

RotatorCapsule.cpp

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

    // 액터가 로컬 좌표계에서 Yaw 축으로 지정한 스피드만큼 회전
    FRotator RotationDelta(0.f, RotationSpeed * DeltaTime, 0.f);
    AddActorLocalRotation(RotationDelta);

}

RotatorCapsule.cpp

0개의 댓글