Unreal Engine 4 : 카메라 이동
시작에 앞서...
학부 연구생으로 활동하고 있는 도중에
교수님께 새로운 IC-PBL 강좌로 언리얼 엔진 관련해서 개설한다고 하셨다.
이전부터 게임 개발 관련해서도 관심이 많았었는데, 이번 기회에 언리얼 엔진에 대해 제대로 배울 수 있을 것 같아, 강의 개설에 참여한다고 말씀드렸다.
블로그에서 다룰 툴은 언리얼 엔진 4이며,
모든 내용은 유튜브 채널 "베르의 게임 개발 유튜브"에서 참고했다.
https://www.youtube.com/channel/UC9j37A2ACL9ooSbsT4mtGww/featured : 베르의 게임 개발 유튜브
목차
- 카메라 배치
- 카메라 전환, C++ 코드
카메라 배치
순서는 "베르의 게임 개발 유튜브"와 동일하다. 자세한 내용은 유튜브를 통해 배우면 된다.
카메라의 배치는 총 두 개를 배치했으며,
우측 상단에 있는 카메라는 "모든 클래스" -> "카메라"를 선택했고, 좌측에 있는 카메라는 cube(인스턴스)에서 불러올 수 있는 카메라를 선택했다.
"모든 클래스"에 해당하는 케메라는 "pilot mode"로 카메라 위치를 지정할 수 있으며
인스턴스에서 비롯된 카메라는 x, y, z 좌표 및 각도를 3인칭 관점에서만 지정할 수 있다.
배치 모습은 다음과 같다.
카메라 전환, C++ 코드
플레이어가 어떤 입력을 넣지 않은 상태에서, 카메라가 전환 되는 모습을 보여주기 위해 C++ 코드가 사용 된다.
위 화면에서 사용된 두 개의 카메라 시점을 사용할 것이며,
코드를 통해서 구현하고자 하는 것은
카메라에서 카메라의 이동이 하나는 컷으로 변경 되고 하나는 자연스럽게 시점 변환이다.
C++ 코드는 다음과 같다. (코드 또한 "베르"님 채널에서 참고 했다.)
우선 헤더 파일 코드는 다음과 같이 작성한다.
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "CameraDirector.generated.h"
UCLASS()
class MYPROJECTCAMERA_API ACameraDirector : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
ACameraDirector();
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;
//AActor 포인터를 추가하여 CameraOne 변수 생성
UPROPERTY(EditAnywhere)
AActor* CameraTwo;
//AActor 포인터를 추가하여 CameraTwo 변수 생성
UPROPERTY(EditAnywhere)
float TimeToNextCameraChange;
//다음 카메라로 변경 되는 시간을 정의하는 변수(float 형)
};
UPROPERTY(EditAnywhere)는 에디터의 프로퍼티 창에서 편집이 가능함을 의미한다.
그 다음으로, cpp 파일을 열어, 카메라를 전환할 수 있는 코드를 다음과 같이 작성한다.
#include "CameraDirector.h"
#include "Kismet/GameplayStatics.h"
// Sets default values
ACameraDirector::ACameraDirector()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
}
// Called when the game starts or when spawned
void ACameraDirector::BeginPlay()
{
Super::BeginPlay();
}
// Called every frame
void ACameraDirector::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
const float TimeBetweenCameraChanges = 2.0f;
//카메라의 포커스를 다음 카메라로 변경하는 시간 정의하는 TimeBetweenCameraChanges 변수
const float SmoothBlendTime = 0.75f;
//카메라가 부드럽게 전환된 시간을 정의할 SmoothBlendTime을 정의하는 변수
TimeToNextCameraChange -= DeltaTime;
if (TimeToNextCameraChange <= 0.0f)
{
TimeToNextCameraChange += TimeBetweenCameraChanges;
APlayerController* controller = UGameplayStatics::GetPlayerController(this, 0);
//카메라 전환하는 코드, GetPlayerController 함수 사용시 로컬 플레이어의 컨트롤을 처리하는 액터를 찾을 수 있음
if (controller) // 그 컨트롤러를 가져온 뒤
{
if ((controller->GetViewTarget() != CameraOne) && (CameraOne != nullptr))
// 지금 바라보는 타깃이 CameraOne이 아니면 APlayerController 클래스의 SetViewTarget 함수로 CameraOne을 카메라로 변경
{
controller->SetViewTarget(CameraOne);
}
else if ((controller->GetViewTarget() != CameraTwo) && (CameraTwo != nullptr))
//지금 바라보는 타깃이 CameraTwo가 아니면 SetViewTargetWithBlend 함수로 CameraTwo로 카메라 변경
{
controller->SetViewTargetWithBlend(CameraTwo, SmoothBlendTime);
}
//SetViewTarget 함수와 SetViewTargetWithBlend 함수의 차이는 컷으로 바로 바꾸거나, 부드럽게 카메라를 바꿀지 결정하는 것
}
}
}
작성해야 하는 부분은 ACameraDirector 클래스의 Tick 함수 부분이다.
자세한 내용은 주석으로 작성했다.
이와 같이 cpp와 헤더 파일을 작성한 후, 저장하여 플레이를 시켜보면
컷으로 시점이 전환되고, 부드럽게 시점이 변환되는 것을 확인할 수 있다.
앞으로, 기초적인 자습 내용은 "베르"님 유튜브를 참고하면서 할 예정이며, 포스팅 할 예정이다.
더 나아가 자신만의 게임을 만들어 보는 것을 개인 프로젝트로 해볼 것이며,
IC-PBL 강좌 개설 때는 VR/AR과 연동하실 계획이시라고 하니, 그 부분에 대해서도 자습 후 포스팅 할 예정이다.
졸업 작품도 이 쪽으로 해보면 굉장한 경험이 될 것이라고 생각한다.