LoginSignup
1
0

More than 3 years have passed since last update.

[UniTask] Additiveで表示しているシーンの再読み込みをシーン内のスクリプトで完結させる

Posted at

概要

タイトルの通り、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); // シーン破棄後も処理が生き続ける
    }
}
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0