게임 개발 (언리얼 엔진)

UE4 게임 개발 EscapeGame - 7 : 카메라쉐이크(CameraShake)

종황이 2020. 12. 4. 01:30

카메라쉐이크는 게임에 극적인 요소를 주기 좋은 장치입니다.

간단하게 구현 가능합니다.

코드를 보면,

// CameraShakeObstacle.h

#pragma once

#include "GameInfo.h"
#include "Camera/CameraShake.h"
#include "CameraShakeObstacle.generated.h"

/**
 * 
 */
UCLASS()
class ESCAPEGAME_API UCameraShakeObstacle : public UCameraShake
{
	GENERATED_BODY()

public:
	UCameraShakeObstacle();
};
// CameraShakeObstacle.cpp


#include "CameraShakeObstacle.h"

UCameraShakeObstacle::UCameraShakeObstacle()
{
	// 지속시간
	OscillationDuration = 0.5f;
    
    // Y축 진폭, 주파수
	LocOscillation.Y.Amplitude = 20.f;
	LocOscillation.Y.Frequency = 100.f;
    
    // Z축 진폭, 주파수
	LocOscillation.Z.Amplitude = 20.f;
	LocOscillation.Z.Frequency = 100.f;
    
    // 카메라 시점 진동
	/*FOVOscillation.Amplitude = 1.f;
	FOVOscillation.Frequency = 100.f;*/
    
    // 최대 한번만 카메라쉐이크 -> 계속 호출 가능하면 어색
	bSingleInstance = true;
}

원하는 대로 설정 후, 카메라쉐이크를 쓰고싶은 클래스에 위 클래스 헤더파일을 include하고, 아래와 같이 사용하면 됩니다.

// MyPlayerCharacter.cpp

#include "CameraShakeObstacle.h"

// 장애물 닿을 경우 사망 코드 구현
void AMyPlayerCharacter::Death()
{
	// 게임오버 시네마틱 영상 ON
	PrintViewport(1.f, FColor::Green, "Death");

	GetController<AMyPlayerController>()->ClientPlayCameraShake(UCameraShakeObstacle::StaticClass(),
		1.f, ECameraAnimPlaySpace::CameraLocal);
	
	// 카메라쉐이크가 끝나고 호출될 함수의 타이머를 설정한다
	GetWorldTimerManager().SetTimer(Timer, this,
		&AMyPlayerCharacter::GameOver, 1.f, true);
}

void AMyPlayerCharacter::GameOver()
{
	// GameOver하고 세이브포인트로
}

아래와 같이 잘 동작하는 것을 확인할 수 있습니다.