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

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

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

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

Unity

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

Q&A

解決済

2回答

8724閲覧

Unity C#でランダムに1~10のシーンを重複無しで切り替えたい。

kanatan1231

総合スコア18

C#

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

Unity

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

0グッド

0クリップ

投稿2018/11/02 07:02

編集2018/11/03 02:09

Unityでランダムに重複無しでシーンを切り替えたい

問題を出すアプリを作成しているのですが、問題一つ一つにシーンを作成しており、タイトル画面から10個のシーンを重複無しで切り替えたいと思っています。

調べてみたところ、ランダムにシーンを切り替えるということを解説しているものはなく、重複無しで1~10の乱数を取得するということが出てきたので、その方面で行こうと思うのですが、

タイトル画面で乱数を取得してその順番通りに、指定したシーンを切り替えるというのは可能でしょうか?
また、どのようなスクリプトを書けば良いでしょうか。ご教授お願いいたします。

1~10のランダムの変数を取得するスクリプト

int start = 1;
int end = 10;

List<int> numbers = new List<int>(); void Start() { for (int i = start; i <= end; i++) { numbers.Add(i); } while (numbers.Count > 0) { int index = Random.Range(0, numbers.Count); int ransu = numbers[index]; Debug.Log(ransu); numbers.RemoveAt(index); } }

変数によってシーンを切り替える

if (int rainsu == 1)
{
SceneManager.LoadScene ("Ichi");
}
if (int rainsu == 2)
{
SceneManager.LoadScene ("Ni");
}

以下10まで書く。
このようなコードをタイトル画面のスタートボタンにアタッチすれば、タイトル画面から次のシーンへ行く時にランダムになると思うのですが、そこから次の問題に行く時に、タイトル画面で取得した乱数をそのまま移行させて行くことはできるのでしょうか?

また、実際に以下のコードを書いてみました。10個の乱数を取得できたのですが、Updateでtimeが1以下になったら、ransuを取得してシーンを切り替えたいのですが、現在のコンテキストにransuは存在しませんというエラーが出てしまいます。どうすればよろしいでしょうか。

int start = 1; int end = 3; List<int> numbers = new List<int>(); void Start() { while (numbers.Count > 0) { int index = Random.Range(0, numbers.Count); int ransu = numbers[index]; Debug.Log(ransu); numbers.RemoveAt(index); } } void Update(){ if (totalTime <= 1) { if (ransu == 1) { SceneManager.LoadScene("I"); } if (ransu == 2) { SceneManager.LoadScene("N"); } if (ransu == 3) { SceneManager.LoadScene("S"); } } }

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

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

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

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

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

torisan

2018/11/02 07:39

とりあえずランダムシーンは無視して、 特定の順番どおりにシーンが移り変わるコードと、 重複無しの1~10の乱数(恐らく配列?)を作成するコードを 質問文に記載してみて下さい。
sakura_hana

2018/11/05 01:27

希望する動きは「タイトル画面→ランダムなシーン1つ目→ランダムなシーン2つ目……」と順番に遷移していく、で合っていますか?
guest

回答2

0

ベストアンサー

解決して無いようなので下記ソースコードで目的の動作を行えるか試して下さい。

C#

1using UnityEngine; 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine.SceneManagement; 5 6public class RandomScene : MonoBehaviour 7{ 8 List<int> numbers = new List<int>(); 9 10 void Start() 11 { 12 DontDestroyOnLoad(this); 13 14 for (int i = 0;i < 10;i++) 15 { 16 numbers.Add(i); 17 } 18 19 numbers.RemoveAt(SceneManager.GetActiveScene().buildIndex); 20 21 StartCoroutine("LoadLoop"); 22 } 23 24 IEnumerator LoadLoop() 25 { 26 while(numbers.Count > 0) 27 { 28 yield return new WaitForSeconds(1f); 29 RandomSceneChange(); 30 } 31 } 32 33 public void RandomSceneChange() 34 { 35 int ransu = numbers[Random.Range(0, numbers.Count)]; 36 37 numbers.Remove(ransu); 38 SceneManager.LoadScene(ransu); 39 } 40}

使用する際は予め下記使用手順で遷移するシーンの用意等は済ませておいて下さい。

・使用手順

1.タイトル含めて10個のシーンファイルを作成する。

2.「Build Settings」の「Scenes In Build」に「Add Open Scenes」を押して作成したシーンを全て登録する。

3.タイトル画面にあたるシーンを開いて「Create Empty」で空の「GameObject」を作って下記スクリプトを付ける。

4.タイトル画面でゲーム再生して1秒間隔で重複無くシーン遷移していけば正常に動作しています。


その後、クイズなどで使いたい場合はStartCoroutine("LoadLoop");をコメントアウトして機能しないようにした後
解答ボタンを押した際にRandomSceneChange()を実行するように作り変えて下さい。

その作り変えもまた判らない場合は追記してくれれば回答するかもしれません。


・除外したいシーンがある様なので追記
タイトルのシーン番号は0にして下さい。

C#

1using UnityEngine; 2using UnityEditor; 3using System.Collections; 4using System.Collections.Generic; 5using UnityEngine.SceneManagement; 6 7public class RandomScene : MonoBehaviour 8{ 9 List<int> numbers = new List<int>(); 10 11 void Start() 12 { 13 DontDestroyOnLoad(this); 14 15 for (int i = 0; i < EditorBuildSettings.scenes.Length; i++) 16 { 17 numbers.Add(i); 18 } 19 20 numbers.RemoveAt(2); 21 numbers.RemoveAt(1); 22 numbers.RemoveAt(SceneManager.GetActiveScene().buildIndex); 23 24 StartCoroutine("LoadLoop"); 25 } 26 27 IEnumerator LoadLoop() 28 { 29 while(numbers.Count > 0) 30 { 31 yield return new WaitForSeconds(1f); 32 RandomSceneChange(); 33 } 34 } 35 36 public void RandomSceneChange() 37 { 38 int ransu = numbers[Random.Range(0, numbers.Count)]; 39 40 numbers.Remove(ransu); 41 SceneManager.LoadScene(ransu); 42 } 43}

変な書き方になっていますがその辺は完璧に理解して直したくなったら自身で直して下さい。

投稿2018/11/07 09:54

編集2018/11/30 08:42
Hawn

総合スコア1222

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

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

kanatan1231

2018/11/22 13:24

ご回答ありがとうございます。スクリプトを実際に実行してみたのですが、タイトル画面の後、(3,2,1,0と)カウントするシーンや、点数発表シーンもあり、タイトルシーンからランダムシーンの関数を実行すると、結果発表のシーンまでまぜまぜでシーンが切り替わってしまいます。buildsettingsで除外するわけにもいきませんので、スクリプトをどのように書き換えたらよろしいかご教授願います。
Hawn

2018/11/26 02:20

質問時から仕様が変わって驚きますが、 その位であればシーン番号で遷移させているのでStartの中で遷移させたくないシーン番号を除外して下さい。
kanatan1231

2018/11/27 07:07

ご返信いただき、ありがとうございます。Startの中で遷移させたくないシーン番号を除外する方法なのですが、bool関数で遷移させたくないシーンをfalseにする(結局、boolで何を基準にtrue,falseにするかわかりませんでした)ということや、UnloadScene関数を使用して、遷移させたくないシーンをUnloadしてみたり(ランダムシーンで何のシーンにも遷移しなくなりました)したのですが、うまくできません。大変お聞きづらいのですが、スクリプトで提示していただけないでしょうかTT
Hawn

2018/11/27 09:02 編集

判りました。 まずは「Scenes In Build」に登録したシーン数と、除外したいシーンの番号(タイトル以外)教えて下さい。
kanatan1231

2018/11/28 08:30

ありがとうございます!!登録したシーン数は、11で、除外したいシーンの番号は、1と2です。よろしくお願いいたします。
Hawn

2018/11/28 09:11

追記しました。
kanatan1231

2018/11/30 07:57

実際にちゃんと動作しました!丁寧にスクリプトを書いていただきとても分かり易かったです!本当にありがとうございます!
guest

0

int ransu を void Start() の中で宣言しているからだと思います。
void Start() の中で宣言した変数は、(宣言方法にもよりますが)
void Start() の中でしか使用する事は出来ません。

簡単な対策としては int start のように外に出してしまうのが手っ取り早くはあります。
int ransu = 0; 等を頭に付けて、
int ransu = numbers[index]; の宣言部分を外して ransu = numbers[index]; にすれば
該当のエラーは消えると思います。

……そもそも使用する変数は ransu ではないように見えますが。。
それぞれの変数の値を確認してみましょう。

投稿2018/11/05 01:51

torisan

総合スコア678

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

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

kanatan1231

2018/11/22 13:21

ご回答ありがとうございます。色々試してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問