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

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

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

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

Unity

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

Q&A

解決済

2回答

1384閲覧

ジャンプ中に移動ボタンを離しても着地後移動し続けてしまう

RYU_L

総合スコア1

C#

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

Unity

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

0グッド

0クリップ

投稿2022/01/05 13:11

前提・実現したいこと

昨日の今日ですみません。
空中でWASD(移動)ボタンを離した後、着地後もX,Zのスピードが保持されてしまい、何も押さずとも移動し続けてしまいます
コメントアウトしてるスクリプトに←失敗と書かれているところが考えて試したところです。
見づらくて申し訳ないのですが、ご教示お願い致します。

着地後のログです

(0.0, 166.2, -50.0) UnityEngine.Debug:Log (object) SHIGURU_move:Update () (at Assets/SHIGURU_move.cs:102)

該当のソースコード

using System.Collections; using System.Collections.Generic; using UnityEngine; public class SHIGURU_move : MonoBehaviour { private float Speed = 50F; private float jumpSpeed = 100f; public float Mass = 50f; public float Gravity = -9.8f; [SerializeField] AnimationCurve curve; // movedirection移動方向用変数=zeroでverctor3の(x,y,z)の3軸の数値を0にしてる private Vector3 MoveDirection = Vector3.zero; //移動情報保持用変数 private Vector3 TargetDirection; private Quaternion Rotation; private CharacterController controller; void Start() { //つけられてるコンポーネントの情報(x.y.z)を参照 controller = GetComponent<CharacterController>(); } // Update is called once per frame void Update() { //もしcontrollerの座標がisGrounded(地面に)ついていたら if (controller.isGrounded) { //そもそも移動入力してないときはスピードを0、59行目でスピードを与える //Speed = 0f;←失敗 44行目 //=newで新しい追加情報?を与えて(Input.GetAxis("横"), 0.0f, Input.GetAxis("前後")) //MoveDirection = new Vector3(Input.GetAxis("Horizontal"), 0.0f, Input.GetAxis("Vertical")); //ボタン入力でTargetDirectionのx,zが変動 TargetDirection = new Vector3(Input.GetAxis("Horizontal"), 0.0f, Input.GetAxis("Vertical")); //Input.GetButtonUp("Jump")は押されたか押されてないかの正か負のみで数値ではないから入らない 型が違う //TargetDirection = new Vector3(Input.GetAxis("Horizontal"), Input.GetButton("Jump"), Input.GetAxis("Vertical"));←失敗 //TargetDirectionが(0,0,0)出ない場合 if (TargetDirection != Vector3.zero) { //44行目で0になってるスピードに、入力されたとき50fを与える //Speed = 50F;←失敗 59行目 //キャラクターに入力された移動情報が入る MoveDirection = TargetDirection; //=で新しくさっき格納した(Input.GetAxis("Horizontal"), 0.0f, Input.GetAxis("Vertical"));に入力ボタンでの移動スピードの情報を追加 //さっきの文にInput.GetAxis("Vertical") * Speedでも可能だった、見やすさ重視? MoveDirection = MoveDirection * Speed; //現在の回転情報 = 進行方向に向きを直す(移動方向) transform.rotation = Quaternion.LookRotation(MoveDirection); //Debug.Log(MoveDirection); } //ジャンプ if (Input.GetButton("Jump")) { jumpSpeed += 1.5f; // Mathf.Clampは(現在, 最小, 最大)で最小か最大を超えようとしたとき、最小か最大の値が左辺にあてはめられる jumpSpeed = Mathf.Clamp(jumpSpeed, 100, 250); } if (Input.GetButtonUp("Jump") || jumpSpeed == 250f) { //transform.Translate(0, 10, 0); //変数MoveDirextionのどこに力を加えるかを.yで上下に指定 xだと横 //このスクリプトだと空中でボタン離した後もspeedが0にならず移動し続けてしまう MoveDirection.y = jumpSpeed * curve.Evaluate(Time.deltaTime); //移動ボタンが離されても移動情報が保持されないといけない //このスクリプトだと垂直ジャンプになり、移動慣性がふくまれない //MoveDirection = new Vector3(0, jumpSpeed * curve.Evaluate(Time.deltaTime) ,0);←失敗 //このスクリプトだと空中でボタン離した後もspeedが0にならず移動し続けてしまう MoveDirection.y = jumpSpeed * curve.Evaluate(Time.deltaTime);と同じ意味合い //MoveDirection = new Vector3(Input.GetAxis("Horizontal") * Speed, jumpSpeed * curve.Evaluate(Time.deltaTime) ,Input.GetAxis("Vertical") * Speed);←失敗 //移動用変数に座標をいれる //MoveDirection = transform.position;←失敗 とばなくなった //Debug.Log(jumpSpeed); Debug.Log(MoveDirection); //ジャンプ後 力を初期値に jumpSpeed = 100f; //着地で一旦、移動スピードを0にそのままだと動けなくなるのでその後スピードの値を再定義、だが同じくボタン離した後も移動し続ける /*if (controller.isGrounded) { Speed = 0;  //←失敗 } /*Speed = 50F;*/ } } //重力のかかる方向Y=Y方向の飛ぶ力から - (重力*時間=落下速度で力を引いてる MoveDirection.y = MoveDirection.y + (Gravity * Mass * Time.deltaTime); //controllerにMove機能(格納されてる各方向への移動する力とボタン情報 * 時間)重力による摩擦係数? controller.Move(MoveDirection * Time.deltaTime); } }

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

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

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

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

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

guest

回答2

0

自己解決

if文でボタン入力されていないとき行う部分処理を追加してスピードを0にしたら解決しました

投稿2022/01/06 16:21

RYU_L

総合スコア1

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

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

0

提示コードの末尾にある

controller.Move(MoveDirection * Time.deltaTime);

MoveDirection の x,z 要素が0でないことが問題の現象(動くこと)を起こすという話なのであれば,
そこを0にすればよいのでは.

逆に言えば,

ボタンを離した後

に誰もそれらの成分を0にしていない,というのが問題の原因では?

MoveDirection の x,z が変更されそうな処理は

if (TargetDirection != Vector3.zero)

の条件を満たしたときにしか存在していなさそうですが,これだと TargetDirection が零ベクトル,すなわち「ボタンが押されていない」ときには当該処理は走らないわけですから,x,z は保持され続けるのでは.

投稿2022/01/06 01:26

fana

総合スコア11996

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

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

fana

2022/01/06 01:29 編集

…っていう回答内容が当たってるかどうかはともかくとして, このように逆算(?)的に考えていき,怪しい値をチェックする等して原因を見つけてください. 「どの変数が何なのか?」といったことはあなたが一番よく知っているのだから,あなたが一番うまく原因を推理できる人なわけですから. (要は,「んなもん,さっさとデバッグすれば?」っていう)
RYU_L

2022/01/06 16:23

fanaさんもありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問