Language:
Page Info
Engine Version:
The translation of this page is out of date. Please see the English version for the latest version of the page.

3.ワールドに Camera Director を配置する

  1. コードのコンパイルが終了すると、新規クラスのインスタンスを コンテンツブラウザ から レベル エディタ へドラッグできます。

    CameraDirectorInContentBrowser.png

  2. 次に CameraOne 変数と CameraTwo 変数を設定しなくてはいけません。ワールドアウトライナー で CameraDirector を検索して [Details (詳細)]パネル で編集します。

    CameraDirectorDetails.png

    ドロップダウンから [None (なし)] をクリックして、これらの変数を既に作成した CubeCameraActor に設定します。

    CameraDirectorDetails2.png

  3. [Play (再生)] を押すと、カメラがこのビューにスナップします。

    CameraOneView.png

    次に、このビューへスムーズにブレンドします。

    CameraTwoView.png

    スナップバックする前に数秒間待機します。

ゲームロジックに完全に基づいてプレイヤーのカメラを動かせるシステムが出来ました。このコードは、プレイヤーがカメラを直接操作しないゲームやカメラビュー間のブレンディングが役立つゲームなど、任意のゲームで使用できるように変更可能です。

完成コード

MyPawn.h

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

#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();

protected:
    // Called when the game starts or when spawned (ゲーム開始時またはスポーン時に呼び出されます)
    virtual void BeginPlay() override;
public:
    // Called every frame (フレームごとに呼び出されます)
    virtual void Tick( float DeltaSeconds ) override;

    UPROPERTY(EditAnywhere)
    AActor* CameraOne;

    UPROPERTY(EditAnywhere)
    AActor* CameraTwo;

    float TimeToNextCameraChange;
};

MyPawn.cpp

// Copyright 1998-2018 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. (フレーム毎に Tick() を呼び出すようにこのアクタを設定) 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. (カメラ 2 へスムーズにブレンド) 
                OurPlayerController->SetViewTargetWithBlend(CameraTwo, SmoothBlendTime);
            }
            else if (CameraOne)
            {
                //Cut instantly to camera one.(カメラ 1 に瞬時に切り替え)
                OurPlayerController->SetViewTarget(CameraOne);
            }
        }
    }
}