Unityに関連する記事です

設計

 
 Cinemachine によって提供されている Virtual Camera は Priority の値により、MainCamera に映るカメラが決定します。
複数の Virtual Camera をゲーム内で動的に切り替えたい場合、各 Virtual Camera の Priority の値を制御することで切り替えることが出来ます。


<実装動画>
動画ファイルへのリンク


複数の Virtual Camera を配置する


 任意の数の Virtual Camera をヒエラルキーに配置して設定をおこなってください。
最初に設定してある Virtual Camera を複製して作成すると、同じ設定の Virtual Camera が作成されるため、
新規に作成するよりも効率がよいです。

 わかりやすい名前にして、カメラの管理がしやすい環境にしておいてください。


Virtual Camera 間の Blend の設定を行う


 最初に1台目の Virtual Camera をヒエラルキーに設置すると、Main Camera ゲームオブジェクトに Cinemachine Brain コンポーネントが自動的にアタッチされます。
(ヒエラルキーにある Main Camera ゲームオブジェクトの右側に Cinemachine 用のアイコンが追加されます)






 Cinemachine Brain コンポーネントには、現在の Virtual Camera から別の Virtual Camera に切り替わる際の Blend 方法(トランジションの時間や Style)を設定している
Default BlendCustom Blends の機能があります。
このうち、 Custom Blend の機能を利用することで、カメラごとの Blend 方法を個別設定できます。


参考サイト
Unity マニュアル
Virtual Camera 間のブレンド



 Virtual Camera 同士が Priority によって切り替わる場合、基本的には Default Blend をベースに Blend されてカメラが切り替わります
この際、Custom Blend の設定があると、指定したカメラについては、Custom Blend の設定が優先されて切り替わるようになります

 例えば、A → B の Virtual Camera の Blend(トランジションの時間と切り替わり方(Style))と
B → C の Virtual Camera の Blend(トランジションの時間と切り替わり方(Style))のようにカメラを指定し、設定しておくことが出来ます。

 Custom Blends の設定は任意です。
設定がなければ、どの Virtual Camera であっても、Default Blend の情報を使って、同じトランジションの時間と Style を利用して切り替わります。
ただし、特定のカメラ間のトランジションにおいて設定しておきたい場合には、この Custom Blend の機能を活用してください。


設定前のインスペクター画像




 下記はサンプルです。
2つある Virtual Camera の Blend 設定に Custom Blends を設定しています。

 初期設定では Custom Blends の部分は None になっています。
すぐに右側にある Create Asset ボタンを選択すると、新しい Blend 設定を保存するための Cinemachine Blender Settings アセットが作成できます。

 Cinemachine Blender Settings アセットを作成すると自動的に Custom Blends にアサインされて、設定が出来るようになります。
右下の + アイコンを押すと1つ分の設定が出来ます。

 From の部分に切り替え前の Virtual Camera コンポーネントのアタッチされているゲームオブジェクト、
To 部分に切り替え後の Virtual Camera コンポーネントのアタッチされているゲームオブジェクトをヒエラルキーよりアサインします。
From → To の関係です。

 Style は Blend に利用する Ease の設定、Time はトランジションにかかる時間(秒数)です。


設定後のインスペクター画像



Cinemachine Blender Settings アセットのインスペクター画像



 ここでアサインしている情報はゲームオブジェクトの名前に紐づいています(コンポーネントではありません)ので、
Virtual Camera のゲームオブジェクトの名前が変更になるとアサインが外れます




CameraSwitcher スクリプトを作成する


 Virtual Camera を切り替えるためのクラスを作成します。

 SwitchCamera メソッドを実行することで、指定したインデックスのカメラに切り替えます。


CameraSwitcher.cs

 <= クリックすると開きます。



スクリプトの解説


 まず、以下のusingステートメントを追加します。

using Cinemachine;

 Cinemachine で扱う情報をスクリプト内に記述出来るようになります。



 次に、複数の Virtual Cameraを格納するための配列変数を作成します。
これにより、CinemachineVirtualCameraBase型の配列であるvirtualCamerasが作成されます。

[SerializeField]
private CinemachineVirtualCameraBase[] virtualCameras;

 すべての Virtual Camera は CinemachineVirtualCameraBase クラスを継承して作成されていますので、
どのようなタイプの Virtual Camera でもアサインできるようにしています。

 Virtual Cameraの数に応じて、この配列を初期化する必要があります。
今回は SerializeField 属性を付与していますので、インスペクターにて初期化し、複数の Virtual Camera をアサインしておきます。



 次に、切り替えたい Virtual Camera のインデックスを指定するための変数を作成します。

private int currentCameraIndex;

 currentCameraIndex 変数は、現在利用している Virtual Camera の情報を、配列変数の情報と紐づけてして利用するための
インデックスを保持するための整数型変数です。



 最後に、Virtual Cameraを切り替えるためのメソッドを作成します。

public void SwitchCamera(int nextCameraIndex)
{
  // 現在のVirtual CameraのPriorityを下げる
    virtualCameras[currentCameraIndex].Priority = inactiveCameraPriority;

    // 新しいVirtual CameraのPriorityを上げる
    virtualCameras[nextCameraIndex].Priority = activeCameraPriority;

    // currentCameraIndexを更新する
    currentCameraIndex = nextCameraIndex;
}

 この処理により、現在のインデックスを指定して、そのカメラの Priprity を下げて無効化し、
新しいインデックスを指定して、そのカメラの Priprity を上げて有効化しています。

 このメソッドを外部のクラスから実行し、引数で指定されたインデックス番号の配列に代入されている Virtual Camera に切り替えます


CameraSwitcher ゲームオブジェクトを作成し、CameraSwitcher スクリプトをアタッチして設定をおこなう


 ヒエラルキーの空いている場所で右クリックをしてメニューを開き、Create Empty をしてゲームオブジェクトを作成します。
名前を CameraSwitcher に変更し、作成した CameraSwitcher スクリプトをアタッチしてください。

 配列変数がありますので、そちらに切り替えたい Virtual Camera をアサインして登録します。
この例では2つのカメラをアサインしています。


インスペクター画像



 Virtual Camera を増減した場合、こちらの配列のアサインも変更するようにしてください。


ゲームを実行して動作を確認する


 任意のクラスに、CameraSwitcher クラスを利用できる状態にし、任意のタイミングで SwitchCamera メソッドを実行させてください。
(この説明で書かれている内容が難しく、処理を実装できない場合には、外部クラスのメソッドを実行する方法について復習をしてみてください。)

 指定した引数のインデックスのカメラに切り替われば正常に動作しています。


<実装動画 
動画ファイルへのリンク



 Custom Blends を利用している場合には、トランジションの時間や Style などを変更し、カメラの切り替わり処理がどのように変化するかを確認してみてください。
この例ではトランジションの時間を2秒から1秒に変更しています。


<実装動画◆
動画ファイルへのリンク


 以上になります。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3Dレールガンシューティング(応用編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます