IKを使って段差や斜面で足の裏が地面に着くというIkの処理を実装したいのですが実装できませんどうしたらいいのでしょうか?
1、ヒューマノイドです。
2、IK passにチェックを入れてる
3、最低一つのアニメクリップが入ったアニメーションコントローラを入れた
4.カーブを作成し1にしている。二枚目の設定画像を参照
質問ですが重さとはなんでしょうか?0~1の数値
質問2 スクリプトをアタッチする場所をそのプレイヤーにアタッチしているのですがそもそもどこにアタッチすべきなのでしょうか?
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), (-transform.up * rayRange), Color.red); // Debug.Log(-transform.up * rayRange); var ray = new Ray(animator.GetIKPosition(AvatarIKGoal.RightFoot), -transform.up); RaycastHit hit; /*右足用のレイを飛ばす処理*/ if (Physics.Raycast(ray, out hit, rayRange)) { Debug.Log("右足 IK"); rightFootPos = hit.point; rightFootRot = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation; isRightFootIK = true; } else { isRightFootIK = false; } ray = new Ray(animator.GetIKPosition(AvatarIKGoal.LeftFoot), -transform.up); // 左足用のレイの視覚化 Debug.DrawRay(animator.GetIKPosition(AvatarIKGoal.LeftFoot), -transform.up * rayRange, Color.red); /*左足用のレイを飛ばす処理*/ if (Physics.Raycast(ray, out hit, rayRange)) { Debug.Log("左足 IK"); leftFootPos = hit.point; leftFootRot = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation; isLeftFootIK = true; } else { isLeftFootIK = false; } // IKを使う時だけ if (isUseIK) { Debug.Log("IK"); // アニメーションの状態からウエイトを取得 rightFootWeight = animator.GetFloat("RightFootWeight"); leftFootWeight = animator.GetFloat("LeftFootWeight"); /*右 IK*/ 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); } /*左 IK*/ 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); } } } }
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。