前の記事でClothの服を着せたキャラクターをスタンダードアセットのTPSコントローラのスクリプトを使って三人称視点で動かしてみます。
まずキャラクターにスタンダードアセットの「ThirdPersonUserControl」スクリプトを付けます。
すると他の必要なコンポーネントが自動で追加されます。
そして、TPSキャラクター用のアニメーターコントローラに似せて新規でアニメーターコントローラを作りました。
詳細はこちら
また、デフォルトのメインカメラを削除して、スタンダードアセットの多目的カメラをシーンに配置します。
多目的カメラのAuto Camコンポーネントに、キャラクターをアタッチします。
これで準備が整ったはずですが、プレイボタンを押すと、キャラクターがずっと座ったままになってしまいます。
ThirdPersonCharacterスクリプトを修正する
自動で追加された「ThirdPersonCharacter」スクリプトでは、キー入力の他に、SphereCastを使ってしゃがむかどうかを判断しています。
Ray crouchRay = new Ray(m_Rigidbody.position + Vector3.up * m_Capsule.radius * k_Half, Vector3.up);
float crouchRayLength = m_CapsuleHeight - m_Capsule.radius * k_Half;
if (Physics.SphereCast(crouchRay, m_Capsule.radius * k_Half, crouchRayLength, Physics.AllLayers, QueryTriggerInteraction.Ignore))
{
m_Crouching = true;
return;
}
これで天井の低いところで自動でしゃがみを入れたりしているようです。
上のgif画像では、上向きに飛ばされたSphereCastが、Clothを制御するために付けたコライダーに反応して、常にしゃがみが入ってしまうのだと思います。
これを解決するために、このコライダーを付けたオブジェクトにレイヤーを追加しました。
そして、SphereCastにレイヤーマスクを追加して、このコライダーに反応しないようにしました。
if (Physics.SphereCast(crouchRay, m_Capsule.radius * k_Half, crouchRayLength, ~(1 << 9), QueryTriggerInteraction.Ignore))
// LayerMask変数を使う場合
LayerMask mask = ~(1 << 9);
if (Physics.SphereCast(crouchRay, m_Capsule.radius * k_Half, crouchRayLength, mask , QueryTriggerInteraction.Ignore))
ScaleCapsuleForCrouching()と、PreventStandingInLowHeadroom()の2ヶ所にレイヤーマスクを追加しました。
すると、正常に動きました。