概要
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
実装
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;
}
}
}