###前提・実現したいこと
Unityでアクションゲームを作るためにプレイヤーを動かしたい
###発生している問題・エラーメッセージ
ごくたまにプレイヤーが空中から最初に地面についたとき、向きが斜め上に固定されてしまって、回転することもできなくなります。なる時とならない時があって混乱しています。
###該当のソースコード using UnityEngine; using System.Collections; public class MyMove : MonoBehaviour { public float jumpPower; //ジャンプ力 public float speed; //速さ public Transform MyCamera; //写すカメラ private float x, z; //入力取得 private Vector3 velocity; //プレイヤーの速度 private Vector3 dir; //プレイヤーの向き private bool jumped; //ジャンプしてるか private bool grounded; //地面にいるか private bool groundedPrev; //前フレームに地面にいるか private Transform groundCheck_L; //着地チェック用(Left) private Transform groundCheck_C; //着地チェック用(Center) private Transform groundCheck_R; //着地チェック用(Right) private Rigidbody rigid; //rigidbody void Start() { rigid = GetComponent<Rigidbody>(); velocity = Vector3.zero; dir = transform.position + transform.forward; jumped = true; grounded = false; groundedPrev = false; groundCheck_L = transform.Find("GroundCheck_L"); groundCheck_C = transform.Find("GroundCheck_C"); groundCheck_R = transform.Find("GroundCheck_R"); } void Update() { velocity.x = 0.0f; velocity.z = 0.0f; //入力取得 x = Input.GetAxis("Horizontal"); z = Input.GetAxis("Vertical"); //カメラの向きにプレイヤーを動かす Vector3 input = x * MyCamera.transform.right + z * MyCamera.transform.forward; input.y = 0.0f; dir = transform.position + transform.forward; if (input.magnitude != 0.0f ) { dir = transform.position + input; //加減速移動 velocity += input.normalized * input.magnitude * speed; } if (jumped) { //ジャンプ中の減速処理 velocity.x *= 0.7f; velocity.z *= 0.7f; } if (Input.GetButtonDown("Jump") && !jumped) { jumped = true; velocity.y += jumpPower; } } void FixedUpdate() { //地面チェック groundedPrev = grounded; grounded = false; bool[] groundCheckList = new bool[3]; groundCheckList[0] = Physics.Raycast(transform.position + new Vector3(0.1f, 0.0f, 0.0f), transform.up * -0.1f, transform.position.y - groundCheck_L.position.y, Physics.AllLayers, QueryTriggerInteraction.Ignore); groundCheckList[1] = Physics.Raycast(transform.position, transform.up * -0.1f, transform.position.y - groundCheck_C.position.y, Physics.AllLayers, QueryTriggerInteraction.Ignore); groundCheckList[2] = Physics.Raycast(transform.position + new Vector3(-0.1f, 0.0f, 0.0f), transform.up * -0.1f, transform.position.y - groundCheck_R.position.y, Physics.AllLayers, QueryTriggerInteraction.Ignore); foreach (bool groundCheck in groundCheckList) { if (groundCheck) { grounded = true; break; } } //着地チェック if (grounded && !groundedPrev) { jumped = false; velocity = Vector3.zero; } Debug.DrawLine(transform.position, transform.position + transform.forward, Color.red); //プレイヤーの角度を変える処理 if (grounded && groundedPrev) { transform.LookAt(dir); } //プレイヤーを移動させる処理 rigid.MovePosition(transform.position + velocity * Time.deltaTime); } }
###補足情報(言語/FW/ツール等のバージョンなど)
MyCamera変数はカメラの向きでプレイヤーの動く向きを決めたかったので付けてます。
RigidBodyコンポーネントのuseGravityでは設定で-19.62の重力にしています。
RigidBodyコンポーネントのFreezeRotationのX,Y,Zすべてにチェックしてます。
プレイヤーにはカプセルコライダーと脚の部分に小さいスフィアコライダーを付けていて、カプセルコライダーには壁にぶつかっても滑るように摩擦を0にしていて、そのままだと地面も滑ってしまうので脚にスフィアコライダーをつけています。
C#です。
あなたの回答
tips
プレビュー