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

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

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

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

Unity

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

Q&A

解決済

1回答

1132閲覧

【 Unity C#】パネル切り替え時に歩行動作を完全に止める方法

sho0

総合スコア6

C#

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

Unity

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

0グッド

0クリップ

投稿2020/05/27 06:42

編集2020/05/29 06:38

前提・実現したいこと

パネル切り替え時に歩行を止めたいです。

ここに質問の内容を詳しく書いてください。

現在Unityでパネルを複数作って、トランスフォームをスクリプトでイジり、シーンの切り替えをしております。
イメージ説明

歩いているとエンカウントでバトルパネルに切り替わるようにしていて、TM = player.GetComponent<walk2>();
TM.enabled = false;で歩行のスクリプトを消しています。(walk2を消している。)
イメージ説明

しかし、消えた後も、最後に入力していたキーの方向に移動を永遠に続けます。

下記の写真のようになります。
イメージ説明
イメージ説明

ちゃんとシーンが切り替われば止まるようにするにはどうしたら良いでしょうか?

発生している問題・エラーメッセージ

特になし

エラーメッセージ

該当のソースコード

using System.Collections; using System.Collections.Generic; using UnityEngine; public class encount : MonoBehaviour { [SerializeField] private float encountMinTime = 3f; // 敵と遭遇するランダム時間 [SerializeField] private float encountMaxTime = 30f; // 経過時間 [SerializeField] private float elapsedTime; // 目的の時間 [SerializeField] private float destinationTime; private walk2 TM; public GameObject player; public const int WALL_FRONTS = 1; public const int WALL_RIGHTS = 2; public GameObject panelWalls; private int wallNo; // Start is called before the first frame update void Start() { wallNo = WALL_FRONTS; SetDestinationTime(); } // Update is called once per frame void Update() { if (Mathf.Approximately(Input.GetAxis("Horizontal"), 0f) && Mathf.Approximately(Input.GetAxis("Vertical"), 0f) ) { return; } // 経過時間をカウント elapsedTime += Time.deltaTime; // 3秒後に画面遷移(scene2へ移動) if (elapsedTime >= destinationTime) { TM = player.GetComponent<walk2>(); TM.enabled = false; if (elapsedTime >= destinationTime) { wallNo++; elapsedTime = 0f; SetDestinationTime(); DisplayWall(); } } } public void SetDestinationTime() { destinationTime = Random.Range(encountMinTime, encountMaxTime); } void DisplayWall() { switch (wallNo) { case WALL_FRONTS: panelWalls.transform.localPosition = new Vector3(0.0f, 0.0f, 0.0f); break; case WALL_RIGHTS: panelWalls.transform.localPosition = new Vector3(-2000.0f, 0.0f, 0.0f); break; } } }

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

Tto777

2020/05/30 09:36

移動のさせ方によってはコンポーネントの機能を止めても移動は続けるので移動操作をおこなっているコードwalk2を追記して下さい
sho0

2020/05/30 09:50

using System.Collections; using System.Collections.Generic; using UnityEngine; /** * キャラの座標を変更するController */ public class walk2 : MonoBehaviour { [SerializeField] float SPEED = 1.0f; private Rigidbody2D rigidBody; private Vector2 inputAxis; void Start() { // オブジェクトに設定しているRigidbody2Dの参照を取得する this.rigidBody = GetComponent<Rigidbody2D>(); } void Update() { // x,yの入力値を得る // それぞれ+や-の値と入力の関連付けはInput Managerで設定されている inputAxis.x = Input.GetAxis("Horizontal"); inputAxis.y = Input.GetAxis("Vertical"); } private void FixedUpdate() { // 速度を代入する rigidBody.velocity = inputAxis.normalized * SPEED; } }
sho0

2020/05/30 09:51

こちらになります。
guest

回答1

0

ベストアンサー

rigidBody.velocityが原因です。
与えられた力はTM.enabled = falseをおこなってもRigidBodyに残ります。

他の移動のさせ方に変更するか戦闘中は常にrigidBody.velocityが0になるよう修正して下さい。

投稿2020/05/30 10:36

編集2020/05/30 10:38
Tto777

総合スコア189

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

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

sho0

2020/05/31 11:56

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問