概要
タイトルの通り、Additiveで表示しているシーンの再読み込みをさせたかった。
素直に実装するとDontDestroyもしくは元シーンのスクリプトに再読み込み処理を書くことになり、記述が散ってしまう。どうにかシンプルに実装できないか。
実装
以下のコードのReloadSceneTask()
が本内容。
UniTaskで実行した処理はそのスクリプトを管理するシーンが破棄されても生き続けます。
そのため、シーン内のスクリプトからそのシーンの破棄されるまでの監視と再生成までが行えます。
確か別の実装方法だと同一のシーンが瞬間的に2つ存在することによりシーン内のEventSystemがバグるような問題が起きていたそうですが、こちらではシーン破棄の完了をきちんと待つためそのような問題は起きません。
using UnityEngine;
using UniRx.Async;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class AdditiveSceneManager : MonoBehaviour
{
[SerializeField]
private Button reloadSceneButton;
private void Start()
{
reloadSceneButton.onClick.AddListener(OnReloadSceneButtonClicked);
}
private void OnDestroy()
{
reloadSceneButton.onClick.RemoveListener(OnReloadSceneButtonClicked);
}
private void OnReloadSceneButtonClicked()
{
ReloadSceneTask().Forget();
}
private async UniTask ReloadSceneTask()
{
var currentAdditiveSceneName = this.gameObject.scene.name;
await SceneManager.UnloadSceneAsync(currentAdditiveSceneName);
SceneManager.LoadSceneAsync(currentAdditiveSceneName, LoadSceneMode.Additive); // シーン破棄後も処理が生き続ける
}
}