FC2ブログ
    04 «1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.» 06

    ハルシオンシステムの気ままBlog

    株式会社ハルシオンシステムのメンバーが送る、UnityやらJavaやらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

     

    【ハルシオンブログ】複数シーンのまとめて生成とまとめて破棄について。こういう使い方することあるのかな・・・ 

    こんにちは。坂内っす。

    シーンって複数つかってます?

    例えばこの3つのシーンがあるとします。
    シーン名はそれぞれ左から「20190218_1」「20190218_2」「20190218_3」となっています



    こいつをまとめて使う場合、起動シーンを用意して3つのシーンを読み込むことができます。

    using System.Collections;
    using UnityEngine;
    using UnityEngine.SceneManagement;

    public class Script20190218 : MonoBehaviour
    {
    string[] SCENE_LIST = { "20190218_1", "20190218_2", "20190218_3" };

    private void Awake() {
    StartCoroutine(LoadScenes());
    }

    private IEnumerator LoadScenes() {
    for(int i = 0; i < SCENE_LIST.Length; i++) {
    yield return SceneManager.LoadSceneAsync(SCENE_LIST[i], LoadSceneMode.Additive);
    }
    }
    }


    実行するとこうなります。



    それぞれのシーンが読み込まれました。

    では全部のシーンを消す場合はどうでしょうか。

    これまた簡単で、こんなコードでできます。

        private IEnumerator ExitScenes() {
    for(int i = 0; i < SCENE_LIST.Length; i++) {
    if(SceneManager.GetSceneByName(SCENE_LIST[i]).IsValid()) {
    yield return SceneManager.UnloadSceneAsync(SCENE_LIST[i]);
    }
    }
    }


    実際に以下のコードを流してみましょう。

    using System.Collections;
    using UnityEngine;
    using UnityEngine.SceneManagement;

    public class Script20190218 : MonoBehaviour
    {
    string[] SCENE_LIST = { "20190218_1", "20190218_2", "20190218_3" };

    private void Awake() {
    StartCoroutine(LoadScenes());
    }

    private IEnumerator LoadScenes() {
    for(int i = 0; i < SCENE_LIST.Length; i++) {
    yield return SceneManager.LoadSceneAsync(SCENE_LIST[i], LoadSceneMode.Additive);
    }

    yield return new WaitForSeconds(3);
    yield return StartCoroutine(ExitScenes());
    }

    private IEnumerator ExitScenes() {
    for(int i = 0; i < SCENE_LIST.Length; i++) {
    if(SceneManager.GetSceneByName(SCENE_LIST[i]).IsValid()) {
    yield return SceneManager.UnloadSceneAsync(SCENE_LIST[i]);
    }
    }
    }
    }


    全部のシーンを読み込んで、3秒後にすべてのシーンを破棄します。



    こんな感じで、複数シーンを生成破棄することができます。

    何かに役に立てば幸い情報でした。

    あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 2   

    コメント

    これだとまとめて破棄じゃなくて、順次破棄なので、重いシーンを破棄するときに時間差が出ると思います。
    まとめて破棄だとコルーチンを同時に走らせてあとからyield returnを待つ必要があります。
    まぁシーン破棄は重いので、順次破棄したほうが良い気はしますが

    private IEnumerator ExitScenes() {
       var list = new List<Coroutine>();
    for(int i = 0; i < SCENE_LIST.Length; i++) {
    if(SceneManager.GetSceneByName(SCENE_LIST[i]).IsValid()) {
    list.Add(StartCoroutine(SceneManager.UnloadSceneAsync(SCENE_LIST[i])));
    }
    }
    foreach(var coroutine in list)
    {
    yield return coroutine;
    }
    }

    しろくろ #- | URL | 2019/02/21 10:37 [edit]

    Re: タイトルなし

    しろくろさん あざまーす!
    なるほど!この方法だと”まとめて”になるんですね!
    勉強になります!


    > これだとまとめて破棄じゃなくて、順次破棄なので、重いシーンを破棄するときに時間差が出ると思います。
    > まとめて破棄だとコルーチンを同時に走らせてあとからyield returnを待つ必要があります。
    > まぁシーン破棄は重いので、順次破棄したほうが良い気はしますが
    >
    > private IEnumerator ExitScenes() {
    >    var list = new List<Coroutine>();
    > for(int i = 0; i < SCENE_LIST.Length; i++) {
    > if(SceneManager.GetSceneByName(SCENE_LIST[i]).IsValid()) {
    > list.Add(StartCoroutine(SceneManager.UnloadSceneAsync(SCENE_LIST[i])));
    > }
    > }
    > foreach(var coroutine in list)
    > {
    > yield return coroutine;
    > }
    > }

    株式会社ハルシオンシステム #- | URL | 2019/02/21 10:46 [edit]

    コメントの投稿

    Secret

    トラックバック

    トラックバックURL
    →http://halcyonsystemblog.jp/tb.php/578-5cd213a6
    この記事にトラックバックする(FC2ブログユーザー)