最近Unityで色々なゲーム作りに使える「汎用ゲームシステム」的なものを作っていて、その一環として三人称視点のキャラクターコントローラー(Standard AssetsでいうところのThirdPersonCharacterController)を作ることになりました。
それで丸1ヶ月かかってようやくマトモなものができたので、今回はどんな機能のキャラクターコントローラーを作ったのか?とか、処理の流れはどうなっているのか?といったことについて書いていきます。
今回作ったキャラクターコントローラーの機能
はじめに、今回作ったキャラクターコントローラーの機能を簡単に紹介しておきます。
- 歩く・走る
- しゃがみ移動
- ローリング(転がり)移動
- ジャンプ・2段ジャンプ
- 壁をよじ登る
- 武器を振って攻撃
歩く・走る
まずは当然ですが歩いたり走ったりすることができます。移動速度によってアニメーションの再生速度が変化するようになっています。
しゃがみ移動
しゃがみ移動では当たり判定が小さくなります。指定したキーを押すことでしゃがみ移動ができるほか、天井の低いところに入ったりすると自動的にしゃがみ移動に切り替わります。
ローリング(転がり)移動
ある程度の速度が付いている状態でしゃがみキーを押すと転がることができます。転がっている間は当たり判定が小さくなるので、攻撃を回避したり狭いところにすばやく入ったりできます。
ジャンプ・2段ジャンプ
普通のジャンプのほか、ジャンプ中にさらにジャンプできる「2段ジャンプ」も可能です。
壁をよじ登る
垂直な壁をよじ登ることもできます。地味ですが実装にかなり苦労しました。
武器を振って攻撃
最後に、武器を振って攻撃することも可能です。攻撃可能な状態のときは基本的に武器を手に持ったまま他の動作を行いますが、壁を登るときは自動的に収納します。
キャラクターコントローラーの処理の流れ
次に今回のキャラクターコントローラーの処理の流れを簡単に説明します。
アニメーター
まず、キャラクターのアニメーターは次のような感じになっています。
- Grounded:待機・歩く・走るなど接地状態でのアニメーション
- Airborne:ジャンプなど空中でのアニメーション
- Climbing:壁を登るアニメーション
- Crouching:しゃがみ移動のアニメーション
- Rolling:転がり移動のアニメーション
- Attack:攻撃アニメーション
C#スクリプト
次にC#スクリプトの処理の流れは次のようになっています(FixedUpdate内)。
- 移動量の算出(Update内での入力受付処理に基づく)
- 接地判定
- 壁判定
- いま「壁登り」状態か?
- YES→壁上での移動処理
- NO→4へ
- 接地しているか?
- YES→歩く・走る・しゃがむ・転がるのいずれかの処理
- NO→ジャンプ処理
- アニメーターのステートの更新処理
全部の処理は載せきれないのでとてもザックリした説明になってしまいますが、壁登りは他の状態と共存することはないので、まずそれとそれ以外の状態を判定してからさらに細かい状態の判定を行っています。
キャラクターコントローラーを自作した感想
最後に自作した感想です。キャラクターコントローラーって「あって当たり前」なモノなので別にできたからと言って褒められるようなものではないのですが、いざ自作してみると意外と難しくて苦労しました(皆アセットを使いたがるのも無理ないなと思いました)。
しかしその分Unityでゲームを作るうえで基本的なことを再確認出来たり、よく分からなかった機能を調べて使い方を理解したりできたので、1ヶ月でそこそこレベルアップできたのではないかと思います。やっぱり「あって当たり前のモノ」には基本が詰まっているんだなぁということを実感しました。
ただし今後これをどう使って面白いゲームを作るか?が一番重要だと思うので、自作したことに自己満足して終わりになってしまうのではなく、できたモノや経験などをしっかりと活用して良い作品を作りたいと思います。