ねこ巫女籠城ゲーム開発(移動用のメッシュの高さデータを保存するあたり)
敵が壁を乗り越えるときに「この建物、壁はこういう高さになってる」を定義するメッシュをゲームプレイ時に動的に生成していたのですが、生成されないことがあるようなのでどうにかします。
やったこと
高さが定義された疎な点列データから細かいグリッドの高さを計算する
既存の実装だと
疎な点列データからメッシュを描画する。
yield return new WaitForEndOfFrame();
Raycast を細かく分割したグリッドごとに実行してメッシュの高さを取得する。
という処理で、点列からメッシュを描画してちょっと待ってから Raycast を実行していたのですが、このちょっと待つ時間を yeild return null; などで1フレーム待つ、などにすると、Raycast の結果が適切にならないことがありました。 0.1 秒と長めに待つと動作します。こうなる理由はよくわかりません。
これを
- 疎な点列データから Raycast で計算した結果をファイルに保存する。
- 疎な点列データが更新されたときのみ、このファイルを作り直す処理を行う。
という処理にして動作しました。
これで、必要なときのみ 0.1 秒と長めに待つメッシュ処理が実行されるようになりました。よいです。
メッシュ高さと乗り越えコストについて
いくつか未実装ですが、建物と壁との移動用のメッシュが定義できたので、これを敵が乗り越えるあたりの調整をしていきます。
↓ 現状の移動メッシュによる敵の移動軌跡
今は等速で乗り越えてしまうのですが、これを建物や壁ごとに「移動しにくさ」として定義したパラメータが使われるようにして、かつ「垂直な壁の場合には専用のモーションを使う」といった実装にしていきます。
とりあえず、乗り越えにくさを建物の移動メッシュごとに定義しました。
右端の数値が「乗り越えにくさ」です。1つの建物の複数のメッシュに同じ値を指定している点については、後で「最初に指定された値を同じ建物で利用する」みたいな実装に変えようと思います。
そして、この移動しにくさを移動メッシュに乗ったときに適用するあたりですが、
- 水平方向の等速移動ではなく、移動メッシュの斜面の上を等速移動するように変更する。
- 移動メッシュの移動時に乗り越えにくさを利用する。
- そもそもユニットごとの移動速度を定義して利用する。
とかの要素が絡んで小難しいので実装は次回にやります。
↓ 水平方向の等速移動でなく移動距離を考慮して移動させたい図
まとめと今後の予定
移動メッシュの評価結果をファイルに保存して利用されるようにするあたりと、その移動メッシュをどう利用するかについて検討しました。よいです。
次回は、今回の続きの「移動メッシュに沿って等速運動させる」か、雑多なタスクに着手しようと思います。がんばります。