Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9738

スクリプト1つでシーンの暗転切り替え

$
0
0

概要

UniTaskがversion2からDOTweenのawaitにも対応したと聞いたので、作ってみました。
締め切りまで時間がない!そんな時にスクリプト1つ付けるだけでひとまず暗転遷移ができます。

必要なライブラリ

  • UniTask
  • DOTween

ただし、動作させるためには次の設定が必要だそうです。

OpenUPMからDOTweenを導入する、またはScripting Define Symbolsに「UNITASK_DOTWEEN_SUPPORT」を定義する
assembly definition「UniTask.DOTweeen」への参照を追加する

引用:https://qiita.com/toRisouP/items/8f66fd952eaffeaf3107

今回は以下の3つをasmdefに登録しました。
- UniTask
- UniTask.DOTween
- DOTween.Modules
image.png

実装

using Cysharp.Threading.Tasks;
using DG.Tweening;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class SimpleSceneTransition : MonoBehaviour
{
    [SerializeField] private float fadeTime = 1;
    [SerializeField] private Color transitionColor = Color.black;
    [SerializeField] private string nextScene;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space)) StartTransition();
    }

    async void StartTransition()
    {
        var g = new GameObject();
        DontDestroyOnLoad(g);
        var canvas = g.AddComponent<Canvas>();
        canvas.renderMode = RenderMode.ScreenSpaceOverlay;
        var image = g.AddComponent<Image>();
        transitionColor.a = 0;
        image.color = transitionColor;
        await image.DOFade(1, fadeTime);
        await SceneManager.LoadSceneAsync(nextScene);
        await image.DOFade(0, fadeTime);
        Destroy(g);
    }
}

UniTaskもDOTweenもわからんのじゃ!という人のための実装

ライブラリを使わずに一応書いてみましたがめちゃくちゃ長くなりました。
やはり定番どころのライブラリは勉強して使いこなせるようになったほうがよさそうですね。

using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class SimpleSceneTransition : MonoBehaviour
{
    [SerializeField] private float fadeTime = 1;
    [SerializeField] private Color transitionColor = Color.black;
    [SerializeField] private string nextScene;

    private Image image;

    public static SimpleSceneTransition Instance { get; private set; }

    private void Start()
    {
        if (Instance == null)
        {
            Instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }

        var canvas = gameObject.AddComponent<Canvas>();
        canvas.renderMode = RenderMode.ScreenSpaceOverlay;
        image = gameObject.AddComponent<Image>();
        transitionColor.a = 0;
        image.color = transitionColor;
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
            StartCoroutine(StartTransition());
    }

    IEnumerator StartTransition()
    {
        float t = 0;
        while (true)
        {
            t = Mathf.Min(t + Time.deltaTime, fadeTime);
            transitionColor.a = t / fadeTime;
            image.color = transitionColor;
            if (t >= fadeTime) break;
            yield return null;
        }

        yield return SceneManager.LoadSceneAsync(nextScene);

        while (true)
        {
            t = Mathf.Max(t - Time.deltaTime, 0);
            transitionColor.a = t / fadeTime;
            image.color = transitionColor;
            if (t <= 0) break;
            yield return null;
        }
    }
}

Viewing all articles
Browse latest Browse all 9738

Trending Articles