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

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

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

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

Q&A

1回答

1617閲覧

Unityで作成したswitch文が機能せず、ランダムでcase内容が出力されてしまう

naki888

総合スコア12

C#

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

0グッド

0クリップ

投稿2020/07/29 10:27

Unityにて、何かしらボタンをクリックした際に、オブジェクトにアクションさせ、アクション後に次のアクションを実行させるようにswitch文を作成しました。ただ、その分岐が機能せず、ランダムでcase内容が出力されてしまいます。
エラーなどは発生しておりません。

どのようにswitch文のcase内容を順に実行するようにできるでしょうか。

ご教示いただければ幸いです。

using System.Collections; using System.Collections.Generic; using UnityEngine; public class EnemyManager : MonoBehaviour { Vector3 MOVEX = new Vector3(1.0f, 0, 0); Vector3 MOVEY = new Vector3(0, 1.0f, 0); Vector3 MOVEZ = new Vector3(0, 0, 1.0f); float step = 2f; // 移動速度 Vector3 target; // 入力受付時、移動後の位置を算出して保存 Vector3 prevPos; // 何らかの理由で移動できなかった場合、元の位置に戻すため移動前の位置を保存 private enum MoveType { FORWARD_1 = 0, // 前進1 UP = 1, // 左へ FORWARD_2 = 2, // 前進2 Z = 3 // 右へ } private MoveType moveType = MoveType.FORWARD_1; // Use this for initialization void Start() { target = transform.position; } // Update is called once per frame void Update() { // ① 移動中かどうかの判定。移動中でなければ入力を受付 if (transform.position == target) { switch (moveType) { case MoveType.FORWARD_1: SetTargetPosition(); moveType++; break; case MoveType.UP: SetTargetPosition1(); moveType++; break; case MoveType.FORWARD_2: SetTargetPosition2(); moveType++; break; case MoveType.Z: SetTargetPosition3(); moveType=0; break; } } Move(); } // ② 入力に応じて移動後の位置を算出 void SetTargetPosition() { prevPos = target; if (Input.anyKeyDown) { target = transform.position + MOVEX; return; } } void SetTargetPosition1() { prevPos = target; if (Input.anyKeyDown) { target = transform.position + MOVEY; return; } } void SetTargetPosition2() { prevPos = target; if (Input.anyKeyDown) { target = transform.position + MOVEX; return; } } void SetTargetPosition3() { prevPos = target; if (Input.anyKeyDown) { target = transform.position + MOVEZ; return; } } // ③ 目的地へ移動する void Move() { transform.position = Vector3.MoveTowards(transform.position, target, step * Time.deltaTime); } }

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

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

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

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

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

guest

回答1

0

コード読んだ感じ、毎フレームごとにmoveTypeを++もしくは0にしているので、ランダムのように見えているのだと思います。
目的がいまいち把握できていないのですが、「キーボードを押したらmoveTypeを変化する」という動作であれば、各関数のif (Input.anyKeyDown)内で変化させればいいのではないでしょうか?

投稿2020/07/29 11:56

yuuyu

総合スコア1139

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

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

naki888

2020/07/30 00:06

本来はmoveTypeをcountにしてcount=1の時、count=2の時・・・count=4の時、そしてcount=4になったらcount=0のものからアクションをさせ直すという形にifで作成しようとしたのですが、int値のためif 分が使えませんでした。なので、switch~caseにさせています。 ++はmoveTypeを一つ完了したら、次のmoveTypeにうつるようにしたものです。 実際にオブジェクトにスクリプトをアタッチして観測した動きがランダムであったので、ランダムです。 1回目、z→x→z→x→xで再生 2回目、y→y→x→z→yで再生 などとなります。 もし可能ならif (Input.anyKeyDown)の内容を記述いただけたら幸いです。
yuuyu

2020/07/30 01:13

一つ確認ですが、 「++はmoveTypeを一つ完了したら、次のmoveTypeにうつるようにしたものです。」 とは、キーが押されているかどうかに関わらず、case内容をくぐれば次のmoveTypeに移る、という認識であっていますか? 現状のソースコードではそういう風に記載されていますが、もし期待した内容が キーが押された時だけ、次のmoveTypeに移る であれば、moveType++;をif (Input.anyKeyDown)の中に移すだけになると思います。
naki888

2020/07/30 07:32

ご回答ありがとうございます。 一旦下記のコード内容(およびアニメーションの使用パターン)で解決しました。 using System.Collections; using System.Collections.Generic; using UnityEngine; public class EnemyManager : MonoBehaviour { Vector3 MOVEX = new Vector3(1.0f, 0, 0); Vector3 MOVEY = new Vector3(0, 1.0f, 0); Vector3 MOVEZ = new Vector3(0, 0, 1.0f); float step = 3.0f; // 移動速度 Vector3 target; // 入力受付時、移動後の位置を算出して保存 private int count = 0; // Use this for initialization void Start() { target = transform.position; } // Update is called once per frame void Update() { if (Input.anyKeyDown) { count++; if (count == 1) { target = transform.position + MOVEX; } if (count == 2) { target = transform.position + MOVEY; } if (count == 3) { target = transform.position + MOVEZ; } } Move(); } // ③ 目的地へ移動する void Move() { this.transform.position = Vector3.MoveTowards(transform.position, target, step * Time.deltaTime); } }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問