現場レベルのゲーム制作が、すべてここで学べます。
この記事は3Dダンジョン探索型RPGの作り方について説明しています。今回はその第3回目になります。
前回はマップエディタとマップマネージャを実装し、事前に作成したマップデータを画面に表示できるようになりました。
前回の記事:

今回はプレイヤーオブジェクトを作成して、キー操作によってマップの中を歩き回れるようにしていきます。カメラも主人公の視点にセットし3DダンジョンRPGでおなじみの主観カメラでの移動を実現します。
また、オートマッピング機能も実装します。ここまででいわゆる3D迷路ゲームを作れるようになりますね。
UnityとC#で3D迷路を主観移動するシステムを作成する
まずはダンジョン内を実際に歩いて移動するプレイヤーオブジェクトから作成していきます。
ダンジョン探索中のゲーム画面はプレイヤーオブジェクトからの主観で描画されるので、プレイヤーオブジェクト自身がゲーム画面に映る事はありません。(よってオブジェクトの見た目の設定は不要です。)
Hierarchyビューの何もない場所を右クリックし、Create Emptyを選択して空のGameObjectを作成します。名前はPlayerなどにします。

続いてゲーム画面の描画をこのオブジェクトからの主観にする設定をします。
ゲーム画面にはCameraコンポーネントがアタッチされているオブジェクトから見えているものが表示されます。初期状態からSceneに配置されているMain Cameraオブジェクトがその機能を持っているのでこれを使いましょう。
Main CameraオブジェクトをPlayerオブジェクト上にドラッグ&ドロップして子オブジェクトになるよう設定します。これにより、Playerオブジェクトが移動や回転を行った際、ローカル座標を持つMain Cameraオブジェクトもそれに合わせて自動的に移動・回転を行うようになります。ゲームのカメラが常にプレイヤーの視点に追従するようにするための設定です。

最後にMain Cameraオブジェクト側のTransformのPosition値を全て0にします。これでPlayerオブジェクトと同じ位置で追随するようになりました。

プレイヤー管理スクリプト作成
Playerオブジェクトの移動や回転(向き変更)に関する操作や処理などを担うプレイヤー管理クラスを作成しましょう。
このクラスはDungeonManagerクラスから制御される存在になります。
なお今後もManager系クラスを都度作成していきそれぞれの分野を総合的に制御させるという設計をとりますが、プログラミングの考え方として1つのクラスに複数の機能を盛ってしまうのは避けるべきとされています。
余裕のある方はクラスを機能ごとに分割してみることにも挑戦してみましょう。
PlayerManager.cs (新規)
Scripts > Dungeonsフォルダ内に新規でC#のMonoBehaviourスクリプトを作成します。
|
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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 |
using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// (Dungeon) DungeonManager配下 /// プレイヤーマネージャ /// </summary> public class PlayerManager : MonoBehaviour { // オブジェクト・コンポーネント public DungeonManager dungeonManager { get; private set; } // ダンジョンマネージャ private MapManager mapManager; // マップマネージャ // プレイヤーオブジェクト参照 public Transform playerTransform; // 現在のマップ上の位置 public int nowTileX; // X位置 public int nowTileY; // Y位置 // 現在向いている方角 public Direction nowDirection; // 定数定義 private const float PlayerYPosition = 0.0f; // プレイヤーオブジェクトの基準Y座標 // 初期化関数(DungeonManager.csから呼出) public void Init (DungeonManager _dungeonManager) { // 参照取得 dungeonManager = _dungeonManager; mapManager = dungeonManager.mapManager; // position初期化 Vector3 targetPos = MapManager.GetVector3ByMapLocation (nowTileX, nowTileY); targetPos.y = PlayerYPosition; playerTransform.position = targetPos; // rotation初期化 playerTransform.rotation = GetQuaternionByDirection (nowDirection); } // Update void Update () { // 各入力に対応する移動・方向転換処理 if (Input.GetKeyDown (KeyCode.W)) {// 前進 OnInput_MoveForward (); } else if (Input.GetKeyDown (KeyCode.S)) {// 後退 OnInput_MoveBack (); } else if (Input.GetKeyDown (KeyCode.Q)) {// 前を向いたまま左へ移動 OnInput_MoveLeft (); } else if (Input.GetKeyDown (KeyCode.E)) {// 前を向いたまま右へ移動 OnInput_MoveRight (); } else if (Input.GetKeyDown (KeyCode.A)) {// 左を向く OnInput_TurnLeft (); } else if (Input.GetKeyDown (KeyCode.D)) {// 右を向く OnInput_TurnRight (); } } /// <summary> /// プレイヤーを指定した位置に移動させる /// </summary> private void MoveLocation (int tileX, int tileY) { // 位置情報反映 nowTileX = tileX; nowTileY = tileY; // Transformに反映 Vector3 targetPosition = MapManager.GetVector3ByMapLocation (nowTileX, nowTileY); targetPosition.y = PlayerYPosition; playerTransform.position = targetPosition; } /// <summary> /// プレイヤーを指定した方向に向かせる /// </summary> private void TurnDirection (Direction direction) { // 方向情報変更 nowDirection = direction; // Transformに反映 playerTransform.rotation = GetQuaternionByDirection (nowDirection); } #region 方角定義 // 方向定義(enum) public enum Direction { North, // 北 East, // 東 South, // 南 West, // 西 } /// <summary> /// 指定された方角から対応するQuaternion(transform.rotationで使用する角度情報)を返す /// </summary> public static Quaternion GetQuaternionByDirection (Direction direction) { switch (direction) { case Direction.North: // 北 return Quaternion.Euler (0.0f, 270.0f, 0.0f); case Direction.East: // 東 return Quaternion.Euler (0.0f, 0.0f, 0.0f); case Direction.South: // 南 return Quaternion.Euler (0.0f, 90.0f, 0.0f); case Direction.West: // 西 default: // エラー回避 return Quaternion.Euler (0.0f, 180.0f, 0.0f); } } /// <summary> /// 指定したX位置、Y位置、方角をもとに前進した場合の位置を返す /// </summary> /// <param name="tileX">X位置(参照渡し)</param> /// <param name="tileY">Y位置(参照渡し)</param> public void GetForwardLocationInDirection (ref int tileX, ref int tileY, Direction direction) { switch (direction) { case Direction.North: // 北 tileY--; break; case Direction.East: // 東 tileX++; break; case Direction.South: // 南 tileY++; break; case Direction.West: // 西 tileX--; break; } } /// <summary> /// 元の方角から左を向いた時の方角を返す /// </summary> public Direction GetDirection_FacingLeft (Direction direction) { if (nowDirection == Direction.North) return Direction.West; else return direction - 1; } /// <summary> /// 元の方角から右を向いた時の方角を返す /// </summary> public Direction GetDirection_FacingRight (Direction direction) { if (nowDirection == Direction.West) return Direction.North; else return direction + 1; } /// <summary> /// 元の方角から後ろを向いた時の方角を返す /// </summary> public Direction GetDirection_FacingBack (Direction direction) { switch (direction) { case Direction.North: // 北 return Direction.South; case Direction.East: // 東 return Direction.West; case Direction.South: // 南 return Direction.North; case Direction.West: // 西 default: // エラー回避 return Direction.East; } } #endregion #region 移動・方向転換入力時処理 /// <summary> /// 移動入力:前 /// </summary> public void OnInput_MoveForward () { // 現在位置 int targetX = nowTileX; int targetY = nowTileY; // 目標方向取得 Direction targetDirection = nowDirection; // 目標方向に進んだ場合の位置を取得 GetForwardLocationInDirection (ref targetX, ref targetY, targetDirection); // 移動実行 MoveLocation (targetX, targetY); } /// <summary> /// 移動入力:後 /// </summary> public void OnInput_MoveBack () { // 現在位置 int targetX = nowTileX; int targetY = nowTileY; // 目標方向取得 Direction targetDirection = GetDirection_FacingBack (nowDirection); // 目標方向に進んだ場合の位置を取得 GetForwardLocationInDirection (ref targetX, ref targetY, targetDirection); // 移動実行 MoveLocation (targetX, targetY); } /// <summary> /// 移動入力:左 /// </summary> public void OnInput_MoveLeft () { // 現在位置 int targetX = nowTileX; int targetY = nowTileY; // 目標方向取得 Direction targetDirection = GetDirection_FacingLeft (nowDirection); // 目標方向に進んだ場合の位置を取得 GetForwardLocationInDirection (ref targetX, ref targetY, targetDirection); // 移動実行 MoveLocation (targetX, targetY); } /// <summary> /// 移動入力:右 /// </summary> public void OnInput_MoveRight () { // 現在位置 int targetX = nowTileX; int targetY = nowTileY; // 目標方向取得 Direction targetDirection = GetDirection_FacingRight (nowDirection); // 目標方向に進んだ場合の位置を取得 GetForwardLocationInDirection (ref targetX, ref targetY, targetDirection); // 移動実行 MoveLocation (targetX, targetY); } /// <summary> /// 方向転換入力:左 /// </summary> public void OnInput_TurnLeft () { // 現在の向きより左に回転させる TurnDirection (GetDirection_FacingLeft (nowDirection)); } /// <summary> /// 方向転換入力:右 /// </summary> public void OnInput_TurnRight () { // 現在の向きより右に回転させる TurnDirection (GetDirection_FacingRight (nowDirection)); } #endregion } |
- スクリプト内で #region 〇〇 ~ #endregion で囲んだ範囲は名前付きで分割されます。ゲームの動作には影響がないので、長くなったスクリプトを編集する時に少し便利です。(もちろんスクリプトを長くしないのが一番良いです)
- refキーワードは引数として渡した変数の値そのものをメソッド内で変更したい場合に使用します。これにより、メソッドから戻った後もnowTileXやnowTileYの値が更新されます。
Update ()メソッドはUnityによって毎フレーム実行されるメソッドですが、この中のif文でInput.GetKeyDown ()メソッドを使用して移動・方向転換のキー入力を取得しています。
プレイヤーが向いている方角の情報は北・東・南・西の4方向しかないのでenumでそれぞれ定義しています。
enumの値はint型数値のように足したり引いたりが可能で、今回の場合、例えばEastとなっているnowDirectionに +1 を行うとSouthになります。
ちなみにPlayerオブジェクトの向き情報に方角を反映させる処理はGetQuaternionByDirection ()メソッドを行っていますが、transformのrotationはQuaternionという型で管理されているのでそのまま変更できません。
Quaternion.Euler ()メソッドを使用し、X・Y・Z方向の回転量をそれぞれ指定し、その返り値として目標となるQuaternionを取得する方法をとっています。
DungeonManager.cs
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; /// <summary> /// (Dungeon) /// ダンジョンシーンマネージャ /// </summary> public class DungeonManager : MonoBehaviour { // コンポーネント参照 public MapManager mapManager; // マップマネージャ public PlayerManager playerManager; // プレイヤーマネージャ // Start void Start () { // 管理下コンポーネント初期化 mapManager.Init (this); playerManager.Init (this); } } |
DungeonManagerクラスからPlayerManagerクラスへの参照をセットできるようにし、
PlayerManagerのInitメソッドを初期化処理として呼び出すようにします。
スクリプトを編集できたらManagersオブジェクトへのアタッチ作業を行います。パラメータの設定は以下です。
- Dungeon Managerコンポーネント
同オブジェクトのPlayer Managerコンポーネントへの参照をセットします(ManagersオブジェクトをDungeon Managerコンポーネントの該当箇所にドラッグ&ドロップ)。
- Player Managerコンポーネント
Player TransformにはPlayerオブジェクトのTransformへの参照をセットします。
Now Tile X・YやNow Directionに設定された値は初期値として使用されます。マップエディタで壁と床の地形を作成しましたが、その床があるエリアの位置を入力すると良いでしょう。

これでテストプレイすると、以下のキー操作で移動や方向転換が行える事が確認できるはずです。
| Wキー | 前へ移動 |
| Sキー | 後ろへ移動 |
| Qキー | 左へ移動 |
| Eキー | 右へ移動 |
| Aキー | 左へ方向転換 |
| Dキー | 右へ方向転換 |

DOTweenを使用したアニメーション
現在は各キーを押下したタイミングで一瞬で移動および方向転換が完了します。
ファミコン時代のWizardryのようなダンジョンRPGにするなら今のままでも良いのですが、今回は迷宮を自分の足で歩く感じを出すために移動にアニメーションを付けてみましょう。
Unityでアニメーションを実装する方法は多数ありますが、今回はスクリプト上で簡潔に実装が可能なDOTweenを使用していきます。1章でインポート設定を行っていれば使用可能になっています。
DOTweenについて
DOTweenはゲームオブジェクトの様々な”動き”をスクリプトで動かす際に便利なオープンソースアセットです。特にTweenアニメーションを実装する際に非常に便利です。
Tweenとは「In-betweening(中割り)」の略で、開始状態と終了状態を指定するだけでその間の変化を自動的に補完して生成することを意味します。
例えば「A地点からB地点へ移動する」「サイズを2倍にする」「UIの色を赤から青に変える」といった動きを作る際、プログラマーが細かく変化量を計算することなくDOTweenによって簡単に実現させる事が可能です。
例えば、移動アニメーションの場合はDOMover ()、色を変更する場合はDOColor ()など用途別で多種多様なメソッドを利用できます。
またアニメーションを無限ループさせたり、イージング設定を変更する事で「加速と減速を繰り返しながら移動する」といった演出の実現も可能です。
他にも「指定秒数後に任意のメソッドを実行するDOVirtual.DelayedCall ()」、「アニメーション等を連続で順番に実行していくSequence」などの有用な機能があり、今後の章でも多用していきます。
それでは移動アニメーションのDOMoveと回転アニメーションのDORotateQuaternionを使用してみましょう。
PlayerManager.cs
|
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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 |
using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; /// <summary> /// (Dungeon) DungeonManager配下 /// プレイヤーマネージャ /// </summary> public class PlayerManager : MonoBehaviour { // オブジェクト・コンポーネント public DungeonManager dungeonManager { get; private set; } // ダンジョンマネージャ private MapManager mapManager; // マップマネージャ // プレイヤーオブジェクト参照 public Transform playerTransform; // 現在のマップ上の位置 public int nowTileX; // X位置 public int nowTileY; // Y位置 // 現在向いている方角 public Direction nowDirection; // 移動・方向転換演出Tween private Tween moveTween; // 定数定義 private const float PlayerYPosition = 0.0f; // プレイヤーオブジェクトの基準Y座標 private const float PlayerMovingTime = 0.4f; // プレイヤーの移動・方向転換演出にかかる時間 // 初期化関数(DungeonManager.csから呼出) public void Init (DungeonManager _dungeonManager) { // 参照取得 dungeonManager = _dungeonManager; mapManager = dungeonManager.mapManager; // position初期化 Vector3 targetPos = MapManager.GetVector3ByMapLocation (nowTileX, nowTileY); targetPos.y = PlayerYPosition; playerTransform.position = targetPos; // rotation初期化 playerTransform.rotation = GetQuaternionByDirection (nowDirection); } // Update void Update () { // 各入力に対応する移動・方向転換処理 if (Input.GetKeyDown (KeyCode.W)) {// 前進 OnInput_MoveForward (); } else if (Input.GetKeyDown (KeyCode.S)) {// 後退 OnInput_MoveBack (); } else if (Input.GetKeyDown (KeyCode.Q)) {// 前を向いたまま左へ移動 OnInput_MoveLeft (); } else if (Input.GetKeyDown (KeyCode.E)) {// 前を向いたまま右へ移動 OnInput_MoveRight (); } else if (Input.GetKeyDown (KeyCode.A)) {// 左を向く OnInput_TurnLeft (); } else if (Input.GetKeyDown (KeyCode.D)) {// 右を向く OnInput_TurnRight (); } } /// <summary> /// プレイヤーを指定した位置に移動させる /// </summary> private void MoveLocation (int tileX, int tileY) { // 位置情報反映 nowTileX = tileX; nowTileY = tileY; // Transformに反映 Vector3 targetPosition = MapManager.GetVector3ByMapLocation (nowTileX, nowTileY); targetPosition.y = PlayerYPosition; // 移動アニメーション moveTween = playerTransform.DOMove (targetPosition, PlayerMovingTime) .SetEase (Ease.Linear) // 等速で値を変化 .OnComplete (() => { // OnComplete:完了時に以下の処理が呼び出される OnEndMoving (); }); } /// <summary> /// プレイヤーを指定した方向に向かせる /// </summary> private void TurnDirection (Direction direction) { // 方向情報変更 nowDirection = direction; // 回転アニメーション moveTween = playerTransform.DORotateQuaternion (GetQuaternionByDirection (nowDirection), PlayerMovingTime) .SetEase (Ease.Linear) .OnComplete (() => { moveTween = null; }); } /// <summary> /// 移動・方向転換の入力が有効な状態かを返す /// </summary> private bool IsMoveableState () { // 移動演出中なら移動不可 if (moveTween != null) return false; return true; } /// <summary> /// 移動処理が終了した時に呼び出される /// </summary> private void OnEndMoving () { moveTween = null; } #region 方角定義 // 方向定義(enum) public enum Direction { North, // 北 East, // 東 South, // 南 West, // 西 } /// <summary> /// 指定された方角から対応するQuaternion(transform.rotationで使用する角度情報)を返す /// </summary> public static Quaternion GetQuaternionByDirection (Direction direction) { switch (direction) { case Direction.North: // 北 return Quaternion.Euler (0.0f, 270.0f, 0.0f); case Direction.East: // 東 return Quaternion.Euler (0.0f, 0.0f, 0.0f); case Direction.South: // 南 return Quaternion.Euler (0.0f, 90.0f, 0.0f); case Direction.West: // 西 default: // エラー回避 return Quaternion.Euler (0.0f, 180.0f, 0.0f); } } /// <summary> /// 指定したX位置、Y位置、方角をもとに前進した場合の位置を返す /// </summary> /// <param name="tileX">X位置(参照渡し)</param> /// <param name="tileY">Y位置(参照渡し)</param> public void GetForwardLocationInDirection (ref int tileX, ref int tileY, Direction direction) { switch (direction) { case Direction.North: // 北 tileY--; break; case Direction.East: // 東 tileX++; break; case Direction.South: // 南 tileY++; break; case Direction.West: // 西 tileX--; break; } } /// <summary> /// 元の方角から左を向いた時の方角を返す /// </summary> public Direction GetDirection_FacingLeft (Direction direction) { if (nowDirection == Direction.North) return Direction.West; else return direction - 1; } /// <summary> /// 元の方角から右を向いた時の方角を返す /// </summary> public Direction GetDirection_FacingRight (Direction direction) { if (nowDirection == Direction.West) return Direction.North; else return direction + 1; } /// <summary> /// 元の方角から後ろを向いた時の方角を返す /// </summary> public Direction GetDirection_FacingBack (Direction direction) { switch (direction) { case Direction.North: // 北 return Direction.South; case Direction.East: // 東 return Direction.West; case Direction.South: // 南 return Direction.North; case Direction.West: // 西 default: // エラー回避 return Direction.East; } } #endregion #region 移動・方向転換入力時処理 /// <summary> /// 移動入力:前 /// </summary> public void OnInput_MoveForward () { // 移動受付中でないなら終了 if (!IsMoveableState ()) return; // 現在位置 int targetX = nowTileX; int targetY = nowTileY; // 目標方向取得 Direction targetDirection = nowDirection; // 目標方向に進んだ場合の位置を取得 GetForwardLocationInDirection (ref targetX, ref targetY, targetDirection); // 移動実行 MoveLocation (targetX, targetY); } /// <summary> /// 移動入力:後 /// </summary> public void OnInput_MoveBack () { // 移動受付中でないなら終了 if (!IsMoveableState ()) return; // 現在位置 int targetX = nowTileX; int targetY = nowTileY; // 目標方向取得 Direction targetDirection = GetDirection_FacingBack (nowDirection); // 目標方向に進んだ場合の位置を取得 GetForwardLocationInDirection (ref targetX, ref targetY, targetDirection); // 移動実行 MoveLocation (targetX, targetY); } /// <summary> /// 移動入力:左 /// </summary> public void OnInput_MoveLeft () { // 移動受付中でないなら終了 if (!IsMoveableState ()) return; // 現在位置 int targetX = nowTileX; int targetY = nowTileY; // 目標方向取得 Direction targetDirection = GetDirection_FacingLeft (nowDirection); // 目標方向に進んだ場合の位置を取得 GetForwardLocationInDirection (ref targetX, ref targetY, targetDirection); // 移動実行 MoveLocation (targetX, targetY); } /// <summary> /// 移動入力:右 /// </summary> public void OnInput_MoveRight () { // 移動受付中でないなら終了 if (!IsMoveableState ()) return; // 現在位置 int targetX = nowTileX; int targetY = nowTileY; // 目標方向取得 Direction targetDirection = GetDirection_FacingRight (nowDirection); // 目標方向に進んだ場合の位置を取得 GetForwardLocationInDirection (ref targetX, ref targetY, targetDirection); // 移動実行 MoveLocation (targetX, targetY); } /// <summary> /// 方向転換入力:左 /// </summary> public void OnInput_TurnLeft () { // 移動受付中でないなら終了 if (!IsMoveableState ()) return; // 現在の向きより左に回転させる TurnDirection (GetDirection_FacingLeft (nowDirection)); } /// <summary> /// 方向転換入力:右 /// </summary> public void OnInput_TurnRight () { // 移動受付中でないなら終了 if (!IsMoveableState ()) return; // 現在の向きより右に回転させる TurnDirection (GetDirection_FacingRight (nowDirection)); } #endregion } |
- DOTweenの機能を使用するには「using DG.Tweening;」の一文が必要です。
DOMoveメソッドの場合、第1引数に目標となるVector3座標、第2引数にアニメーション完了までの時間(秒単位)をfloatで渡します。他のアニメーション系メソッドも基本的にはこのように目標値・時間という2つの値をセットで渡す形になります。
各メソッドにはオプションのような形で.SetEase ()などの追加設定が可能です。
.SetEaseはアニメーションの補間曲線を設定します。初期設定(Ease.OutQuad)だと、アニメーション前半では高速で目標値に近づき、徐々に減速するような見た目になります。今回はEase.Linearに設定する事でアニメーションの最初から最後まで同じ速度での移動を続けさせています。
.OnCompleteはアニメーションの再生が完了した時に呼び出される処理を指定できます(() => { … }は、前回の記事で解説したラムダ式を用いた書き方です)。移動アニメーション完了時の場合にはOnEndMoving ()メソッドを呼び出すようにしています。このメソッドは今後の拡張で使用します。
スクリプトを編集できたらテストプレイしてみましょう。プレイヤーが画面を滑らかに移動していく様子が確認できます。

移動できる地形を判定する
現在の処理では壁の中やマップ外にまで自由に歩いてしまっています。
移動を反映する処理を行う際に地形判定を追加し、壁またはマップ外であれば移動を中止するようにします。
MapManager.cs
まとめ

プレイヤーがダンジョン内を歩いて移動し、ミニマップに反映されるという一連のシステムがひとまず出来上がりました。
まだダンジョンシステムに追加したい機能は沢山ありますが、ここで一旦気持ちを切り替え、次回からは戦闘システムの実装に移っていきたいと思います。
次の記事:

現場レベルのゲーム制作が、すべてここで学べます。






コメント