(Unreal : Tutorial) 2. 카메라 조종

Posted by : at

Category : Unreal


Project Setting

새 프로젝트 -> 게임


카메라 배치하기

카메라를 좀 더 쉽게 컨트롤 하는 방법
우클릭 후 파일럿 선택
카메라가 볼 장면을 지정

카메라의 위치가 지정되었음을 확인할 수 있다.


Object가 바라보는 카메라 생성

일단 하나의 OBject를 아무거나 생성

컴포넌트에 카메라를 추가


카메라를 제어할 클래스를 생성해보자.

새 클래스 -> C++ 생성

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

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

UCLASS()
class CAMERATUTORIAL_API ACameraControl : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	ACameraControl();

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

	UPROPERTY(EditAnywhere)
		AActor* CameraOne;
	UPROPERTY(EditAnywhere)
		AActor* CameraTwo;
	UPROPERTY(EditAnywhere)
		float TimeToNextCameraChange;
};
#include "CameraControl.h"
#include <Kismet/GameplayStatics.h>

// ...

// Called every frame
void ACameraControl::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

	const float TimeBetweenCameraChanges = 2.0f;
	const float SmoothBlendTime = 0.75f;

	TimeToNextCameraChange -= DeltaTime;
	if (TimeToNextCameraChange <= 0.0f)
	{
		TimeToNextCameraChange += TimeBetweenCameraChanges;

		APlayerController* constroller = UGameplayStatics::GetPlayerController(this, 0);
		if (constroller)
		{
			if ((constroller->GetViewTarget() != CameraOne) && (CameraOne != nullptr))
			{
				constroller->SetViewTarget(CameraOne);
			}
			else if ((constroller->GetViewTarget() != CameraTwo) && (CameraTwo != nullptr))
			{
				constroller->SetViewTargetWithBlend(CameraTwo, SmoothBlendTime);
			}
		}
	}
}

카메라 컨트롤 클래스를 언리얼에 반영

카메라1, 카메라2를 지정한다.

이제 플레이해보면 카메라가 자연스럽게 이동된다.


움직이는 Object(Actor)에 카메라를 붙여보기

우선 움직이는 Actor를 만들어보자

movingActor 클래스생성

UCLASS()
class CAMERATUTORIAL_API AMovingActor : public AActor
{
	// ...

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

	float Timer;
};
// Called every frame
void AMovingActor::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

	Timer += DeltaTime;

	FVector NewLocation = GetActorLocation();
	NewLocation.Y += FMath::Cos(Timer);
	SetActorLocation(NewLocation);
}

MovingActor 클래스를 언리얼에 반영 후 카메라 컴포넌트를 추가

카메라 컨트롤에 MovingActor를 넣어준다.


배열로 카메라 받기

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

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

UCLASS()
class CAMERATUTORIAL_API ACameraControl : public AActor
{
    // ...

    // Unreal에서 배열은 TArray로 받아야 한다.
	UPROPERTY(EditAnywhere)
		TArray<AActor*> Cameras;

	int32 NowCameraIndex;

	//UPROPERTY(EditAnywhere)
	//	AActor* CameraOne;
	//UPROPERTY(EditAnywhere)
	//	AActor* CameraTwo;
	UPROPERTY(EditAnywhere)
		float TimeToNextCameraChange;
};
void ACameraControl::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

	const float TimeBetweenCameraChanges = 2.0f;
	const float SmoothBlendTime = 0.75f;

	TimeToNextCameraChange -= DeltaTime;
	if (TimeToNextCameraChange <= 0.0f)
	{
		AActor* NowGamera = Cameras[NowCameraIndex];

		TimeToNextCameraChange += TimeBetweenCameraChanges;

		APlayerController* constroller = UGameplayStatics::GetPlayerController(this, 0);
		if (constroller)
		{
			//if ((constroller->GetViewTarget() != CameraOne) && (CameraOne != nullptr))
			//{
			//	constroller->SetViewTarget(CameraOne);
			//}
			//else if ((constroller->GetViewTarget() != CameraTwo) && (CameraTwo != nullptr))
			//{
			//	constroller->SetViewTargetWithBlend(CameraTwo, SmoothBlendTime);
			//}

			if ((constroller->GetViewTarget() != NowGamera) && (NowGamera != nullptr))
			{
				constroller->SetViewTarget(NowGamera);
			}
		}

		NowCameraIndex++;
		if (NowCameraIndex >= Cameras.Num())
		{
			NowCameraIndex = 0;
		}
	}
}

배열로서 잘 반영됐는지 확인


배열을 구조체로 선언

//...

USTRUCT(Atomic, BlueprintType)
struct FChangeCameraData
{
	GENERATED_USTRUCT_BODY();
public:
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
		AActor* Camera;
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
		flaot TimeBetweenCameraChanges;
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
		float SmoothBlendTime;
};


UCLASS()
class CAMERATUTORIAL_API ACameraControl : public AActor
{
    // ..

	UPROPERTY(EditAnywhere)
		TArray<FChangeCameraData> Cameras;

	int32 NowCameraIndex;

	UPROPERTY(EditAnywhere)
		float TimeToNextCameraChange;
};

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links