今回はGCCで見てきた講演の1つ「大規模ゲーム開発におけるフリーラン実装事例 ~気持ちよく走り続けさせるために~」について
ざっくりとですが、書いていこうと思います。
スライドはこちら
目次
概要
実際のゲームで実装したフリーランの話になります。
下記のアクションに関してどのように対応したかの話をしておりました。
- 走り
- 方向転換
- 段差越え
- ホッピング
- 壁走り
基本的にスフィアトレースを使用して下記の3つのポイントを考えて
対応していけば、対応できるとのこと
- 空きスペースをチェック
- 可能フラグをチェック
- 実行ポイントをチェック
1.走りについて
昔は走りを実装するときには、走りのループモーション1つで対応していたが、
最近では、「走り始め」「走りループ」「走り終わり」の3つで対応することが多くなったとのこと。
実装の問題点としては「もたつき」が発生してしまったため、その改善として初めに尺を短くしたが
見た目の問題上そこまでもたつきを解決できなかった。
そこで、入力結果をすぐに返すように対応して解決したとのこと。
具体的には、「走り始め」にキャラを残しつつルートの移動を行うように対応。
2.方向転換
こちら入力の問題で、チャタリングが発生(レバー反転時に数フレーム、小さい値がどうしても入ってしまう)
そのため、「走り > 方向転換」ではなく「走り > 走り終わり > 方向転換」といった感じになってしまうので、
タイマーを用意して誤動作をなくした。
また、方向転換の回転不足の問題もあったが、収束率をかけて対応
3.段差越え
初めに、AIのウェイポイントの流用を考えたが、手動で配置するのは面倒なのと、
背景ができないと対応できないため、下記の対応をとることにした。
- 足元と少し前方の地面座標をとり、地面に沿ったベクトルを算出
- 天井チェック
単純に上に向かってスフィアトレースを行い天井チェックを行っていた - 前方の壁チェック(空きスペースがあるか、越える壁があるか確認し、壁との距離を出す)
※ ここではラインを飛ばしていた。 高、中、低の3か所から前方に向かってレイを飛ばしていた
※ 段差越えできる壁フラグも用意してチェックも行っていました。 - 高さチェック
3番で当たった位置の上空から、スフィアトレースを行って、壁の高さ(壁の角の位置を出していた)
※ 段差の高さなので、3の壁チェックの低い位置から飛ばしたレイでヒットした高さと上記の高さの差で高さを算出したとのこと
また、モーションの移動値で段差越えをさせようとしたが、壁に引っかかる問題も発生したので下記の対応で解決したとのこと
4.ホッピング
ホッピング用の専用コンポーネントを作成していました。
ジャンプする位置から、ホッピングで乗る棒の位置までは、線形補間で移動させているとのこと。
それだけだと、距離によってスピードが変わるので、走っている速さを最低速度にして移動させて対応したとのこと。
モーションに関しては必ず、ホッピングの頂点で止まるようにする。
5.壁走り
正面壁走りと、側面壁走りの2種で移動させている。
ある一定の高さがある壁に対して、一定の角度で壁に向かって走ると壁走りになるようにしている。
また、壁走り可能フラグもチェックしている。
単純に走らせると壁から浮いてしまったりするため、壁に吸い付く処理を実装。
壁走り中は、壁方向に重力を入れているとのこと。
壁の出っ張りに関しては、3番の段差チェックを使用して、壁走り中でも段差を越えれるように対応していました。