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

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

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

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

C#

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

解決済

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

SIRON007
SIRON007

総合スコア8

for

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

C#

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

2回答

0グッド

0クリップ

310閲覧

投稿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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

SurferOnWww

2022/11/27 03:12

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

2022/11/27 22:48

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

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文の使い方に誤りがあるのでは?と推測した次第です お返事遅くなり申し訳ありません。本業ではなく、現在早急な返信が難しい状況になってしまっており、ご迷惑をお掛けします。
SurferOnWww

2022/11/28 04:47

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

回答2

1

変数 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

SurferOnWww

総合スコア17342

len_souko👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

SIRON007

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)で連続的に移動させる、という意図を実現できずにいるのが現状です。
SurferOnWww

2022/11/28 13:06

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

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

SIRON007

総合スコア8

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

for

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

C#

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