概要
Apex Legendsの動作に似せたキャラクターコントローラーをUnityで作ってみました。
今回は作成する経緯も含めて色々紹介したいと思います。
追記
まぁまぁな量のバグが見つかっています。コードは参考程度にご覧ください。
ソースコード
経緯
Apexを3000時間プレイした。
Apexのキャラクターコントローラーってすごいと思っていて、移動してるだけで楽しく感じますよね。
これを使ったゲームを自分でも作ってみたい!ということでUnityで作ろうと思いました。
某会社のインターンに落ちた。
また、DOTSでうつつを抜かしていたら、ゲームループ(GameObject使うやつ)の知識や技術を貯めるのをすっかりしていませんでした。
ゲームループにわかはDOTSをやらずにゲームループをもっと勉強すべきだと思ったのでキャラクターコントローラーを作ることにしました。
開発中
キャラクターコントローラーなんもわからん
キャラクターコントローラーを自作したことがなかったので設計思想などもよくわからず、とりあえずソースファイル1個でいいか!という形で作り始めました。
しかし、一通り作ったあたりでバグ取りが全くできないぐらいのソースになってしまいバグ取りや開発を断念しました。
有限ステートマシンとの出会い
色々調べてみると、有限ステートマシン(以下FSM)という考え方に出会いました。
ちょうど、ピュアなC#とMonoBehaviourの連携に興味があったので楽しそう!!!!ということもあり、保守性も上がると思ったので移行することに。
FSMの考え方
FSMの作り方は人によって大きく異なるようで私も私が好きな感じに作ってみようという方針で作ることにしました。
DOTSをずっとやってたのもあって、メモリフレンドリーなステートマシンにしたいなと思って、インスタンスを毎回作る形にしました。まぁこれが実際にメモリフレンドリーなのかは怪しいところですが…
また、汎用性の高いステートマシンの議論が結構行われていますが、今回は初めてということもあって度外視して作りました。
技術仕様
今回は、視点と動作を別々に分けて2つのステートを管理することでキャラクターの動作を実現してみました。
これがFSMとして正しいのかは知りません。
実装した機能
動作
- 通常の動き
- 前方方向のみ最大速度が高い
- ジャンプ
- しゃがみ
- ダッシュ
- 壁のぼり
- 壁ジャンプ
- エアストレイフ(Rasストレイフ)
- タップストレイフはなし。
- わたしがあんまりすきじゃないから…
視点
- しゃがみ時のカメラが下がる動き
- 壁のぼり時の横方向のカメラの制限(バグがあるかも)
アニメーション
今回は実装していませんが、ステートマシンにしてあるのでそこまで実装は大変ではないと思います。
少し後にしっかり行いたいと思います。
InputSystem
今回はInputSystemを用いて実装しました。
私はInputSystem信者なのでもう大好きです。ほかの制作物のほとんどもInputSystemで実装しています。
実装の反省点
旧来のステートマシンを用いない方法からコピペで移行したこともあってコードが汚かったり、速度の設定項目が完全に埋め込まれていて変更するのが少し大変だったりしたことが反省点です。
ここに関しては、少しずつ直して整えていきたいと思っています。
また、私の苦手とすることでずっと克服をしたいと思っているのですが、ソースファイル名やクラス名、変数名などの設定が苦手であまりうまく設定できなかったなと思っています。
さいごに
需要があるかは分かりませんが、ご自由にお使いください。
また、アドバイスあればぜひお知らせください。
今後しばらくはDOTS及びECSから離れてゲームループのアーキテクスチャやリーダブルコードなど基礎を固めていきたいと思います。