IKを使って足元の段差を作りたいのですがうまく実装できない理由が知りたいです。以下のようにしっかり設定しているのですがこれはなぜなのでしょうか?デバッグログを出してしましたがスクリプトに問題があるみたいなのですがIkは初めてなので調べても情報がなく困っています。
カーブを設定し歩きと待機、
ヒューマノイドです。
スクリプトもアタッチしています。
アニメーターにIkのチェックボックスをONにしています。
質問1 ウェイトとはなにか?
using UnityEngine; using System.Collections; using System; public class IK : MonoBehaviour { private CharacterController characterController; private Animator animator; // テスト用のIKのOn・Offスイッチ [SerializeField] private bool isUseIK = true; // 右足のウエイト private float rightFootWeight = 0f; // 左足のウエイト private float leftFootWeight = 0f; // 右足の位置 private Vector3 rightFootPos; // 左足の位置 private Vector3 leftFootPos; // 右足の角度 private Quaternion rightFootRot; // 左足の角度 private Quaternion leftFootRot; // 足を付く位置のオフセット値 [SerializeField] private float offset = 0.1f; // レイを飛ばす距離 [SerializeField] private float rayRange = 1f; private bool isRightFootIK = false; private bool isLeftFootIK = false; // コライダの位置を調整する時のスピード [SerializeField] private float smoothing = 2f; // レイを飛ばす位置の調整値 [SerializeField] private Vector3 rayPositionOffset = Vector3.up * 0.3f; void Start() { characterController = GetComponent<CharacterController>(); animator = GetComponent<Animator>(); } void OnAnimatorIK() { // 右足用のレイの視覚化 Debug.DrawRay(animator.GetIKPosition(AvatarIKGoal.RightFoot) + rayPositionOffset, -transform.up * rayRange, Color.red); // 右足用のレイを飛ばす処理 var ray = new Ray(animator.GetIKPosition(AvatarIKGoal.RightFoot) + rayPositionOffset, -transform.up); RaycastHit hit; if (Physics.Raycast(ray, out hit, rayRange, LayerMask.GetMask("Field"))) //if (Physics.Raycast(ray, out hit, rayRange)) { rightFootPos = hit.point; rightFootRot = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation; isRightFootIK = true; } else { isRightFootIK = false; } // 左足用のレイを飛ばす処理 ray = new Ray(animator.GetIKPosition(AvatarIKGoal.LeftFoot) + rayPositionOffset, -transform.up); // 左足用のレイの視覚化 Debug.DrawRay(animator.GetIKPosition(AvatarIKGoal.LeftFoot) + rayPositionOffset, -transform.up * rayRange, Color.red); if (Physics.Raycast(ray, out hit, rayRange, LayerMask.GetMask("Field"))) //if (Physics.Raycast(ray, out hit, rayRange)) { leftFootPos = hit.point; leftFootRot = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation; isLeftFootIK = true; } else { isLeftFootIK = false; } // IKを使う時だけ if (isUseIK) { // アニメーションの状態からウエイトを取得 rightFootWeight = animator.GetFloat("RightFootWeight"); leftFootWeight = animator.GetFloat("LeftFootWeight"); if (isRightFootIK) { // 右足ウエイトの設定 animator.SetIKPositionWeight(AvatarIKGoal.RightFoot, rightFootWeight); animator.SetIKRotationWeight(AvatarIKGoal.RightFoot, rightFootWeight); // 右足の位置と角度を設定 animator.SetIKPosition(AvatarIKGoal.RightFoot, rightFootPos + new Vector3(0f, offset, 0f)); animator.SetIKRotation(AvatarIKGoal.RightFoot, rightFootRot); } if (isLeftFootIK) { // 左足ウエイトの設定 animator.SetIKPositionWeight(AvatarIKGoal.LeftFoot, leftFootWeight); animator.SetIKRotationWeight(AvatarIKGoal.LeftFoot, leftFootWeight); // 左足の位置と角度を設定 animator.SetIKPosition(AvatarIKGoal.LeftFoot, leftFootPos + new Vector3(0f, offset, 0f)); animator.SetIKRotation(AvatarIKGoal.LeftFoot, leftFootRot); } } } }
前回だかに足元にコライダーを設置なさっていた気がしますがRayの妨げになってませんか?
一度プレイヤー自体を消しヒューマノイドに設定し直して、コリジョンはカプセルコライダーを取りえず足元から上に伸ばしました。それとプレイヤー操作スクリプトと提示スクリプトであるIKスクリプトを入れました。
回答2件
あなたの回答
tips
プレビュー