Unityでシーンの状態を保存したまま非同期で次のシーンへ移りたい
解決したいこと
ステージセレクトシーンから、ゲームシーンへの遷移で悩んでいます。
ステージセレクトシーンの状態を保存したまま、非同期でゲームシーンに移りたいのですが、どうやったらいいんでしょうか?
unityの機能には入ってませんが、下記のようなことです。
SceneManager.DontDestroyOnLoadAsync("GameScene");
1
ステージセレクトシーンから、ゲームシーンへの遷移で悩んでいます。
ステージセレクトシーンの状態を保存したまま、非同期でゲームシーンに移りたいのですが、どうやったらいいんでしょうか?
unityの機能には入ってませんが、下記のようなことです。
SceneManager.DontDestroyOnLoadAsync("GameScene");
こんな感じで行き来できました。
各シーンが自身で終了する方法です。
セレクター側は単に選ばれたシーンをロードするだけです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
/// <summary>シーンセレクタ</summary>
public class SceneSelector : MonoBehaviour {
/// <summary>シーンが選ばれた (ボタンなど)</summary>
public void OnPushSelect (string sceneName) => StartCoroutine (loadScene (sceneName));
/// <summary>ロード処理</summary>
private IEnumerator loadScene (string sceneName) {
yield return SceneManager.LoadSceneAsync (sceneName, LoadSceneMode.Additive);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
/// <summary>選ばれたシーン</summary>
public class SelectedScene : MonoBehaviour {
/// <summary>戻るボタンが押された</summary>
public void OnPushUnload () => StartCoroutine (unloadScene ());
/// <summary>アンロード処理</summary>
private IEnumerator unloadScene () {
yield return SceneManager.UnloadSceneAsync (gameObject.scene.name);
}
}
各シーンはセレクターに終了要求を伝え、セレクターが実際に終了させます。
セレクターに制御を集中させた方法です。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
/// <summary>シーンセレクタ</summary>
public class SceneSelector : MonoBehaviour {
#region Static
/// <summary>シーンセレクタ (シングルトン)</summary>
private static SceneSelector sceneSelector = null;
/// <summary>シーンの終了要求</summary>
public static void RequestUnloadScene (Scene scene) {
sceneSelector.UnloadScene (scene.name);
}
#endregion
/// <summary>起動時初期化</summary>
private void Awake () {
if (!sceneSelector) { // 排他制御
sceneSelector = this; // セレクタを登録
}
}
/// <summary>シーンが選ばれた</summary>
public void OnPushSelect (string sceneName) => StartCoroutine (loadScene (sceneName));
/// <summary>ロード処理</summary>
private IEnumerator loadScene (string sceneName) {
yield return SceneManager.LoadSceneAsync (sceneName, LoadSceneMode.Additive);
}
/// <summary>シーンを終了</summary>
public void UnloadScene (string sceneName) => StartCoroutine (unloadScene (sceneName));
/// <summary>アンロード処理</summary>
private IEnumerator unloadScene (string sceneName) {
yield return SceneManager.UnloadSceneAsync (sceneName);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>選ばれたシーン</summary>
public class SelectedScene : MonoBehaviour {
/// <summary>戻るボタンが押された</summary>
public void OnPushUnload () => SceneSelector.RequestUnloadScene (gameObject.scene);
}
こんな感じでどうでしょうか。
(シーン名はテストに使用しただけなので気にしないでください。)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class SceneManagerTest : MonoBehaviour {
/// <summary>シーンを順繰りにロード</summary>
private IEnumerator Start () {
yield return null;
foreach (var name in new [] { "FlickOrPropagation", "IndexOfTimes", "PointerEvents", "RectContains", "RectStatus", }) {
yield return SceneManager.LoadSceneAsync (name, LoadSceneMode.Additive);
yield return new WaitForSeconds (3);
yield return SceneManager.UnloadSceneAsync (name);
}
}
}
この方法だと、オブジェクトが残っているだけで、最初のシーンそのものは残っていません。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class SceneManagerTest : MonoBehaviour {
/// <summary>このオブジェクトが削除されないようにする</summary>
private void Awake () => DontDestroyOnLoad (gameObject);
/// <summary>シーンを順繰りにロード</summary>
private IEnumerator Start () {
foreach (var name in new [] { "FlickOrPropagation", "IndexOfTimes", "PointerEvents", "RectContains", "RectStatus", }) {
yield return new WaitForSeconds (3);
yield return SceneManager.LoadSceneAsync (name);
}
}
}
@tsg4gf
Questioner
@tsg4gf
Questioner
@tsg4gf
Questioner