テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

Character Controllerの罠

スクリーンショット 2013-08-25 23.23.54

Unityで簡単にキャラクターを動かすにはCharacter Controllerを使うのが便利だ。壁などのcollider方向に移動する際は移動制限してくれたり、Character Controllerは登れる角度・無視出来る段差等を設定出来たり、坂道をcollisionにそって登れたりする。

但し、色々と罠がある。例えば…

・SimpleMoveは重力を再現してくれるが、ジャンプさせる方法が無い
・他のオブジェクトが影響を与える事は出来ない(プレイヤーを押し出し等)
・isGroundedの接地判定がそこまで精度良くない
・collisionFlagsでヒットした方向を教えてくれるが、複数の情報を持ってない
接触時の判定にOnControllerColliderHitを使う
・CharacterController.Raycastにマスクが設定出来ない
・複雑なコライダーを表現出来ない

勿論、ゲームによってはIsKinematicをtruefalseに設定し、Rigidbody.velocityを直接弄るのもアリだと思う。(addForceはリアルな挙動が欲しい場合以外は正直使いにくい)
使用はケースバイケースで。

追記:isKinematicをtrueにしたら動かないじゃないですかーヤダー;;


何故こんな面倒な事をしているのかというと、
Collisionをrigidbody抜きで動かしたい為だと思う。

と言うのも、以前紹介したがcollisionはrigidbodyが無いとstaticとして扱われ、それ前提で物理演算するため動かす度に再計算が走り負荷が高い。しかしrigidbodyが必要でない場合は往々にあり、それを常に使うのは余りクールではない。

その回答として、rigidbody(physix)を使わず自前で当たり判定を計算するCharacter Controllerなんだと思う。そのため、CharacterControllerはphysixに起因するコールバック(OnCollisionEnter)を受けることが出来ないんだと思う。

ちなみに現在(2017時)検証してみた感じCharacterControllerはRigidbodyで動かすよりも3倍くらい重く、しかしRaycastを大量に飛ばしまくるよりは軽い



風邪苦しい