IKのスクリプトを書いてDebug.Log()を見て確認しましたがどうもif()文のIKしている行にコードが移動しているということは事実であり。角度を代入していることも事実なのですがなぜか坂道で足元に角度が入っていませんこれはなぜでしょうか?
以下はプレイヤーにアタッチしているスクリプトです。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Controller : MonoBehaviour { private float input_h; private float input_v; private Vector3 move; private Rigidbody rb; private float walk_speed;//移動速度 private Animator ani;//移動速度 private Vector3 gravity; private bool isJump = false;//ジャンプしてるかどうかを管理する private Vector3 v = new Vector3(0,-60.0f,0); GameObject cg; ground ground_sct; // Use this for initialization void Start () { walk_speed = 10.0f; gravity = Vector3.zero; rb = GetComponent<Rigidbody>(); ani = GetComponent<Animator>(); gravity.y = 0; } void Animation_Mng() { float f = Mathf.Abs(Mathf.Sqrt(move.x * move.x + move.z * move.z)); //Debug.Log(f); ani.SetFloat("move",f); } void IK_Mng()//ジャンプ管理 { } // Update is called once per frame void Update () { Animation_Mng(); input_h = Input.GetAxis("Horizontal"); input_v = Input.GetAxis("Vertical"); Vector3 move_x = new Vector3(); Vector3 move_y = new Vector3(); move_y = Vector3.Scale(Camera.main.transform.forward , new Vector3(1, 0, 1)).normalized * input_v * walk_speed; move_x = Camera.main.transform.right * input_h * walk_speed; move = move_x + move_y; if(move != Vector3.zero){ transform.rotation = Quaternion.LookRotation(move.normalized); } rb.velocity = move; Debug.Log("gravity.y: " + gravity.y); } Vector3 rightFootPos = new Vector3(0,0,0); Vector3 leftFootPos = new Vector3(0,0,0); Quaternion rightFootRot = new Quaternion(0,0,0,0); Quaternion leftFootRot = new Quaternion(0,0,0,0); bool isRightFootIK = false; bool isLeftFootIK = false; float RightIkWeight = 0; float LeftIkWeight = 0; /*補正系*/ Vector3 rayPositionOffset = new Vector3(0,0,0); float rayRange = 1.0f; float offset = 0.1f; /////////////////////////////////////////////////////////////////////////////////////////////////////////////// private void OnAnimatorIK() { Debug.DrawRay(ani.GetIKPosition (AvatarIKGoal.RightFoot) + rayPositionOffset, -transform.up * rayRange, Color.red); Debug.DrawRay(ani.GetIKPosition (AvatarIKGoal.LeftFoot) + rayPositionOffset, -transform.up * rayRange, Color.red); var ray = new Ray(ani.GetIKPosition (AvatarIKGoal.RightFoot) + rayPositionOffset, -transform.up); RaycastHit hit; if (Physics.Raycast (ray, out hit, rayRange, LayerMask.GetMask ("Field"))) { Debug.Log("ray right"); rightFootPos = hit.point; rightFootRot = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation; isRightFootIK = true; } else { isRightFootIK = false; } ray = new Ray(ani.GetIKPosition (AvatarIKGoal.LeftFoot) + rayPositionOffset, -transform.up); if (Physics.Raycast (ray, out hit, rayRange, LayerMask.GetMask ("Field"))) { Debug.Log("ray left"); leftFootPos = hit.point; leftFootRot = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation; isLeftFootIK = true; } else { isLeftFootIK = false; } RightIkWeight = ani.GetFloat("Right_foot"); LeftIkWeight = ani.GetFloat("Left_foot"); if(isRightFootIK){ Debug.Log("right ik"); ani.SetIKPositionWeight(AvatarIKGoal.RightFoot,RightIkWeight); ani.SetIKRotationWeight(AvatarIKGoal.RightFoot,RightIkWeight); ani.SetIKPosition(AvatarIKGoal.RightFoot,rightFootPos + new Vector3(0f,offset,0f)); ani.SetIKRotation(AvatarIKGoal.RightFoot,rightFootRot); } if(isLeftFootIK){ Debug.Log("left ik"); ani.SetIKPositionWeight(AvatarIKGoal.LeftFoot,LeftIkWeight); ani.SetIKRotationWeight(AvatarIKGoal.LeftFoot,LeftIkWeight); ani.SetIKPosition(AvatarIKGoal.LeftFoot,leftFootPos + new Vector3(0f,offset,0f)); ani.SetIKRotation(AvatarIKGoal.LeftFoot,leftFootRot); } Debug.Log("aaaaaaa"); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////// void FixedUpdate() { //rb.AddForce(gravity); rb.AddForce(gravity); //rb.AddForce(v); } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。