【Unity】버튼을 누르면 장면 천이하는 구현을 간단하게 만들 수 있는 SceneController의 소개

12984 단어 장면Unity

개요



버튼을 누르면 씬 천이 하는 구현으로 매번 사용하고 있는 SceneController 컴퍼넌트를 소개합니다.

설명



버튼의 UnityEvent 등으로 LoadScene() 등의 함수를 추가해 사용합니다.



품목
설명


ProcessOnAwake
이 컴퍼넌트가 최초로 유효하게 되었을 때에 실행하는 처리

SceneName
대상 장면 이름

Delay
실행하는 데 걸리는 시간



Public 함수
설명


LoadScene()
[Delay]초 후 [SceneName]로 전환

LoadScene(float)
[float]초 후 [SceneName]로 전환

LoadScene(string)
[Delay]초 후 [string]으로 전환

LoadAddScene()
[Delay]초 후 [SceneName] 추가

LoadAddScene(float)
[float]초 후 [SceneName] 추가

LoadAddScene(string)
[Delay]초 후 [string] 추가

UnloadScene()
[Delay]초 후 [SceneName] 파기

UnloadScene(float)
[float]초 후 [SceneName] 파기

UnloadScene(string)
[Delay]초 후 [string] 파기


코드



SceneController.cs
using System;
using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneController : MonoBehaviour
{
    enum ProcessOnAwake
    {
        None,
        LoadScene,
        AddScene,
        UnloadScene
    }

    [SerializeField] ProcessOnAwake processOnAwake;
    [SerializeField] string sceneName;
    [SerializeField] float delay;

    private void Start()
    {
        switch (processOnAwake)
        {
            case ProcessOnAwake.LoadScene: LoadScene(); break;
            case ProcessOnAwake.AddScene: LoadAddScene(); break;
            case ProcessOnAwake.UnloadScene: UnloadScene(); break;
        }
    }

    /// <summary>
    /// シーン移動
    /// </summary>
    /// <param name="sceneName">シーン名</param>
    /// <param name="delay">遅延時間</param>
    public void LoadScene(string sceneName, float delay)
    {
        AsyncOperation operation = SceneManager.LoadSceneAsync(sceneName);
        operation.allowSceneActivation = false;
        StartCoroutine(DelayedCall(delay, () => operation.allowSceneActivation = true));
    }
    public void LoadScene(string sceneName) => LoadScene(sceneName, delay);
    public void LoadScene(float delay) => LoadScene(sceneName, delay);
    public void LoadScene() => LoadScene(sceneName, delay);

    /// <summary>
    /// シーン追加
    /// </summary>
    /// <param name="sceneName">シーン名</param>
    /// <param name="delay">遅延時間</param>
    public void LoadAddScene(string sceneName, float delay)
    {
        AsyncOperation operation = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
        operation.allowSceneActivation = false;
        StartCoroutine(DelayedCall(delay, () => operation.allowSceneActivation = true));
    }
    public void LoadAddScene(string sceneName) => LoadAddScene(sceneName, delay);
    public void LoadAddScene(float delay) => LoadAddScene(sceneName, delay);
    public void LoadAddScene() => LoadAddScene(sceneName, delay);

    /// <summary>
    /// シーン破棄
    /// </summary>
    /// <param name="sceneName">シーン名</param>
    /// <param name="delay">遅延時間</param>
    public void UnloadScene(string sceneName, float delay)
    {
        AsyncOperation operation = SceneManager.UnloadSceneAsync(sceneName);
        operation.allowSceneActivation = false;
        StartCoroutine(DelayedCall(delay, () => operation.allowSceneActivation = true));
    }
    public void UnloadScene(string sceneName) => UnloadScene(sceneName, delay);
    public void UnloadScene(float delay) => UnloadScene(sceneName, delay);
    public void UnloadScene() => UnloadScene(sceneName, delay);

    /// <summary>
    /// 遅延処理
    /// </summary>
    /// <param name="second">遅延時間</param>
    /// <param name="action">処理内容</param>
    /// <returns></returns>
    private IEnumerator DelayedCall(float second, Action action)
    {
        yield return new WaitForSeconds(second);
        action.Invoke();
    }
}

좋은 웹페이지 즐겨찾기