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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

C#

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

Q&A

解決済

2回答

644閲覧

Unity for文の実行結果が目的と異なることについて

退会済みユーザー

退会済みユーザー

総合スコア0

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

C#

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

0グッド

0クリップ

投稿2022/11/27 02:21

前提・実現したいこと

簡潔に言うと、ランダムに選んだ数字によって格納するenemyを決定し、指定の座標でインスタンス化した後、Translateで移動させたい。

①test1flagがtrueのときにEnemyselectnum()で0から1の乱数を一度だけ入手(今後数字の範囲は増やす予定)→数字をselect_enemynumに代入し、void FixedUpdate()内で使えるようにする。falseのときは実行する処理は無しなので、使わない数字の-1を代入した。

②select_enemynumが0のとき→ 配列型のgetenemy[0]の敵をセット。1のとき→getenemy[0]の敵をセットする。格納するenemy1とenemy2はImageのプレハブで、Inspectorに格納した。

③getenemy[i]をenemyobjのGameObjectとして指定の座標でインスタンス化し、x軸負の方向へ移動させ続けたい。

④_②と③をfor文で処理。

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

エラーなし。①select_enemynumの結果によらず、enemy1しか表示されない。② rect_setenemy.Translate(-0.1f, 0, 0);の処理が実行されない。

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Enemy : MonoBehaviour 6{ 7 public GameObject enemy1; 8 public GameObject enemy2; 9 public GameObject canvas; 10 11 GameObject[] getenemy = new GameObject[2]; 12 13 bool test1flag; 14 15 RectTransform enemyrect; 16 17 float enemyposx; 18 float enemyposy; 19 float enemyposz; 20 21 int select_enemynum; 22 23 // Start is called before the first frame update 24 void Start() 25 { 26 test1flag = true; 27 28 getenemy[0] = enemy1; 29 getenemy[1] = enemy2; 30 } 31 32 // Update is called once per frame 33 void FixedUpdate() 34 { 35 Enemyselectnum(); 36 37 for (int i = 0; i <= 1; i++) 38 { 39 if (select_enemynum == i) 40 { 41 enemyrect = getenemy[i].GetComponent<RectTransform>(); 42 Debug.Log(getenemy[i]);//enemy1しか表示されない 43 44 enemyposx = enemyrect.localPosition.x; 45 enemyposy = enemyrect.localPosition.y; 46 enemyposz = enemyrect.localPosition.z; 47 48 enemyposx = 78; 49 enemyposy = 108; 50 enemyposx = 0; 51 52 Vector3 enemypos = new Vector3(enemyposx, enemyposy, enemyposz); 53 54 GameObject enemyobj = Instantiate(getenemy[i], enemypos, Quaternion.identity); 55 enemyobj.transform.SetParent(canvas.transform, false); 56 57 //生成したPrefabを左へ移動させる 58 RectTransform rect_setenemy; 59 rect_setenemy = enemyobj.GetComponent<RectTransform>(); 60 rect_setenemy.Translate(-0.1f, 0, 0); 61 } 62 } 63 } 64 65 private int Enemyselectnum() 66 { 67 if (test1flag == true) 68 { 69 int select_enemynum = Random.Range(0, 2); 70 test1flag = false; 71 Debug.Log(select_enemynum); 72 return select_enemynum; 73 } 74 else 75 { 76 return select_enemynum = -1; 77 } 78 } 79} 80 81

試したこと

デバッグの結果から、select_enemynum == 0のときにenemy1が格納され、select_enemynum == 1のときもenemy1が格納されてしまうことは確認済み。発生している問題①はfor文の認識を何か誤っているのかもしれませんが、エラーが出ていない以上、それ以上の原因追及ができませんでした。

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

Unityバージョン、2020.3.18f1

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/11/27 03:12

変数 select_enemynum のスコープの問題では?
退会済みユーザー

退会済みユーザー

2022/11/27 22:48

質問者さん、回答したのでフィードバックを返してください。役に立った/立たなかったぐらいはすぐに返せるのでは? 役に立たなかったならどこがダメかを書くとより期待に近い回答が出てくるかも。
退会済みユーザー

退会済みユーザー

2022/11/28 03:51 編集

頂いたアドバイスのようにスコープを意識し、int select_enemynum;の記述を削除して問題①と②が解決するか試しましたが、結果は両方ダメでした。select_enemynumはEnemyselectnum()だけに記述している状況です。また、for文の中のif分中のselect_enemynumをEnemyselectnum()に変えました。 また、②について、Translateの-0.1fを例えば-1.0に変えてみると、選ばれたenemyのローカル座標が変化している(-1.0のほうが負の位置にいる)ため、処理は実行されるが、「継続的に移動させる」処理ができていないようです。なので、やはりfor文の使い方に誤りがあるのでは?と推測した次第です お返事遅くなり申し訳ありません。本業ではなく、現在早急な返信が難しい状況になってしまっており、ご迷惑をお掛けします。
退会済みユーザー

退会済みユーザー

2022/11/28 04:47

回答に対するコメントは回答欄下のコメント欄にお願いします。 >int select_enemynum;の記述を削除して問題①と②が解決するか試しましたが・・・ public class Enemy : MonoBehaviour 下の int select_enemynum; を削除したのですか? それではコンパイルも通らないはずですけど。 int select_enemynum = Random.Range(0, 2); の int を削除したらどうなりますか?
guest

回答2

0

変数 select_enemynum のスコープの問題では?

public class Enemy : MonoBehaviour 下の int select_enemynum; はクラス Enemy のフィールド変数です。

一方、Enemyselectnum メソッド内の int select_enemynum = Random.Range(0, 2); で定義されている変数 select_enemynum はメソッド内のローカル変数です。

それらは別物です。だからでは?

投稿2022/11/27 03:20

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2022/11/28 12:49

>int select_enemynum = Random.Range(0, 2); の int を削除したらどうなりますか? デバッグより、enemy1とenemy2はgetenemy[i]に格納されるので、GameObject enemyobj = Instantiate(getenemy[i], enemypos, Quaternion.identity); enemyobj.transform.SetParent(canvas.transform, false); の処理までは意図通り実行できます。ただし、 //生成したPrefabを左へ移動させる RectTransform rect_setenemy; rect_setenemy = enemyobj.GetComponent<RectTransform>(); rect_setenemy.Translate(-0.1f, 0, 0); のところで、UIのImageが表示されるだけで移動し続けません。試しに-0.1fを-1に変更すると、生成される座標が変化するため、処理自体は行われるが、Translate(-0.1f, 0, 0)で連続的に移動させる、という意図を実現できずにいるのが現状です。
退会済みユーザー

退会済みユーザー

2022/11/28 13:06

C# のコードとして明らかに間違っていると思われるところだけ指摘しましたが、それを直してもダメということですと、実際に動かしてデバッグできない自分にはお手上げです。お役に立てずすみませんが、他の方の回答をお待ちください。
guest

0

ベストアンサー

こちらのスクリプトで解決できたので記します。格納までの処理をfor文中で行い、Translateの処理はfor文の外で実行。やはりfor文の使い方を一部誤っていたようです。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Enemy_ : MonoBehaviour 6{ 7 public GameObject enemy1; 8 public GameObject enemy2; 9 public GameObject canvas; 10 11 GameObject[] getenemy = new GameObject[2]; 12 //test 13 GameObject enemyobj; 14 15 bool test1flag; 16 17 RectTransform enemyrect; 18 19 float enemyposx; 20 float enemyposy; 21 float enemyposz; 22 23 int select_enemynum; 24 25 // Start is called before the first frame update 26 void Start() 27 { 28 test1flag = true; 29 30 getenemy[0] = enemy1; 31 getenemy[1] = enemy2; 32 } 33 34 // Update is called once per frame 35 void FixedUpdate() 36 { 37 Enemyselectnum(); 38 39 for (int i = 0; i <= 1; i++) 40 { 41 if (select_enemynum == i) 42 { 43 enemyrect = getenemy[i].GetComponent<RectTransform>(); 44 Debug.Log(getenemy[i]);//enemy1しか表示されない 45 46 enemyposx = enemyrect.localPosition.x; 47 enemyposy = enemyrect.localPosition.y; 48 enemyposz = enemyrect.localPosition.z; 49 50 enemyposx = 78; 51 enemyposy = 108; 52 enemyposx = 0; 53 54 Vector3 enemypos = new Vector3(enemyposx, enemyposy, enemyposz); 55 56 57 enemyobj = Instantiate(getenemy[i], enemypos, Quaternion.identity); 58 //GameObject enemyobj = Instantiate(getenemy[i], enemypos, Quaternion.identity); 59 enemyobj.transform.SetParent(canvas.transform, false); 60 } 61 } 62 63 //生成したPrefabを左へ移動させる 64 RectTransform rect_setenemy; 65 rect_setenemy = enemyobj.GetComponent<RectTransform>(); 66 rect_setenemy.Translate(-0.01f, 0, 0); 67 } 68 69 private int Enemyselectnum() 70 { 71 if (test1flag == true) 72 { 73 select_enemynum = Random.Range(0, 2); 74 test1flag = false; 75 Debug.Log(select_enemynum); 76 return select_enemynum; 77 } 78 else 79 { 80 return select_enemynum = -1; 81 } 82 } 83} 84

投稿2022/12/03 07:17

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問