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

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

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

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

Unity

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

Q&A

1回答

1833閲覧

ランダムに選ばれたオブジェクトを移動させたい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity

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

0グッド

1クリップ

投稿2018/07/19 13:12

###前提・実現したいこと
ランダムに選ばれたオブジェクト(Prefabになっている)を右から左に移動させたい。
スクリプトは空のオブジェクトにアタッチしているのでこの状態では空のオブジェクトが移動してしまいます。
ランダムに選ばれたオブジェクトを移動させる方法があれば、ご教授願います。
###該当のソースコード

c#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class RandomStageController : MonoBehaviour { 6 private Rigidbody2D rb2D; 7 public GameObject[] Train; 8 float vector = 1; //移動速度 9 10 void Start(){ 11 StartCoroutine (SpeedUp()); 12 StartCoroutine (Walls()); 13 rb2D = GetComponent<Rigidbody2D>(); 14 } 15 16 void Update(){ 17 this.transform.position += new Vector3(vector, 0, 0); //移動 18 } 19 20 IEnumerator SpeedUp(){ 21 while (vector <= 30) { 22 vector++; 23 yield return new WaitForSeconds (10f); //10秒に一度vectorの速度をアップ 24 25 } 26 } 27 28 IEnumerator Walls(){ 29 while (true) { 30 int number = Random.Range (0, Train.Length); 31 Instantiate(Train[number],transform.position,transform.rotation); //ランダムに抽選 32 yield return new WaitForSeconds (3f); //3秒に一度 33 } 34 } 35}

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

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

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

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

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

guest

回答1

0

Instantiateは「生成したオブジェクト」を返します。
それを利用して移動したいオブジェクトを適切に指定すればいいかと。
(とりあえず「最後に生成したオブジェクト」を移動する形にしています)

C#

1public class RandomStageController : MonoBehaviour { 2 private Rigidbody2D rb2D; 3 public GameObject[] Train; 4 float vector = 1; //移動速度 5 6 //追記:生成したオブジェクト 7 private GameObject choiceTrain; 8 9 void Start(){ 10 StartCoroutine (SpeedUp()); 11 StartCoroutine (Walls()); 12 rb2D = GetComponent<Rigidbody2D>(); 13 } 14 15 void Update(){ 16 //編集:生成したオブジェクトを動かすようにする(一応存在チェックしておく) 17 if (choiceTrain != null) { 18 choiceTrain.transform.position += new Vector3(vector, 0, 0); //移動 19 } 20 } 21 22 IEnumerator SpeedUp(){ 23 while (vector <= 30) { 24 vector++; 25 yield return new WaitForSeconds (10f); //10秒に一度vectorの速度をアップ 26 27 } 28 } 29 30 IEnumerator Walls(){ 31 while (true) { 32 int number = Random.Range (0, Train.Length); 33 34 //編集:生成したオブジェクトを代入する 35 //(InstantiateはObject型を返すので「as GameObject」でGameObject型に変換する) 36 choiceTrain = Instantiate(Train[number],transform.position,transform.rotation) as GameObject; //ランダムに抽選 37 yield return new WaitForSeconds (3f); //3秒に一度 38 } 39 } 40}

投稿2018/07/20 00:38

sakura_hana

総合スコア11427

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

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

退会済みユーザー

退会済みユーザー

2018/07/20 03:37

ご回答ありがとうございます。 Prefabのオブジェクトは動いたのですが、画面内の途中で動きが止まってしまいます。 対処法をよろしければお教えください。
sakura_hana

2018/07/20 04:06

"とりあえず「最後に生成したオブジェクト」を移動する"と記載した通り、今のコードだと次のオブジェクトが生成されたら前のオブジェクトは移動しなくなります。 ずっと動かしたいなら生成されるオブジェクトを全て変数に入れる必要があります。 https://qiita.com/otochan/items/28c3ecf7377ba56187c5
退会済みユーザー

退会済みユーザー

2018/07/20 04:37

すみません、初心者なもので"生成されるオブジェクトを全て変数に入れる"がいまいち分かりません。 詳しく教えていただけないでしょうか...。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問