ユニティちゃんのRPGを作ってみよう28ー戦闘中のカメラワークを作成するー | Unityを使った3Dゲームの作り方(かめくめ)

ユニティちゃんのRPGを作ってみよう28ー戦闘中のカメラワークを作成するー

今回は戦闘中のカメラワークを作成したいと思います。

前回は戦闘中の攻撃を受けた時のダメージテキストにアニメーションをさせて表示する機能を作成しました。

ユニティちゃんのRPGで戦闘中のダメージや回復ポイントをキャラクターの周辺にTextMeshProを使って表示し、ポイントがアニメーションをするような機能を作成していきます。

ユニティちゃんのRPGを作ってみようの他の記事は

から見ることが出来ます。

今回は戦闘シーンで攻撃をする側、される側のキャラクターをカメラがフォーカスして映し出してわかりやすくしてみます。

ただ、今回作成した機能だとカメラが接写していてヌルーっと動くため、ちょっと3D酔いします・・・(^_^;)

キャラクターを全部を写すカメラ、攻撃時のカメラ、攻撃される側のカメラなど複数のカメラを作って切り替えたり、

そもそもカメラワーク機能を取り付けず今まで通り全体像を写すカメラ一つのまま動かさないというのでもいいかもしれません。

スポンサーリンク

カメラワークの作成

それではカメラワーク機能を作成していきましょう。

今回はCinemachineの仮想カメラを使って機能を作成していきます。

Cinemachineについては

UnityのCineMachineを使うと通常のゲームシーンのカメラとしてだけでなく、イベントシーンのカメラワークの作成も簡単に作成出来ます。そんなCineMachineを使っていくつかのカメラワークを作成してみます。

を参照してください。

仮想カメラはMain Cameraの位置や角度等を操作するもので、名前の通りカメラ機能自体を持っているわけではありません。

設定等は全て仮想カメラ等のCinemachineの機能から出来、Main CameraにはCinemachinBrainコンポーネントが取り付けられ、仮想カメラの設定で管理されるようになります。

キャラクターの初期位置を変更する

今回のカメラワークの機能を取り付けるとキャラクターがうまく見えないという状況になるので、ヒエラルキーのBattleBasePositionの子要素の位置を変更します。

AllyPos0のTransformのPositionのXを3.5
AllyPos1のTransformのPositionのXを4
AllyPos2のTransformのPositionのXを4.5
AllyPos3のTransformのPositionのXを5
EnemyPos0のTransformのPositionのXを-3.5
EnemyPos1のTransformのPositionのXを-4
EnemyPos2のTransformのPositionのXを-4.5
EnemyPos0のTransformのPositionのXを-5

としました。

設定値は任意です。

ユニティちゃんRPGの戦闘シーンでキャラクターが登場する位置を変更

上のような感じにしました。

Cinemachineの仮想カメラの作成とカメラターゲットの作成

まずはCinemachine関連のオブジェクトを入れておく空のゲームオブジェクトを作成します。

ヒエラルキー上で右クリックからCreate Emptyを選択し、名前をVirtualCameraとします。

VirtualCameraゲームオブジェクトのTransformのPositionとRotationのXYZは全て0にします。

ユニティちゃんRPGの戦闘シーンのVirtualCameraのTransformの設定

UnityメニューのCinemachine→Create Virtual Cameraを選択し、作成されたCM vcam1をVirtualCameraゲームオブジェクトの子要素にドラッグ&ドロップします。

ユニティちゃんRPGで戦闘シーンで使用する仮想カメラを作成する

ヒエラルキー上に既に仮想カメラを作成している場合はCM vcam2やCM Vcam3等と最後の数値が増えていきます。

仮想カメラを作成するとMain CameraにCinemachine Brainコンポーネントが自動で取り付けられます。

ユニティちゃんRPGの戦闘シーンのMain CameraにCinemachine Brainが取り付けられる

CM vcam1の設定は後でやります。

次にVirtualCameraゲームオブジェクトを選択した状態で右クリックからCreate Emptyを選択し、名前をCameraTargetとします。

TransformのPositionのXを5、Zを10とします。

ユニティちゃんRPGの戦闘シーンでのCameraTargetのインスペクタ

TransformのPositionの位置は任意です。

CameraTargetは仮想カメラCM vcam1が映すターゲットに使用する空のゲームオブジェクトでCameraTargetを移動させる事でカメラが自動でキャラクター等を写すようにします。

仮想カメラCM vcam1の設定

先ほど作成した仮想カメラCM vcam1を選択し、インスペクタの設定をします。

TransformのPositionのXを5、Yを4、Zを0とします。

RotationはLookAtに見る対象を設定することで直接変更する事は出来ません。

LookAtには先ほど作成したCameraTargetを設定します。

Field Of ViewにはMain Cameraと同じ60を設定します。

AimをComposerにして、Lookahead Timeを0、Lookahead Smoothingを10とします。

Horizontal DampingとVeritical Dampingを1にして、移動スピードの減衰値を設定します。

ユニティちゃんRPGの戦闘シーンのCM vcam1の設定

カメラが映す向きを変える時にパッと変えたい場合はAimの設定をComposerからHard Look Atに変更してください。

ここまでのVirtualCameraの階層は以下のようになります。

ユニティちゃんRPGの戦闘シーンのVirtualCameraの階層

戦闘用キャラクターにカメラが映すポイントとダメージ表示ポイントを作成する

今回カメラワーク機能を取り付けるのでそのキャラクターのどのポイントを映すか?という位置を表す空のゲームオブジェクトを作成します。

またダメージポイントの表示位置もキャラクターの位置ではなくキャラクターの子要素に作成してそこに表示するようにします。

Assets/RPG/Prefabs/Characters/Ally/BattleUnityChanを選択した状態で右クリックからCreate Emptyを選択し、名前をCameraShootingPointとします。

CameraShootingPointはカメラが映すポイントに移動させます。

ユニティちゃんのお腹辺りにCameraShootingPointを移動させました。

ユニティちゃんRPGの戦闘用のユニティちゃんの子要素にカメラが映すポイントを作成する

次はダメージポイントを表示する位置を作成します。

同じようにCreate Emptyで空のゲームオブジェクトを作成し名前をDamageDisplayPointとします。

同じようにダメージポイントを表示したい位置に移動させます。

ダメージテキストを表示しているEffectNumericalDisplayScriptスクリプトを修正します。

引数で受け取ったtargetの位置にそのまま表示していましたが、targetの子要素のDamageDisplayPointゲームオブジェクトを探し、その位置にダメージテキストを表示するようにします。

以下の戦闘用キャラクターにも同じように作成してください。

Assets/RPG/Prefabs/Characters/Ally/BattleYuji
Assets/RPG/Prefabs/Characters/Enemy/ElfPrefab
Assets/RPG/Prefabs/Characters/Enemy/GloblinPrefab
Assets/RPG/Prefabs/Characters/Enemy/GoblinWarriorPrefab

カメラの動きを管理するBattleCameraManagerスクリプトの作成

次にAssets/RPG/Scripts/Battleフォルダに新しくBattleCameraManagerスクリプトを作成し、CM vcam1ゲームオブジェクトに取り付けます。

cameraTargetはCameraTargetゲームオブジェクトをインスペクタで設定します。

initCameraTargetPositionはCameraTargetの初期位置を設定します。

initCameraPositionはカメラ自体の初期位置を設定します。

close_UpCharacterPositionはカメラがキャラクターを写した時に移動させる位置を設定します。

offsetはカメラ位置のオフセット値で、カメラがキャラクターを写した時のに移動させる位置を作成する時に使います。

Startメソッドではカメラターゲット、カメラの初期位置を設定し、カメラの初期位置とoffset値からカメラがキャラクターを接写した時のカメラ位置を設定しています。

Close_UpCharacterメソッドは引数で受け取ったターゲットからCameraShootingPointを探し、その位置にcameraTargetを移動し、カメラ位置をclose_UPCharacterPositionに移します。

CM vcam1のLookAtにはCameraTargetが設定されているので、CameraTargetの位置を引数で受け取ったターゲットの位置にする事で、仮想カメラがそちらの方向を向くようになります。

SetInitPositionメソッドはキャラクターの接写をやめて全体図を写す時に呼び出し、カメラターゲットとカメラ位置を初期位置に戻します。

カメラ操作メソッドの呼び出し処理を追加する

カメラ操作はBattleCameraManagerスクリプトで行えるようになりました。

後はキャラクターの攻撃のタイミング等でその機能を呼び出してカメラを操作するだけです。

BattleManagerスクリプトに処理を追加

BattleManagerスクリプトに処理を追加します。

まずはフィールドにbattleCameraManagerを追加し、インスペクタで設定出来るようにします。

MakeAttackChoiseメソッドの最初にBattleCameraManagerスクリプトのSetDefaultPositionメソッドを呼び出します。

キャラクターがコマンドを選択している時はカメラやターゲットを初期位置にします。

CharacterBattleScriptに処理を追加

CharacterBattleScriptに処理を追加します。

battleCameraManagerフィールドの追加とStartメソッドでBattleCameraManagerスクリプトの取得を行います。

BattleCameraManagerスクリプトはシーン上に一つだけなのでFindObjectOfTypeで取得しています。

次にUpdateメソッドでキャラクターが攻撃等の対象に対しての行動を起こす時にBattleCameraManagerスクリプトのClose_UpCharacterメソッドを呼び出し、現在のターゲットを接写します。

ChooseAttackOptionsメソッドの最初でBattleCameraManagerスクリプトのClose_UpCharacterメソッドを呼び出し自身のキャラクターを接写するようにします。

Guardメソッドは敵が防御をした時に呼び出されますが、そこでも同じようにBattleCameraManagerスクリプトのClose_UpCharacterメソッドを呼び出します。

これで機能が出来上がりました。

実際に動かして確認してみましょう。

上のようになりました。

終わりに

3DのRPGだとカメラワークをどうするか悩みますね、戦闘に参加しているメンバーをうまく映さなければいけませんし、カメラの動きによっては3D酔いしますし・・・・。

カメラを動かすよりカメラは常に全体を映しておいて、キャラクターが敵に近づいて攻撃をするというような作りにするのもいいかもしれません。

ユニティちゃんライセンス

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

スポンサーリンク

記事をシェアして頂ける方はこちら

フォローして頂くとやる気が出ます