前提・実現したいこと
現在unityでトランジションを行ってからシーンをロードして次のシーンに行くスクリプトを作成しているのですが、発生している問題・エラーメッセージ欄のエラーが発生し、和訳したところ、「コルーチンを使うならオブジェクトを有効化してください」的な文面が表示されました。
発生している問題・エラーメッセージ
下記のエラーが発生しています。
Coroutine couldn't be started because the the game object 'FadeCanvas' is inactive! UnityEngine.MonoBehaviour:StartCoroutine (System.Collections.IEnumerator) FadeManager:LoadScene (string,single) (at Assets/Transition/Fade/Scripts/FadeManager.cs:66) FadeTester:Update () (at Assets/Transition/Fade/Scripts/FadeTester.cs:18)
該当のソースコード
コード①:ロード処理を行うコード
c#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using UnityEngine.SceneManagement; 6 7public class FadeManager : MonoBehaviour 8{ 9 [SerializeField]Fade fade;//コード②を呼び出すためのもの 10 11 private static GameObject loadingUI;//背景UI 12 private static GameObject loadText;//ロード中の文字 13 14 private bool oneTime = false; 15 16 private static FadeManager instance; 17 public static FadeManager Instance 18 { 19 get 20 { 21 if (instance == null) 22 { 23 Init(); 24 } 25 return instance; 26 } 27 } 28 29 IEnumerator fadeCor = null; 30 AsyncOperation async; 31 32 private FadeManager() { } 33 34 private static void Init() 35 { 36 loadingUI = (GameObject)Resources.Load("FadeCanvas");//背景を設置 37 Instantiate(loadingUI, new Vector3(0f, 0f, 0f), Quaternion.identity); 38 loadingUI.gameObject.SetActive(true); 39 40 loadText = GameObject.Find("LoadText");//テキストを探知 41 loadText.gameObject.SetActive(true); 42 43 DontDestroyOnLoad(loadingUI.gameObject);//ロードしても消さない 44 45 loadingUI.AddComponent<FadeManager>();//範囲にこのスクリプトをアタッチ 46 instance = loadingUI.GetComponent<FadeManager>(); 47 } 48 49 public void LoadScene(string sceneName, float interval = 0.5f) //シーン名と切り替え所要時間 50 { 51 if (fadeCor != null)//重複ロード対策 52 { 53 StopCoroutine(fadeCor); 54 } 55 fadeCor = null; 56 57 fadeCor = Fade(sceneName, interval); 58 StartCoroutine(fadeCor); 59 } 60 61 private IEnumerator Fade(string sceneName, float interval) 62 { 63 Text text = loadText.GetComponent<Text>(); 64 65 float time = 0f;//時間をセット 66 loadingUI.gameObject.SetActive(true);//範囲を有効化 67 68 while (time <= interval)//時間が切り替え所要時間を超えるまで 69 { 70 if (oneTime == false) 71 { 72 fade.FadeIn(interval);//コード②によるトランジションの呼び出し 73 oneTime = true; 74 } 75 76 //float fadeAlpha = Mathf.Lerp(0f, 1f, time / interval);//透明度を減らす(100→0) 77 ////loadingUI.color = new Color(0f, 0f, 0f, fadeAlpha);//色は黒(黄色にしたい) 78 time += Time.deltaTime;//時間加算 79 yield return null;//nullを返す 80 } 81 async = SceneManager.LoadSceneAsync(sceneName);//非同期ロード 82 async.allowSceneActivation = false; 83 loadText.gameObject.SetActive(true); 84 while (async.progress < 0.9f)//読み込み進捗が90%を超えるまで 85 {//0.3秒毎に文字の点の数を切り替える 86 time += Time.deltaTime; 87 if (time < 0.3f) { text.text = "よみこみちゅう"; } 88 else if (time < 0.6f) { text.text = "よみこみちゅう."; } 89 else if (time < 0.9f) { text.text = "よみこみちゅう.."; } 90 else if (time < 1.2f) { text.text = "よみこみちゅう..."; } 91 else { time = 0f; } 92 yield return null; 93 } 94 yield return new WaitForSeconds(0.5f);//0.5秒待機 95 loadText.gameObject.SetActive(false); 96 async.allowSceneActivation = true; 97 98 oneTime = false; 99 time = 0f;//時間リセット 100 while (time <= interval)//時間が切り替え所要時間を超えるまで 101 { 102 if (oneTime == false) 103 { 104 fade.FadeOut(interval); 105 oneTime = true; 106 } 107 108 //float fadeAlpha = Mathf.Lerp(1f, 0f, time / interval);//透明度を増やす(0→100) 109 //loadingUI.color= new Color(0f, 0f, 0f, fadeAlpha); 110 time += Time.deltaTime;//時間加算 111 yield return null;//nullを返す 112 } 113 Destroy(loadingUI); 114 } 115} 116
コード②:フェードインを行うスクリプト
c#
1using UnityEngine; 2using System.Collections; 3using UnityEngine.Assertions; 4 5public class Fade : MonoBehaviour 6{ 7 IFade fade; 8 9 void Start () 10 { 11 Init (); 12 fade.Range = cutoutRange; 13 } 14 15 float cutoutRange; 16 17 void Init () 18 { 19 fade = GetComponent<IFade> (); 20 } 21 22 void OnValidate () 23 { 24 Init (); 25 fade.Range = cutoutRange; 26 } 27 28 IEnumerator FadeoutCoroutine (float time, System.Action action) 29 { 30 float endTime = Time.timeSinceLevelLoad + time * (cutoutRange); 31 32 var endFrame = new WaitForEndOfFrame (); 33 34 while (Time.timeSinceLevelLoad <= endTime) { 35 cutoutRange = (endTime - Time.timeSinceLevelLoad) / time; 36 fade.Range = cutoutRange; 37 yield return endFrame; 38 } 39 cutoutRange = 0; 40 fade.Range = cutoutRange; 41 42 if (action != null) { 43 action (); 44 } 45 } 46 47 IEnumerator FadeinCoroutine (float time, System.Action action) 48 { 49 float endTime = Time.timeSinceLevelLoad + time * (1 - cutoutRange); 50 51 var endFrame = new WaitForEndOfFrame (); 52 53 while (Time.timeSinceLevelLoad <= endTime) { 54 cutoutRange = 1 - ((endTime - Time.timeSinceLevelLoad) / time); 55 fade.Range = cutoutRange; 56 yield return endFrame; 57 } 58 cutoutRange = 1; 59 fade.Range = cutoutRange; 60 61 if (action != null) { 62 action (); 63 } 64 } 65 66 public Coroutine FadeOut (float time, System.Action action) 67 { 68 StopAllCoroutines (); 69 return StartCoroutine (FadeoutCoroutine (time, action)); 70 } 71 72 public Coroutine FadeOut (float time) 73 { 74 return FadeOut (time, null); 75 } 76 77 public Coroutine FadeIn (float time, System.Action action) 78 { 79 StopAllCoroutines (); 80 return StartCoroutine (FadeinCoroutine (time, action)); 81 } 82 83 public Coroutine FadeIn (float time) 84 { 85 return FadeIn (time, null); 86 } 87}
試したこと
オブジェクトの無効化がされているであろう場所に'gameObject.SetActive(true);'を配置するも、解決せず
補足情報(FW/ツールのバージョンなど)
開発環境:unity ver.2020.3.10f1
コンパイラ:VisualStudio2019
回答1件
あなたの回答
tips
プレビュー