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

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

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

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

Q&A

解決済

1回答

14956閲覧

UnityでSceneManager.UnloadSceneAsyncでシーン削除ができない

yrema

総合スコア286

Unity

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

0グッド

1クリップ

投稿2018/04/22 07:53

編集2018/04/22 08:24

タイトルの通りですが、
Start()でSceneManager.LoadSceneを使って読み込んだ読込中用シーンを
Update()の1フレーム目でSceneManager.UnloadSceneAsyncを使ってアンロードしようとしています。
が、アンロードされずヒエラルキーにはシーンが残ったままになってしまいます。使い方が間違っているでしょうか?

c#

1 public bool isFirstUpdate = false; 2 3 void Start () { 4 // NowLoaingシーン読み込み 5 SceneManager.LoadScene ("now_loading", LoadSceneMode.Additive); 6 7 // ワールドマップの初期設定 8 //initWorldMap(); 9 10 // プレイヤーの初期設定 11 //initPlayer(); 12 } 13 14 void Update () { 15 if (!isFirstUpdate) { 16 isFirstUpdate = true; 17 // NowLoaingシーン破棄 18 //SceneManager.UnloadSceneAsync("now_loading"); // これだと破棄されなかったので下でループしてみる 19 20 //現在読み込まれているシーン数だけループ 21 for (int i = 0; i < UnityEngine.SceneManagement.SceneManager.sceneCount ; i++) { 22 //読み込まれているシーンを取得し、その名前をログに表示 23 Scene scene = UnityEngine.SceneManagement.SceneManager.GetSceneAt(i); 24 string sceneName = scene.name; 25 Log.d("sceneName", sceneName); 26 if ("now_loading".Equals(sceneName)) { 27 Debug.Log ("if now_loading true"); 28 // NowLoaingシーン破棄 29 SceneManager.UnloadSceneAsync(scene); 30 Debug.Log ("after UnloadSceneAsync"); // ここまで到達していることを確認 31 } 32 } 33 } 34 }

◆環境
Unity2017 3.1f1
Windows 10

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

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

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

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

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

guest

回答1

0

ベストアンサー

now_loadingシーンのロードが完了する前に、SceneManager.UnloadSceneAsync()を呼び出しているのが原因だと思われます。
10秒待ってからSceneManager.UnloadSceneAsync()をしたところ、普通に破棄できました。


また、SceneManager.UnloadSceneAsync()はAsyncOperationを返す非同期処理なので、これの完了後に処理を行いたい場合は以下のようにする必要があります。

C#

1 void foo() 2 { 3 // コルーチンunloadSceneを実行 4 StartCoroutine(unloadScene()); 5 } 6 7 IEnumerator unloadScene() 8 { 9 yield return SceneManager.UnloadSceneAsync("now_loading"); 10 11 // UnloadSceneAsync()の後に実行したい処理 12 Debug.Log("after UnloadSceneAsync"); 13 }

投稿2018/04/22 10:02

fiveHundred

総合スコア9774

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

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

yrema

2018/04/22 13:22

確かに数秒待ってからUnloadSceneAsyncすると上手くいきました。 ただ、 > now_loadingシーンのロードが完了する前にUnloadSceneAsyncを呼び出しているのが原因 SceneManager.sceneLoaded += OnSceneLoaded;でイベントハンドラ追加してロード完了を検知した後にやってみたけど変わらないですね。
yrema

2018/04/22 14:51

私の勘違いだったようです。OnSceneLoadedでいけました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問