Unity ダンジョンRPGの作り方3 3D迷路・主観移動システム・マップ表示システムの作成 | Unity入門の森 ゲームの作り方

Unity ダンジョンRPGの作り方3 3D迷路・主観移動システム・マップ表示システムの作成

Unity 3DダンジョンRPGの作り方 ~世界樹・ウィザードリィ風ゲームを作ろう~

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

【永久会員チケット】

永久会員チケット|Unity入門の森

全講座を見放題で学ぶ

ソースコード・素材・プロジェクトすべて公開。
Unityの基礎から応用まで、一生使えるスキルを体系的に習得。

この記事は3Dダンジョン探索型RPGの作り方について説明しています。今回はその第3回目になります。

前回はマップエディタとマップマネージャを実装し、事前に作成したマップデータを画面に表示できるようになりました。

前回の記事:

3DダンジョンRPGの作り方2 ウィザードリィや世界樹の迷宮のようなダンジョンを作る
この記事は3Dダンジョン探索型RPGの作り方講座の第2回目です。前回はプロジェクトの作成を含め、ゲーム制作を開始するための基本的な準備を行いました。前回の記事:今回からダンジョン要素の実装に着手していきます。戦闘やキャラクタークリエイト機能...

今回はプレイヤーオブジェクトを作成して、キー操作によってマップの中を歩き回れるようにしていきます。カメラも主人公の視点にセットし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スクリプトを作成します。

  • スクリプト内で #region 〇〇 ~ #endregion で囲んだ範囲は名前付きで分割されます。ゲームの動作には影響がないので、長くなったスクリプトを編集する時に少し便利です。(もちろんスクリプトを長くしないのが一番良いです)
  • refキーワードは引数として渡した変数の値そのものをメソッド内で変更したい場合に使用します。これにより、メソッドから戻った後もnowTileXnowTileYの値が更新されます。

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

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

  • DOTweenの機能を使用するには「using DG.Tweening;」の一文が必要です。

DOMoveメソッドの場合、第1引数に目標となるVector3座標、第2引数にアニメーション完了までの時間(秒単位)をfloatで渡します。他のアニメーション系メソッドも基本的にはこのように目標値・時間という2つの値をセットで渡す形になります。

各メソッドにはオプションのような形で.SetEase ()などの追加設定が可能です。

.SetEaseはアニメーションの補間曲線を設定します。初期設定(Ease.OutQuad)だと、アニメーション前半では高速で目標値に近づき、徐々に減速するような見た目になります。今回はEase.Linearに設定する事でアニメーションの最初から最後まで同じ速度での移動を続けさせています。

.OnCompleteはアニメーションの再生が完了した時に呼び出される処理を指定できます() => { … }は、前回の記事で解説したラムダ式を用いた書き方です)。移動アニメーション完了時の場合にはOnEndMoving ()メソッドを呼び出すようにしています。このメソッドは今後の拡張で使用します。

 

スクリプトを編集できたらテストプレイしてみましょう。プレイヤーが画面を滑らかに移動していく様子が確認できます。

移動できる地形を判定する

現在の処理では壁の中やマップ外にまで自由に歩いてしまっています。

移動を反映する処理を行う際に地形判定を追加し、壁またはマップ外であれば移動を中止するようにします。

MapManager.cs

続きを読む

このコンテンツはパスワードで保護されています。 コンテンツを読みたい方はUnity入門の森ショップ(https://unityforest.shop/)で講座閲覧権を取得してね。

まとめ

プレイヤーがダンジョン内を歩いて移動し、ミニマップに反映されるという一連のシステムがひとまず出来上がりました。

まだダンジョンシステムに追加したい機能は沢山ありますが、ここで一旦気持ちを切り替え、次回からは戦闘システムの実装に移っていきたいと思います。

次の記事:

Unity 3DダンジョンRPGの作り方4 複数パーティー戦闘画面の作成【前衛・後衛あり】
この講座では3Dダンジョン探索型RPGの作り方について説明しています。今回はその第4回目になります。前回はプレイヤーオブジェクトとミニマップを実装し、自由にダンジョン内を探索できるようになりました。前回の記事:ダンジョンシステムの開発はここ...

Unity 3DダンジョンRPGの作り方講座に戻る >>

【ゲームの作り方講座もプレゼント中!】

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

【永久会員チケット】

永久会員チケット|Unity入門の森

全講座を見放題で学ぶ

ソースコード・素材・プロジェクトすべて公開。
Unityの基礎から応用まで、一生使えるスキルを体系的に習得。

コメント

タイトルとURLをコピーしました