坂道を上がり下がりする時のY軸の移動量をする処理がSlope_Mng()関数のコードです。提示画像の線がRayです。
質問1、困っていること、提示画像のようにRayを2方向に飛ばし緑のRayは下がる時に斜面に当たりY軸の移動量を計算しているのですが提示画像2、3、番目のように動いているときと止まっているときで微妙に浮いてしまってキーを離したときにY軸が下がってしまったり、斜面を下がり続けるとだんだん空中に浮いてしまい斜面を下り終えると空中にその分浮いてしまいます。これはどうすればいいのでしょうか?
質問2、またRayの場所や長さはこれいいのか?そもそも実装法が正しいのかどうかなど知りたいです。
質問3、プロだったらどう実装するのか知りたい
参考サイト: https://gametukurikata.com/program/rigidbodyandcollider
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; private bool isDush; GameObject Ground; /*坂道計算*/ GameObject Slope; [SerializeField] float slope_range; [SerializeField] Vector3 slope_direc = new Vector3(0, 0, 0); [SerializeField] Vector3 slope_direc_b = new Vector3(0, 0, 0); // [SerializeField] Vector3 slope_pos; // Use this for initialization void Start() { Ground = GameObject.Find("GroundCheck"); Slope = GameObject.Find("SlopeCheck"); Slope.transform.position = slope_pos + Slope.transform.position; walk_speed = 100; gravity = Vector3.zero; rb = GetComponent<Rigidbody>(); ani = GetComponent<Animator>(); } void Gravity_Mng()//ジャンプ管理 { } void Slope_Mng()//坂道 { RaycastHit hit; //Vector3 forward = Slope.transform.forward + slope_range; Vector3 forward = (Slope.transform.forward + slope_direc) * slope_range; Vector3 forward_b = (Slope.transform.forward + slope_direc_b) * slope_range; Debug.DrawLine(Slope.transform.position, Slope.transform.position + forward, Color.blue); Debug.DrawLine(Slope.transform.position, Slope.transform.position + forward_b ,Color.green); // float speed = Mathf.Sqrt((move.x * move.x) + (move.z * move.z)); // float speed = Mathf.Abs(Mathf.Sqrt((move.x * move.x) + (move.z * move.z))); float speed = 100; Debug.Log("speed: " + speed); if(move != Vector3.zero){ if(Physics.Linecast(Slope.transform.position, Slope.transform.position + forward, out hit,LayerMask.GetMask("Slope")) == true) { v = new Vector3(0f, (Quaternion.FromToRotation(Vector3.up, hit.normal) * transform.forward * speed).y, 0f) + transform.forward * speed; //Debug.Log("v.y: "+ v.y); Debug.Log("坂道のRayヒット! 上がる" + v.y); }else if(Physics.Linecast(Slope.transform.position, Slope.transform.position + forward_b, out hit, LayerMask.GetMask("Slope")) == true) { v = new Vector3(0f, (Quaternion.FromToRotation(Vector3.up, hit.normal) * transform.forward * speed).y, 0f) + transform.forward * speed; //Debug.Log("v.y: "+ v.y); Debug.Log("坂道のRayヒット! 下がる" + v.y); }else{ v.y = 0; } } else{ v.y = 0; } } void Move_Mng() { input_h = Input.GetAxis("Horizontal"); input_v = Input.GetAxis("Vertical"); Vector3 move_z = new Vector3(); Vector3 move_x = new Vector3(); move_z = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized * input_v; move_x = Camera.main.transform.right * input_h; move = move_x + move_z; if (move != Vector3.zero) { move.y = 0; transform.rotation = Quaternion.LookRotation(move.normalized); } } // Update is called once per frame void Update() { Gravity_Mng(); Slope_Mng(); Move_Mng(); // Debug.Log("velocity: " + Mathf.Sqrt((rb.velocity.x * rb.velocity.x) + (rb.velocity.z * rb.velocity.z))); Debug.Log("velocity: " + rb.velocity); move *= 100; } ////////////////////////////////////////////////////////////////////////////////////////////// void FixedUpdate() { // rb.AddForce(move.x, v.y, move.z); rb.AddForce(move.x, v.y, move.z); } ////////////////////////////////////////////////////////////////////////////////////////////// }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。