Контроль камер в игре

By | November 28, 2015

Game-Controlled Cameras

Это руководство покажет как сделать активной камеру, и переместиться от одной активной камеры к другой.

В итоге должно получиться следующее

[wpdevart_youtube]hwErvhNdc9c[/wpdevart_youtube]


 

1) Place Cameras in the World

Размещение камер в мире

1) Начнём данный урок с создания базового проекта с базовым контентом который будет иметь название “HowTo_AutoCamera”. Первое что необходимо сделать, это разместить две камеры в нашем мире. Существует большое количество способов по добавлению камер в мир, мы сделаем это достаточно распространённым способом. Чтоб разместить первую камеру, перейдите в вкладку Modes  и в Placement Browser, то что справа кликните Place, или Shift+1. В разделе классов вы найдёте Camera actor. Перетащите камеру на уровень и расположите камеру так чтобы видеть достаточно удобно все предметы на сцене.

PlaceCameraActor

Когда вы всё сделаете правильно, по идее вы должны видеть картинку в картинке, так как будто вы снимаете самого себя.

CameraOnePlacement

2) При размещении второй камеры мы будем использовать метода которые дадут нам больше контроля. Для начала кликните на Basic в Mode(табе) на куб и перетащите его на уровень редактирования.

PlaceCube

3) Когда переместите наш куб на уровень, добавьте CameraComponent кликнув “Add” в компонентах в панели “Details”. Теперь вы можете установить позицию, а так же угол, вращая CameraComponent, что даст нам другой вид на нашу сцену, чем камера расположенная ранее.

CameraTwoPlacement

4) Теперь нам необходимо настроить наши камеры (CameraComponen) на плавный переход между камерами. Это делается в Constrain Aspect Ratio в менб details

CameraAspect

Текущий мир создан, теперь необходимо создать класс который позволит делать переход между камерами.


2. Control Camera View in C++

1) Теперь у нас всё готово чтобы создать свой класс для управления переходом между камерами. Для этого урока мы расширим класс Actor и назовём его  CameraDirector.NameActorClass

2) В файл CameraDirector.h добавим следующий код для определения класса:

UPROPERTY(EditAnywhere)
AActor* CameraOne;

UPROPERTY(EditAnywhere)
AActor* CameraTwo;

float TimeToNextCameraChange;

3) В файл CameraDirector.cpp добавить следующий код, прям по дерективой #include

#include "Kismet/GameplayStatics.h"

Заголовок GameplayStatics даёт нам доступ к некоторым полезным функциям, один из которых нам необходим для текущего урока. Когда вы всё сделаете , добавьте следующий код в метод ACameraDirector::Tick

const float TimeBetweenCameraChanges = 2.0f;
const float SmoothBlendTime = 0.75f;
TimeToNextCameraChange -= DeltaTime;
if (TimeToNextCameraChange <= 0.0f)
{
    TimeToNextCameraChange += TimeBetweenCameraChanges;

    // Find the actor that handles control for the local player.
    APlayerController* OurPlayerController = UGameplayStatics::GetPlayerController(this, 0);
    if (OurPlayerController)
    {
        if ((OurPlayerController->GetViewTarget() != CameraOne) && (CameraOne != nullptr))
        {
            // Cut instantly to camera one.
            OurPlayerController->SetViewTarget(CameraOne);
        }
        else if ((OurPlayerController->GetViewTarget() != CameraTwo) && (CameraTwo != nullptr))
        {
            // Blend smoothly to camera two.
            OurPlayerController->SetViewTargetWithBlend(CameraTwo, SmoothBlendTime);
        }
    }
}

Этот код заставит нас изменить вид просмотр игрока между камерами каждые 3 секунды.

4) Наш код подготовлен для компиляции. Откомпилируйте код нажав кнопку Compile в Unreal Engine

 

3. Place a Camera Director in the World

1) После того как откомпилируете код, перетащите Экземпляр нашего нового класса из “Content Browser” в редактор уровня.
CameraDirectorInContentBrowser

2) Далее нам необходимо установить переменные CameraOne и CameraTwo. Найдите наш CameraDirector в панели и перейдите в панель Details. CameraDirectorDetails111

Кликните на выпадающие боксы которые имеют значение “None” и установим переменные Cube и CameraActor созданные ранее.CameraDirectorDetails2

3) Если вы нажмёте клавишу PLAY  то увидим камеру привязанную к точке.

CameraOneView3

А потом плавно передвигаемся к другой точке.CameraTwoView4

Через несколько секунд камера вернётся в исходное положение.

MyPawn.h

#pragma once

#include "GameFramework/Actor.h"
#include "CameraDirector.generated.h"

UCLASS()
class HOWTO_AUTOCAMERA_API ACameraDirector : public AActor
{
    GENERATED_BODY()

public: 
    // Sets default values for this actor's properties
    ACameraDirector();

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

    // Called every frame
    virtual void Tick( float DeltaSeconds ) override;

    UPROPERTY(EditAnywhere)
    AActor* CameraOne;

    UPROPERTY(EditAnywhere)
    AActor* CameraTwo;

    float TimeToNextCameraChange;
};

MyPawn.cpp

// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.

#include "HowTo_AutoCamera.h"
#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;
    const float SmoothBlendTime = 0.75f;
    TimeToNextCameraChange -= DeltaTime;
    if (TimeToNextCameraChange <= 0.0f)
    {
        TimeToNextCameraChange += TimeBetweenCameraChanges;

        //Find the actor that handles control for the local player.
        APlayerController* OurPlayerController = UGameplayStatics::GetPlayerController(this, 0);
        if (OurPlayerController)
        {
            if (CameraTwo && (OurPlayerController->GetViewTarget() == CameraOne))
            {
                //Blend smoothly to camera two.
                OurPlayerController->SetViewTargetWithBlend(CameraTwo, SmoothBlendTime);
            }
            else if (CameraOne)
            {
                //Cut instantly to camera one.
                OurPlayerController->SetViewTarget(CameraOne);
            }
        }
    }
}

Если у Вас всё получилось, попробуйте самостоятельно:

  • Прикрепить камеру к движущему  Actor или выстрелу
  • Использовать массив переменных для создания множества камер, вместо двух

Оригинал статьи

Category: Uncategorized