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

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

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

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

Q&A

解決済

1回答

249閲覧

Unityでランダムに1~10のシーンを重複無しで切り替えたい。という質問が過去にあるのですが次のシーンに遷移した後、その続きがわからない

Tora_ou

総合スコア3

Unity

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

0グッド

0クリップ

投稿2025/05/16 21:03

編集2025/05/16 21:06

実現したいこと

タイトル画面、最後の画面、この2つのシーン以外が19個有る状態(合計だと21個のシーン)で
シーンの重複無しでランダムにシーンを遷移させたい

発生している問題・分からないこと

テラテイルで5年ぐらい前に
Unity C#でランダムに1~10のシーンを重複無しで切り替えたい。という質問が有ってまさにそれが今やりたい事なので
その通りにやってみています。
5年前の質問の回答者様がソースコードを書いてくれていまして
空のGameObjectを作ってそこにアタッチして使う、との指示も書かれていたのでそのようにして
タイトル画面のスタートボタンを押せば次のシーンへ遷移(遷移先はランダム)するようにオブジェクトをスタートボタンにアタッチしました。

この通りにやってみるとたしかにスタート画面に設置したスタートボタン(押すとランダムシーン遷移が動作する)から
シーン番号0 → 次のシーン(ランダムなシーン番号)へ遷移した後も
「DontDestroyOnLoad」の中にランダムにシーン遷移するオブジェクト自体は残り続けるのですが
※こいつを「RandomObjMan」と仮称します

スタート画面までは良かったのですが、次のシーンからその「DontDestroyOnLoad」の中に残っている「RandomObjMan」をどうすれば使えるのかがよくわかりません。
次のシーンにはスタートのシーンには存在していた 空のGameObject は無い=「RandomObjMan」が居ないので一体どうすれば・・・
プログラムを走らせている間は「DontDestroyOnLoad」の中に「RandomObjMan」はたしかに存在しているのですがそれを次のシーンからどのように使えば良いのかがわかりません。

また5年前のやり方よりもこっちのほうが簡単にランダムシーン遷移できるよ、といったアイデアがあればぜひ教えていただきたいです。

該当のソースコード

using UnityEngine; using UnityEditor; using System.Collections; using System.Collections.Generic; using UnityEngine.SceneManagement; public class RandomScene : MonoBehaviour { List<int> numbers = new List<int>(); void Start() { DontDestroyOnLoad(this); for (int i = 0; i < EditorBuildSettings.scenes.Length; i++) { numbers.Add(i); } numbers.RemoveAt(11); numbers.RemoveAt(SceneManager.GetActiveScene().buildIndex); //StartCoroutine("LoadLoop"); テスト用のコルーチン } public void RandomSceneChange() { int ransu = numbers[Random.Range(0, numbers.Count)]; numbers.Remove(ransu); SceneManager.LoadScene(ransu); Debug.Log(ransu); } }

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

当てずっぽうで 空のGameObject を他のシーンにもコピーする、というのをやってみましたが重複しまくりで処理もおかしくなってもちろんダメでした。

補足

特になし

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

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

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

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

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

Tora_ou

2025/05/16 23:13

投稿してから約二時間ほどずっと調べていたのですが GameObject RandomScene = GameObject.Find("GameObject"); で次のシーンへ行ってからでもGameObjectを変数に格納できるらしい、ことがわかりました。 このFindで探してきた物の中身は GameObject (UnityEngine.GameObject) UnityEngine.Debug:Log (object) となっているので格納できているようです。 しかしそこから、どうすればランダムシーン遷移の為の関数 RandomSceneChange() が使えるかどうかは未だわからず、現在も奮闘中であります。
Tora_ou

2025/05/17 00:20

public RandomScene RandomScene; //で定義して RandomScene.RandomSceneChange(); //で関数を呼び出せる、らしい? しかし今度はインスペクターで RandomScene の部分にアタッチするべきものがわからなくて困ってます。 重複無しでランダムシーン遷移って難しいのでしょうか。
guest

回答1

0

ベストアンサー

GameObject RandomScene = GameObject.Find("GameObject");
で次のシーンへ行ってからでもGameObjectを変数に格納できるらしい、ことがわかりました。

上記のように取得できるのであれば(RandomSceneだとクラス名と衝突するので、別の名前にするとして)、取得したゲームオブジェクト.GetComponent<RandomScene>().RandomSceneChange();で呼び出せるはずです。

また、ほかの方法としては、FindObjectOfType<RandomScene>().RandomSceneChange();という方法もあります。

投稿2025/05/17 04:28

fiveHundred

総合スコア10346

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

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

Tora_ou

2025/05/17 05:50

教えていただいた FindObjectOfType<RandomScene>().RandomSceneChange(); のほうが簡単そうだったので書いてみたのですが 'Object.FindObjectOfType<T>()' は旧形式です ('Object.FindObjectOfType has been deprecated. Use Object.FindFirstObjectByType instead or if finding any instance is acceptable the faster Object.FindAnyObjectByType') という、警告文が表示されました。 エラーではなく警告文だけなので動作はするようなのですが旧型式だと何かマズい事が有るのでしょうか?
fiveHundred

2025/05/17 11:31

すみません。FindObjectOfTypeはUnity6から非推奨になったみたいです。 エラー文にある通り、FindAnyObjectByTypeかFindFirstObjectByTypeを使ってください。 非推奨になった関数は、時期を見て廃止されるそうです。
Tora_ou

2025/05/17 11:55

最初の回答でもう一つ書いてくれていた方法 「取得したゲームオブジェクト.GetComponent<RandomScene>().RandomSceneChange();で呼び出せる」 という事でしたので今回はこちらの方法で解決しました。 教えていただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問