FC2ブログ
10 «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.» 12

ハルシオンシステムの気まま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.blog.fc2.com/tb.php/578-5cd213a6
この記事にトラックバックする(FC2ブログユーザー)