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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

解決済

1回答

2169閲覧

velocityで速度を取得したいが移動中も何故か値が0でたまに数値が変わるという謎の現象の理由と対処法が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

0クリップ

投稿2020/02/14 08:37

編集2020/02/14 11:30

提示コード部のFixedUpdate()部の提示画像のデバッグログの右の何回同じものが出力されたかという数字の部分ですが何故か移動中ににもかかわらずログが(0,0,0)で移動中にたまに(2.0,0,0)などといったおかしなログが出力されてしまうのでしょうか?rb.AddForceの後にDebug.Log()を載せているので直前の値が出力されるはずなのですが原因がわかりません。

質問内容:ログの値がおかしい原因と理由が知りたい。
質問内容2:move.x *= 100などのいった値がmoveに入っていながらも2.0といった値もなぜこんなに小さい値なのかも謎ですこれは正しい可能性もありますが気になったので質問しました。
Unityリファレンス: https://docs.unity3d.com/ja/2018.4/ScriptReference/Rigidbody-velocity.html

イメージ説明

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] Vector3 slope_range = new Vector3(0, 0, 0); // Use this for initialization void Start() { Ground = GameObject.Find("GroundCheck"); Slope = GameObject.Find("SlopeCheck"); walk_speed = 5.0f; gravity = Vector3.zero; rb = GetComponent<Rigidbody>(); ani = GetComponent<Animator>(); } void Gravity_Mng()//ジャンプ管理 { } void Slope_Mng()//坂道 { RaycastHit hit; Vector3 forward = transform.forward + slope_range; Debug.DrawLine(Slope.transform.position, Slope.transform.position + forward ,Color.blue); // float speed = Mathf.Sqrt((move.x * move.x) + (move.z * move.z)); float speed = Mathf.Sqrt((rb.velocity.x * rb.velocity.x) + (rb.velocity.z * rb.velocity.z)); if(speed != 0){ if(Physics.Linecast(Slope.transform.position, Slope.transform.position + forward, out hit,LayerMask.GetMask("Slope")) == true) { Debug.Log("坂道のRayヒット!"); v = new Vector3(0f, (Quaternion.FromToRotation(Vector3.up, hit.normal) * transform.forward * speed).y, 0f) + transform.forward * speed; Debug.Log("v.y: "+ v.y); } }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) { transform.rotation = Quaternion.LookRotation(move.normalized); } move.x *= 100; move.z *= 100; } // 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))); } ////////////////////////////////////////////////////////////////////////////////////////////// void FixedUpdate() { rb.AddForce(move.x, 0, move.z); Debug.Log("velocity: " + rb.velocity); } ////////////////////////////////////////////////////////////////////////////////////////////// }

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問内容:ログの値がおかしい原因と理由が知りたい。

ログ自体は正常ですね。単にUpdateは毎フレーム呼ばれるのに対し、FixedUpdateは設定されている一定秒数ごとに呼ばれるというよばれる違いからなる処理の手順ミスによるものです。
一定秒数ごとと言うのが肝で、この関数に関してはしっかりと順番通りに呼ばれるというものではないということです。
それを回避したいなら、Update側にフレーム単位で時間を計測できるint型のデータでも持たせることです。

int timer = 0; void Update(){ timer++; //60FPS固定の場合、1秒ごとに出力 if(timer >= 60){ timer = 0; //ここにFixedUpdateの処理を書けばいい } }

質問内容2:move.x *= 100などのいった値がmoveに入っていながらも2.0といった値もなぜこんなに小さい値なのかも謎です

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; move.x *= 100; move.z *= 100;

Camera.main.transform.rightと言うのは、正規化したベクトルです。正規化と言うことは、との軸の情報も絶対に1.0を超えません。
それに乗算している、Input.GetAxis();も-1から1の入力を返却するというものなので、理論的には100倍してもそこまで数値変わらなかったはず。

No

1カメラ * キー押し込み * 100 = ??? 2 31.0 * 1.0 * 100 = 100 40.77 * 1.0 * 100 = 77 50.5 * 0.5 * 100 = 25 60.25 * 0.1 * 100 = 2.5

てか変化率デカ!!
それがカメラの回転方向とキーの押し込み具合で決まるとか、ゲームとしてどうかと思います...

投稿2020/02/17 01:47

stdio

総合スコア3307

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問