読者です 読者をやめる 読者になる 読者になる

チリペヂィア

リンクフリー。サンプルコードなどは関連記事内でライセンスについて明示されない限り商用利用なども自由に行って構いませんが、自己責任でお願いします。またこれら日記内容の著作権自体は放棄していません。引用部分については引用元の権利に従ってください。

斜面にキャラクターを這わせる。第01回

Unityはじめました。

実に豆タンクを走らせたい!存分に!!

フリー六角とライセンス版メタセコモデリング。テクスチャにはイラストレーターを使い、ベクターデータでセルフシャドウを重ねています。モデリングを簡単にしたらテクスチャに死ぬほど時間がかかりました。フロント/サイドビューはおおよそ固まっているもののリアビューのモールドデザインは固まっていません。そのへんはまぁとりあえず後回し。

さて、ゲームで戦車を出すなら、次のことは出来なくちゃいけないと勝手にハードルを上げます。

  • 超信地旋回(いわゆるその場でターンするアクション)
  • 段差をモリモリ乗り越え。もちろん斜面に沿って走る。
  • 車輪とキャタピラはもちろん動く。

車輪とキャタピラアニメーションはおいといて、まずターンアクション・斜面追従について実装を考察しようと思います。

ちなみにオチは「プログラミングで解決」です。UNITYらしからぬ…数学&コーディング苦手な人は申し訳ない。

Unity信じたけど救われなかった。WheelColliderの空転が止まらない。

私は失敗談が好きなので、まずは失敗談。素人はおとなしく物理エンジンに頼ってしまえば良いに違いない!→素直にWheelCollider(サスペンションつきタイヤシミュレーター)を4つ装着!→履帯よろしく、前後左右にトルク配分→スピンが止まらない!

  • 直進していても右か左に少しずつずれていってしまう
  • 段差乗り上げ時、各輪の接地率がピーキー
  • 超信地旋回がフラフラ

常に4輪に等しいトルクをかけても、瞬間的な空転やトラクション差が累積しやすい模様。段差の横断も、ある程度はサスで対応できますが、分かりやすいくらいのデコボコやV字溝を連発すると、ランダムなリフトと着地の繰り返しでズルズルクルクル急旋回したり。旋回は戦車というより4輪のドリフトスピン。回転中に角にぶつけると滑っていきます。

一応、前後同時にトラクションをかけつつも、例えば右前と右後で回転差が生じると、空転と認識してトルク配分率を調整したり、派手に空転したタイヤ側には無限トラクションを設定するとかチートっぽい事も色々やって、さらにはAIによるアクセル制御、自動修正舵サポートも入れてみましたが、どうもナイーブな印象です。

決定的なのは以下の特性がゲームとして渋すぎる印象です。

  • 斜面乗り上げ時に、勢いがないと低地側にトラクションが偏ってスピン、全体のトラクションが一気に低下してズリ落ちる、あるいは全く登らない
  • 同じく、斜面に対して真っ直ぐではなく斜めに進入すると、舵を切るなどちょっとしたきっかけでスピン、低地側にズリ落ちる

コレかつて富士の裾野で行われていた新年アタックじゃないですかー(いわゆる”突撃”で急坂アタックするパターン)。

専用に構造設計されたオフロード4WDでも、急斜面を登るのは基本的にチャレンジャブルというのを、スッカリ失念しておりました。実際問題、戦車も戦車壕に落ちたら死亡確定ですが、豆タンクをイージーにモリモリ走らせるのには向かないか…(マリオカートのジュゲムみたいなUFOにレスキューしてもらうルールならイケるのかしら…)

結局ゴリゴリとベクトル計算コーディング

プレーヤーは慣れればともかく、高度なハンドリングAIを作るくらいなら、接地くらい自分で実装しちゃった方がパラメーターいじり続けて丸二日迷走するよりずっとラク(だと思います)。GameObjectの階層を一つ増やして、制御をアウターで持って、インナーのグラフィックを傾けてやればきっとオッケー。まず独自に接地面の傾斜を得る場合の作戦を立てましょう。

  1. 足元の点をいくつかサンプリングして、各点の地面の高さを得て、それらを結ぶ面の傾きを計算する
  2. CharacterContorollerやRigidbodyの衝突イベントから、接地面の法線ベクトルを取得する

こんなところでしょうか。どっちでやってもパッと見の印象は変わりませんが、ちょとだけ違います。

  1. ほとんどシームレスに動き、細かい段差のトレースにもそこそこキレがあります。ただし計算量は高負荷。
  2. いくらか低負荷ですが、いくつかのシーンで不自然です。まず登りきった斜面の先が崖だったりすると、前半分が宙に浮いてるのに上に向かって傾いてる状態になります。そして細かい凹凸が連続するとかなりバタバタするので適当に補間する必要があります。

2.を採用したいところですが、上記のとおり、毎フレーム接地面の傾きをそのまま反映すると、デコボコを通過したらバッタバッタひるがえって大変な事になります。なので、常に現状から少しずつ接地面に傾いていくような補間をし続ける必要があります。このように、どうしても少しモッサリと路面に追従する以上、ゲーム中におけるユニットの性格もまたモッサリしていないとちょっとチグハグな印象を受けます。他に高機動ユニットを登場させて、相対的に戦車キャラにモッサリした印象を与えるなら2だけでも良いと思いますが、今時の戦車事情で「最高速度は80km!意外と機敏ダヨ!今にも鋳造のギアが吹っ飛びそうさ!」みたいなイメージだと、プレーヤー車両ぐらいは1で走らせたいところです。なにより、乗り物の前輪がドスンと落ちるのは非現実感のアピールとして非常に重要と、かのミヒャエル・パンナコッタ・ジムニースキも記しております。

長くなったので、次回に続く。