プレイヤー追従機構(のヒントになりそうな情報)
専用の Rig がまだないので、どうにか擬似的に実装できないか試行錯誤中 liveasnotes.icon
関係しそうな仕様は以下:
isKinematic はめり込む(position を直接更新したときと同じ挙動)
Joint についたコライダも、逃げ場がないときは isKinematic がオフの Rigidbody を付けててもめり込む。
ConfigurableJoint の Z/X/Y Motion は Locked にしていても、CharacterController をめり込ませれば普通にずれる。
ずらしたくない場合は、PositionConstraint か ParentConstraint を使って、Freeze Position Axes を設定する。
プレイヤーの実体はエディタ上では、CharacterController
オブジェクトが接近できる半径は、エディタ上では 0.15 m、ビルドではおそらく 0.2 m(目測)
プレイヤーのコライダはカプセル状
ビルドでは、高さが可変
半径が変化する原因は検証できていない(ビルド版のデバッグができないため)
ジャンプ時、エディタ上ではコライダも動くが、ビルドでは動かず、キャラのみジャンプモーションを再生している。
もしくは、頭の上に何か乗ってると、CharcterController が自重してコライダの位置をそのままにするようになっている?
頭の位置(ネームプレートのXZ座標)も、コライダの中心軸からずれることがある⇒分けて管理される説は濃厚。
CharacterController はオブジェクトに対して、物理的に接触しない。
逆にいうと、無理やり押し込むことでめり込ませることもできる。
衝突検知はできないので、isTrigger で接触/めり込みを検知する。
なにか障害物があれば、CharacterController 自身が跳ね返る。
スリーブしてない Rigidbody は CharacterController に衝突した際、跳ね返る。
スリープした、または isKinematic な Rigidbody は、CharacterController を通さない。(すり抜けることはある。)
AddForec系ギミックを付けたオブジェクトでも CharacterController を押せる
ただし、CharacterController の位置が不定だと使いづらい。
CharacterController がはじき出された場合、AddForce を持ったオブジェクトから見た障害物が消えるので、そのまま旅に出てしまう。
プレイヤー位置の固定方法には、大きく2通りある。
Warp 系ギミックでの強制変位(位置固定)
オブジェクトによる物理的な拘束
isKinematic: true ⇒ プレイヤーを動かせる
isKinematic: false ⇒ プレイヤーに跳ね返される
拘束する高さや、強さ(プレイヤー不在時の縮小半径)によっては、CharacterController は押し出されてしまうので、必要に応じて頭頂部を抑える、一時的に強制 Warp で固定する、などが必要。
CharacterController にちょうどピッタリ触れてる程度の Rigidbody はスリープしてしまう。
若干めり込ませることで、非スリープ状態を維持できる。
しかし、CharacterController ではなく、アバターのモデルが暴れる。
前進時、身体を左右交互に振る動きを高速で行いながら進む
拘束半径が小さいと、アバターの足が拘束具の上辺に乗ってしまう
裏返ったような感じになる
ちょうど良い塩梅にするのが難しい