Capsule Collider
Character Joint

Character Controller

Character Controller は、主に Rigidbody による物理特性を使用しない、1 人称や 3 人称のプレイヤー制御に使用されます。

プロパティー

プロパティー 機能
Slope Limit コライダーが、指定した値以下の勾配(単位は度)のみを登るよう制限します。
Step Offset 指定された値よりも地面に近い場合にのみ、キャラクターが階段を登ります。キャラクターコントローラーの高さより大きくした場合エラーが発生します。
Skin width 2 つのコライダーが、Skin Width の深さまで互いに食い込みます。Skin Width が大きくなると、ジッタが減ります。Skin Width が小さいと、キャラクターが動けなくなる場合があります。値を Radius の 10% に設定しておくとよいでしょう。
Min Move Distance キャラクターが指定された値未満で動こうとしても、まったく動きません。これは、ジッタを減らすのに利用できます。ほとんどの場合、この値は 0 のままにしておいてください。
Center これにより、ワールド空間でカプセルコライダーをオフセットしますが、キャラクターがどのように旋回するかには影響しません。
Radius カプセルコライダーのローカル半径。これは基本的にコライダーの幅となります。
Height キャラクターの カプセルコライダー の高さ。この値を変更すると、正負の方向で Y 軸に沿ってコライダーが拡大縮小されます。
キャラクターコントローラー
キャラクターコントローラー

詳細

従来の Doom 形式の 1 人称制御は物理特性を使用していないため、現実的ではありません。キャラクターは、時速 90 マイルで走り、急停止し、急旋回します。現実的に見せるために、リジッドボディと物理特性を使用してキャラクターの動きを制御しようとすると難しく、違和感があります。これを解決するために、専用のキャラクターコントローラーを使用します。これは単にカプセル型の コライダー で、スクリプトを使ってある方向に移動するよう指示します。コントローラーは、移動を実行しますが、衝突によって制約されます。壁に沿って滑り、Step Offset よりも低い場合は階段を登り、Slope Limit 内で坂道を登ります。

コントローラーは、自分自身の力には反応せず、自動的にリジッドボディを跳ね返しません。

キャラクターコントローラーでリジッドボディやオブジェクトを跳ね返したい場合は、スクリプトで、OnControllerColliderHit() 関数を通して衝突するオブジェクトに力を適用できます。

一方、プレイヤーキャラクターが物理特性の影響を受けるようにしたい場合は、キャラクターコントローラーの代わりに、リジッドボディ を使用した方がよいでしょう。

キャラクターの微調整

キャラクターのメッシュに合うように、HeightRadius を修正できます。人間型のキャラクターの場合は、常に、約 2 メートルを使用することをお勧めします。また、回転軸がキャラクターの中心でない場合に、カプセルの Center で修正できます。

Step Offset も影響します。2 メートルサイズの人間に対して、この値が 0.1 と 0.4 の間になるようにしてください。

Slope Limit は小さすぎないようにしてください。多くの場合、90 °を使用するのがベストです。キャラクターコントローラーはカプセルの形状のため、壁を登ることができません。

動きを停止させない

Skin Width は、キャラクターコントローラーを調整する際に、正しく機能させるためのもっとも重要なプロパティーの 1 つです。 キャラクターが動かなくなった場合、多くは Skin Width が小さすぎることが原因です。Skin Width により、オブジェクトが若干コントローラーを突き抜けますが、ジッタが減り、動作停止を回避できます。

Skin Width を 0.01 より大きい値で維持し、Radius の 10% より大きい値にしておくとよいでしょう。

Min Move Distance は 0 にしておくことをお勧めします。

キャラクターコントローラーの スクリプトリファレンス を参照してください。

Unity 公式サイトの Resources から、事前設定されアニメーション化された、移動するキャラクターコントローラーのプロジェクトサンプルをダウンロードできます。

ヒント

  • キャラクターが頻繁に動作停止する場合は、Skin Width を調整してみてください。
  • 自身でスクリプトを記述したとき、キャラクターコントローラーが物理特性を使用して、オブジェクトに影響する場合があります。
  • キャラクターコントローラーは、物理特性を通じて、オブジェクトの影響を受けることはありません。
  • 注意: インスペクターで Character Controller プロパティーを変更すると、シーン内でコントローラーを再生成します。そのため、今あるトリガーがすべて失われるので、再びコントローラーが動くまで OnTriggerEnter メッセージを受け取ることができません。
  • The Character Controller’s capsule used in queries such as raycast might shrink by a small factor. Queries therefore could miss in some corner cases, even when they appear to hit the Character Controller’s gizmo.
Capsule Collider
Character Joint