今回の記事は戦略シミュレーションRPGの作り方を解説する講座の第5回目です。
前回までで自動生成される3Dフィールドマップ上で2Dキャラクターを表示させるシステムを構築しました。
前回の記事:
実際に表示されているキャラクター移動などを行うには対象となるブロックをタップ操作で選択できるようにする必要があります。このあたりの処理を実装していきましょう。
また、今回は選択を行ったブロックが強調表示される部分も一緒に開発していきます。
SRPGのゲームシステムを管理するゲームマネージャを作成
これから実装するブロック選択処理を含め、ゲームの進行に関する処理を追加していく「GameManager」スクリプトを作成します。この名前のスクリプトだけアイコンが変わりますが気にしなくてOKです。
作成できたらManagersオブジェクトにアタッチします。コンポーネントの表示順は[Move Up]ボタン等で変更可能です。
まずはタップ先のブロックを取得する処理をGameManagerに書いていきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameManager : MonoBehaviour { void Start() { } void Update() { // タップ検出処理 if (Input.GetMouseButtonDown (0)) {// タップが行われた // タップ先にあるブロックを取得して選択処理を開始する GetMapBlockByTapPos (); } } /// <summary> /// タップした場所にあるオブジェクトを見つけ、選択処理などを開始する /// </summary> private void GetMapBlockByTapPos () { GameObject targetObject = null; // タップ対象のオブジェクト // タップした方向にカメラからRayを飛ばす Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition); RaycastHit hit = new RaycastHit (); if (Physics.Raycast (ray, out hit)) {// Rayに当たる位置に存在するオブジェクトを取得(対象にColliderが付いている必要がある) targetObject = hit.collider.gameObject; } // 対象オブジェクト(マップブロック)が存在する場合の処理 if (targetObject != null) { // ブロック選択時処理 SelectBlock (targetObject.GetComponent<MapBlock> ()); } } /// <summary> /// 指定したブロックを選択状態にする処理 /// </summary> /// <param name="targetMapBlock">対象のブロックデータ</param> private void SelectBlock (MapBlock targetBlock) { Debug.Log ("ブロックがタップされました。\nブロックの座標:" + targetBlock.transform.position); } } |
- タップ判定はInput.GetMouseButtonDown(0)でとる事ができます(タップした瞬間のみtrueが返ってきます)。エディター上のマウスクリックでも同じ動作をします。
- タップした場所のオブジェクトを取得する方法はいくつか存在しますが、今回はRay(光線)を使用した方法をとっています。カメラからタップ方向に透明な光線を飛ばし、線に触れたオブジェクトを取得する流れです。
- このゲームではブロック以外に当たり判定を持ったオブジェクトは登場しないため、ブロック以外がタップされた場合の処理を書く必要はありません。
- Debug.Logメソッドはテストプレイ中にログを確認できる便利なメソッドです。引数として文字列を渡せばそれを出力します。変数も文字列に変える事が可能なため同様に出力できます。
今回インスペクタからの設定は必要ありません。ゲームを実行して確かめてみましょう。
ブロックをタップするとConsoleビューにDebug.Logからのログが出力されているのが見られます。
これでタップ先のブロックを検出する所まで成功しました。
ブロックの強調表示機能を用意する
現時点ではプレイヤー側にはどのブロックが選択されたかの視覚化がなされていないのでやや不親切です。
ブロックが選択されたらそれを強調表示にする事で分かりやすくしていきましょう。
選択時にのみ表示されるオブジェクトを作成する
強調表示の方法はいくつか考えられますが、今回採用するのは「ブロックごとにより大きなオブジェクトを追加で子に持たせ、選択時にのみそれを表示させる」方法です。
まとめ
これで移動予定のブロックを選択して強調表示することができました。
- Rayを使用するなどの方法でタップした場所にあるオブジェクトを取得する事が出来ます。(オブジェクトに当たり判定がついている必要があります。)
- プレハブは子オブジェクトを持つ事ができ、それらは[Open Prefab]ボタンから編集可能です。
- 配列やリストを使用すれば多数存在する(同じ型の)データをまとめて管理する事が可能です。
次回記事からは選択したキャラクターの移動処理を実装していきます。
次の記事:
コメント