unreal공부(과제에서 어려웠던 점)2025.02.03

Virus·2025년 2월 3일
0

1. 이동 입력 문제 해결

🔹 문제점
Input Mapping Context(IMC)에서 전진(W), 후진(S), 좌측(A), 우측(D) 이동을 설정했음.
하지만 W를 누르면 뒤로 가고, S를 누르면 앞으로 가는 문제가 발생.
또한, A와 D를 눌렀을 때 대각선 방향으로 이동하는 문제가 있었음.
원인: Swizzle Input Axis 설정이 잘못되어 있어 W, S, A, D의 입력 값이 꼬였음.
✅ 해결 방법
WS, AD를 각각 별도의 입력 매핑으로 설정하고 코드 수정하여 정상 동작하도록 변경.
🔹 수정된 입력 매핑 설정


// Enhanced Input을 활용한 이동 매핑 설정
UPROPERTY(EditAnywhere, Category = "Input")
UInputAction* IA_Move_Forward;  // W, S 전진/후진
UPROPERTY(EditAnywhere, Category = "Input")
UInputAction* IA_Move_Right;    // A, D 좌우 이동

🔹 수정된 이동 코드


void ASpartaPawn::MoveForward(const FInputActionValue& Value)
{
    float AxisValue = Value.Get<float>();
    if (AxisValue != 0.0f)
    {
        FVector Forward = GetActorForwardVector();
        AddMovementInput(Forward, AxisValue);
    }
}

void ASpartaPawn::MoveRight(const FInputActionValue& Value)
{
    float AxisValue = Value.Get<float>();
    if (AxisValue != 0.0f)
    {
        FVector Right = GetActorRightVector();
        AddMovementInput(Right, AxisValue);
    }
}

// 입력 바인딩 설정
void ASpartaPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
    Super::SetupPlayerInputComponent(PlayerInputComponent);
    UEnhancedInputComponent* EnhancedInput = Cast<UEnhancedInputComponent>(PlayerInputComponent);

    if (EnhancedInput)
    {
        if (IA_Move_Forward)
        {
            EnhancedInput->BindAction(IA_Move_Forward, ETriggerEvent::Triggered, this, &ASpartaPawn::MoveForward);
        }
        if (IA_Move_Right)
        {
            EnhancedInput->BindAction(IA_Move_Right, ETriggerEvent::Triggered, this, &ASpartaPawn::MoveRight);
        }
    }
}

✅ 결과: 이제 W/S, A/D 각각 개별적으로 이동이 가능하고, 이상한 대각선 이동 현상이 사라짐.

2. 점프 기능 추가

🔹 문제점
점프 기능을 추가하려 했으나 bIsJumping 및 JumpSpeed 변수를 만들지 않아서 구현이 어려웠음.
✅ 해결 방법
bIsJumping 상태 변수와 JumpSpeed 값을 추가하고, 점프 로직을 구현.
점프 중이면 중력 적용을 일시 중단하고, 일정 높이에 도달하면 다시 낙하하도록 처리.
🔹 추가된 변수


// 점프 관련 변수
bool bIsJumping = false;
float JumpSpeed = 600.0f;  // 점프 초기 속도

🔹 점프 구현 코드


void ASpartaPawn::Jump(const FInputActionValue& Value)
{
    if (!bIsJumping && bIsOnGround) // 지면에 있을 때만 점프 가능
    {
        bIsJumping = true;
        FallSpeed = JumpSpeed;
    }
}

void ASpartaPawn::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);
    CheckForGround();

    FVector CurrentLocation = GetActorLocation();

    if (bIsJumping)
    {
        // 상승 중이면 중력 적용 안 함
        CurrentLocation.Z += FallSpeed * DeltaTime;
        FallSpeed += Gravity * DeltaTime;  // 중력 적용
        if (FallSpeed < 0) // 최고점 도달 후 낙하 시작
        {
            bIsJumping = false;
        }
    }
    else if (!bIsOnGround)
    {
        // 낙하 중이면 중력 적용
        FallSpeed += Gravity * DeltaTime;
        CurrentLocation.Z += FallSpeed * DeltaTime;
    }
    else
    {
        // 지면에 닿았으면 낙하 속도 초기화
        FallSpeed = 0.0f;
    }

    SetActorLocation(CurrentLocation);
}

✅ 결과: 점프 기능이 정상적으로 작동하며, 최고점에 도달한 후 자연스럽게 낙하함.

3. 타이머 및 랜덤 퍼즐 생성

🔹 고려했던 기능
타이머 활용: 퍼즐 스테이지에서 시간 제한 및 카운트다운 기능 추가 고려.
랜덤 퍼즐 생성:
랜덤 배치 및 속성 부여 기능 추가 예정.
FRandomStream을 활용하여 일정한 랜덤 결과 유지 가능.
🔹 랜덤 퍼즐 배치 코드 예시


void AMyPuzzleGameMode::SpawnRandomPuzzle()
{
    FVector SpawnLocation = FVector(FMath::RandRange(-500, 500), FMath::RandRange(-500, 500), 100);
    FRotator SpawnRotation = FRotator(0, FMath::RandRange(0, 360), 0);

    GetWorld()->SpawnActor<APuzzlePiece>(PuzzlePieceClass, SpawnLocation, SpawnRotation);
}

✅ 결과: 퍼즐이 랜덤 위치에 생성되며, 매번 다른 위치에서 등장함.

4. WS, AD를 따로 분리해서 이동 매핑 구성하는 게 좋은 이유

🔹 문제점
Axis2D Vector 방식으로 처리했을 때 이동 방향이 꼬이는 문제가 있었음.
해결 방법: WS, AD를 각각 따로 입력 매핑에 추가하고 코드 수정하여 해결.
✅ 결과: 정상적인 이동 가능.

5. 점프 후 액터 위에 올라갔을 때 정상 작동 여부 확인

🔹 현재 상태
공중에서 발판을 밟는 동작은 정상적으로 작동함.
다만, 충돌 문제가 남아 있음. (내일 해결 예정)

0개의 댓글

관련 채용 정보