【Unity】RPGを作るチュートリアルその7 カメラの追従処理の実装

【Unity】RPGを作るチュートリアルその7 カメラの追従処理の実装

シンプルなRPGをUnityで作るチュートリアルシリーズの7回目です。

第6回では操作キャラクターを移動させる機能を作成しました。マス目に沿って移動させるため、任意の位置に移動できる形ではなく、Tilemapのセルを使ってワールド座標に変換する形で目的の移動先座標を取得し、コルーチンで移動させるようにしました。今回はカメラがキャラクターを追いかける処理を実装していきましょう。今回は短くて済むかも?

 

 

制作環境

MacBook Pro 2023 Apple M2 Max

Unity6 (6000.0.30f1) Silicon

 

作業内容と順序

シンプルなRPGを作る上でどんな作業が必要か、どんな順番で作っていくと良さそうか、別ページで検討しました。基本的にこの流れに沿って進めていきます。

 

前回の内容

前回は操作キャラクターの移動制御を実装しました。

 

カメラの追従処理の実装方針

今回のチュートリアルでは、シンプルにカメラが操作キャラクターの位置に移動する形で実装します。狭い画面だとカメラが動かなかったり、画面の隅に行ったら追従せず操作キャラクターだけが移動したりと、2DのRPGではカメラの追従のオン/オフがあったりしますが、チュートリアルの範囲では入れないようにします。

Tilemapはカメラの追従を踏まえて、移動ポイントの外側の領域にもタイルを配置するようにしましょう。

 

カメラの追従処理の実装

まずはスクリプトファイルを作成します。Projectウィンドウから「Assets/Scripts」のフォルダに移動し、MonoBehaviourのスクリプトを作成します。名前は [CameraMover] にしました。

スクリプトファイルの作成
スクリプトファイルの作成

 

このスクリプトを「Main Camera」のゲームオブジェクトにアタッチして、ゲーム実行時に操作キャラクターを追いかけるようにしましょう。操作キャラクターへの参照はゲーム実行時に取得するようにします。そのため、「Player」へのタグ設定、タグの定義値用クラスの作成もやっておきます。

 

タグの設定

Hierarchyウィンドウで「Player」のゲームオブジェクトを選択し、Inspectorウィンドウの右上からタグを設定します。タグ選択のプルダウンから [Player] を選択します。

タグの設定
タグの設定

 

タグの定義値用クラスの作成

タグの名前に関しても定義値を作って、それを使うようにしましょう。万が一タグ名が変更された場合でも、フィールド名自体が変わらなければ影響範囲が抑えられますからね。大昔にタグ名をソースに直書きしてめんどくさいことになったのも良い思い出です(遠い目)

Projectウィンドウから「Assets/Scripts/Consts」のフォルダに移動し、空のC#スクリプトを作成します。名前は [ObjectTagSettings] にしました。

定義値クラスの作成
定義値クラスの作成

 

クラスの中身は以下のように記載しました。今後タグを使う場合は、ここにフィールドを追加していく予定です。

 

カメラの追従処理

続いてカメラ用のコードを書いていきましょう。といっても他のチュートリアルでよくあるものをそのまま使う形なので「いつものね」と思ってもらえればOKです。

最初に作成した「CameraMover」のクラスで以下のように記載します。

フィールドを2つ用意していて、「_targetObj」は追従の対象となるゲームオブジェクトで、このゲームオブジェクトの位置にカメラを移動させます。「_isTracing」は追跡中かどうかのフラグで、falseの時は追従処理を行わないようにします。

Start()の中からは2つのメソッドを呼び出します。CheckReferences()では対象となるゲームオブジェクトへの参照を取得しています。ここでは動作確認のため、操作キャラクターのタグを検索して参照を取得します。Update()の頻度でGameObject.FindWithTag()を呼ぶとパフォーマンスに大きな影響が出るため、Start()から呼ぶだけに留めます。パフォーマンスを考えるならFind系のメソッドを使わずInspectorウィンドウから参照をアサインする方が良いのですが、追従したいキャラクターがPrefabから動的に生成されるなど、シーン内に確実にいるとは限らない場合は動的に取得する必要があります。その場合も、Instantiateしたタイミングでこのクラスに対象のゲームオブジェクトへの参照を渡すなどすると負荷が減らせそうですね。今後必要になったらそのメソッドも入れましょうか。

Start()内のもうひとつのStartTrace()の方は追従フラグをtrueにするものです。今後の実装でカメラの追従を止めたいケースに備えて、publicなメソッドとしてStartTrace()とStopTrace()の両方を用意して、外からも変えられるようにしています。

また、このクラスではUpdate()ではなくLateUpdate()を使って追従処理を行います。他のクラスのUpdate()の処理が終わった後のタイミングでカメラを移動させることで、キャラクターの移動に関する処理が終わった後にカメラが動くようになります。

MoveCamera()の中では、対象のゲームオブジェクトの確認、フラグの確認を行なった後に移動処理を行なっています。今回は2Dのゲームなのでカメラとキャラクターの初期位置とのオフセットは使わず、画面中央に表示されるようにします。

 

スクリプトのアタッチ

スクリプトを保存したら、カメラにアタッチしましょう。Hierarchyウィンドウから「Main Camera」のゲームオブジェクトを選択し、Inspectorウィンドウにて [CameraMover] のスクリプトをアタッチします。

スクリプトをアタッチ
スクリプトをアタッチ

 

動作確認

スクリプトをアタッチしたら動作確認です。ゲームを実行して、方向キーで操作キャラクターを移動させた際に、カメラがついていくのを確認します。

 

カメラの追従が確認できたら、次回は移動できないマスの制御を入れていきます。

 

今回のブランチ

 

まとめ

今回はカメラが操作キャラクターを追従する処理を実装を行いました。この処理自体は他のチュートリアルでもよくある形式なので難しいところもなく進められるかと思います。対象のゲームオブジェクトを切り替えられるようにする点は必要になった時に実装していきましょう。

次回は移動を禁止するタイルの制御を実装します。

 

     

ゲーム開発の攻略チャートを作りました!

CTA-IMAGE

「ゲームを作ってみたいけど、何から手を付けていいか分からない!」


そんなお悩みをお持ちの方向けに、todoがアプリをリリースした経験を中心に、ゲーム作りの手順や考慮すべき点をまとめたe-bookを作成しました。ゲーム作りはそれ自体がゲームのように楽しいプロセスなので、「攻略チャート」と名付けています。


ゲームを作り始めた時にぶつかる壁である「何をしたら良いのか分からない」という悩みを吹き飛ばしましょう!