質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

0回答

1950閲覧

たまにだけプレイヤーの向きがおかしくなる

wonwon

総合スコア13

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2016/12/18 08:53

###前提・実現したいこと
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#です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問