今回は、プレイヤーが指示した方向へ向かって移動する、MMOやRTS等でよくある移動方法をMMDモデルで行う手っ取り早い方法を紹介します。
「若干自分の思ってたものと違う」と思う所があれば、パラメータやソースコードを調整して下さい。一応、ノーコーディングでもここまでは出来ます。
もしキーボードやゲームパッドで移動させたい場合は、前回の記事を参考にして下さい。こちらの方法ではサードパーソン的にキャラクターを動かします。
Unity内でMMDモデルを自由に走らせる手軽な方法 - テラシュールブログ
なお、今回はゲームでも利用可能なMMDモデルと言う事で、黒羽式OculusChan(以降OculusChan)に登場いただきました。R-18エログロ無断商用利用政治的利用以外なら自由に使っても良いとの事でしたので、使っていこうと思います。
今回もSample Assetsを使用します。AssetStoreからインポートして使って下さい。
またMMDをインポートする記事は他の記事を参考にして下さい。
ちなみにMMDで無いモデルなら面倒な事無くそのまま使えます(人型でhumanoidの場合)
目次
AIの経路を事前計算する
キャラクターの移動は基本的にAIで操作します。その経路ですが、UnityのNavmeshの機能を使用して事前計算します。ちなみに、NavmeshはかつてはPro専用の機能ですが、現在はFree版でも使用可能です。
1.地形(マップ)を用意
地形は何でも良いです。今回はSample Assetsに入っている地形プレハブを適当につなぎ合わせました。その際、ブロックであればBox Collider、斜面であればMesh Colliderを追加して下さい。でないとキャラクターが落下します。
2.地形となるGameObjectをstatic属性に変更
面倒であれば、「Stage」のGameObjectを作成し、ステージを構成する全てのオブジェクトをStageの子オブジェクトとして登録、最後にStageをstaticにすれば、全てStaticになります。
3.NavMeshの設定
Navmeshを設定します。メニューバーのWindow>NavigationでNavmeshウィンドウが開くので、Bakeを教え下さい。
上手く行けば、地形に青い板が表示されます。それがキャラクターの移動範囲になります。もし幅が狭すぎると思った場合は、NavmeshのBakeボタンを押し、Radiusを調整してBakeして下さい。
キャラクターを動かす
キャラクターを動かします。今回の場合はOculusChan。
まず、前回同様にOculusChanのFBXモデルを「Humanoid」に設定します。これは全てのモーションをMMDからインポートすれば回避出来そうですが、今回は面倒なので。
1.AI Characterの登録
ProjectビューのSample Assets>Characters>Third Person Character>PrefabsからAI Characterを選択し、Sceneビューへドラッグ&ドロップします。
なお、AI CharacterはRigidbody(物理演算)ベースで動く為、物理演算で動いている他のオブジェクトに影響します。
また、地面のコライダーが無いと落下します。
2.モデルの差し替え
AI Characterの中にあるEthanオブジェクトを削除し、代わりにOculusChan(好きなMMDモデル)を子として配置します。その際、OculusChanの座標は必ずposition(x:0, y:0, z:0)にして下さい。
3.移動先の指定
とりあえずの移動先を指定します。HierarchyビューのCreate>Sphererで球を作成しマップの適当な場所に配置します。
次にAI CharacterのAICharacterControlコンポーネントのTargetに、先ほど作成したSphererを登録します。
これで、キャラクターは先ほど登録した球へ向かって走るようになります。
4.タップして移動
これでは移動先を指定するのは面倒なので、タップした座標へマーカーを移動させます。
ProjectビューのSample Assets>Sample Scenes>PrefabsにTarget Pickerがあるので、それをシーンへ配置します。
次に先ほどと同じ要領で、AI CharacterのAICharacterControlコンポーネントのTargetに、先ほど配置したTarget Pickerを登録します。先ほど作成したSphereは削除してもかまいません。
これで、キャラクターがタップした位置へ移動するようになります。
これ自体はゲームに直接結びつきにくいですが、村人の挙動やプレイヤーを追跡する敵、通信頻度を減らす為(目標座標だけを同期&定期的に座標同期)等々、使える箇所は色々とあると思います。
頑張った 結果。パックマンモドキで、「現在地を追う」と「現在から少し前を追う」と「移動先を予測して追う」の3種類の追跡でプレイヤーを追い詰める。
疑問や質問は大歓迎です。コメント欄かtsubaki_t1まで
次回は、たぶんボリュームライトについて紹介します。