Unityで、ButtonのOnClick()が発生したタイミングで
フェードインフェードアウトをさせる関数を呼び
その関数の実行完了後にシーン移動するという処理を実現したいです。
フェードインの処理はこちらのFadeCamera2を使っています。
該当箇所のソースコード
UIAction.cs
C#
1 void Start() 2 { 3 fade = GetComponent<FadeCtrl>(); 4 } 5 public static void gotoScene(Scenes s) 6 { 7 fade.doFade(0.5f); 8 SceneManager.LoadScene(SceneName[(int)s]); 9 } 10 11 public void OnClickTitleStart() 12 { 13 gotoScene(Scenes.Setting); 14 }
FadeCtrl.cs
C#
1 public void doFade(float t) 2 { 3 fade.FadeIn(t, () => { fade.FadeOut(t); }); 4 }
上記二つのスクリプトを同じGameObjectにアタッチして使用しています。
実行するとフェードインアウトが実行されずにシーン移動が起こりエラーが発生します。
NullReferenceException: Object reference not set to an instance of an object UIAction.gotoScene (UIAction+Scenes s) (at Assets/Scripts/UIAction.cs:25) UIAction.OnClickOptionOK () (at Assets/Scripts/UIAction.cs:66) UnityEngine.Events.InvokableCall.Invoke () (at <ee47be73f7ef409ca5e5ce4b121745b7>:0) UnityEngine.Events.UnityEvent.Invoke () (at <ee47be73f7ef409ca5e5ce4b121745b7>:0) UnityEngine.UI.Button.Press () (at C:/Program Files/Unity/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/UI/Core/Button.cs:68) UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at C:/Program Files/Unity/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/UI/Core/Button.cs:110) UnityEngine.EventSystems.ExecuteEvents.Execute (UnityEngine.EventSystems.IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at C:/Program Files/Unity/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/EventSystem/ExecuteEvents.cs:50) UnityEngine.EventSystems.ExecuteEvents.Execute[T] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.ExecuteEvents+EventFunction`1[T1] functor) (at C:/Program Files/Unity/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/EventSystem/ExecuteEvents.cs:261) UnityEngine.EventSystems.EventSystem:Update() (at C:/Program Files/Unity/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/EventSystem/EventSystem.cs:377)
コルーチンとラムダ式に関する知識が乏しく自己解決が難しいと思い質問に至りました。
update()内で実行すればいいのかとも思ったのですが
OnClick()からupdate()に飛ばす方法も思いつきませんでした。
なぜエラーになったのか、どう修正すればいいのかなどアドバイスお願いします。
Fade.cs一部(上記サイトからダウンロードしたもの)
C#
1 IEnumerator FadeoutCoroutine (float time, System.Action action) 2 { 3 float endTime = Time.timeSinceLevelLoad + time * (cutoutRange); 4 5 var endFrame = new WaitForEndOfFrame (); 6 7 while (Time.timeSinceLevelLoad <= endTime) { 8 cutoutRange = (endTime - Time.timeSinceLevelLoad) / time; 9 fade.Range = cutoutRange; 10 yield return endFrame; 11 } 12 cutoutRange = 0; 13 fade.Range = cutoutRange; 14 15 if (action != null) { 16 action (); 17 } 18 } 19 20 IEnumerator FadeinCoroutine (float time, System.Action action) 21 { 22 float endTime = Time.timeSinceLevelLoad + time * (1 - cutoutRange); 23 24 var endFrame = new WaitForEndOfFrame (); 25 26 while (Time.timeSinceLevelLoad <= endTime) { 27 cutoutRange = 1 - ((endTime - Time.timeSinceLevelLoad) / time); 28 fade.Range = cutoutRange; 29 yield return endFrame; 30 } 31 cutoutRange = 1; 32 fade.Range = cutoutRange; 33 34 if (action != null) { 35 action (); 36 } 37 } 38 39 public Coroutine FadeOut (float time, System.Action action) 40 { 41 StopAllCoroutines (); 42 return StartCoroutine (FadeoutCoroutine (time, action)); 43 } 44 45 public Coroutine FadeOut (float time) 46 { 47 return FadeOut (time, null); 48 } 49 50 public Coroutine FadeIn (float time, System.Action action) 51 { 52 StopAllCoroutines (); 53 return StartCoroutine (FadeinCoroutine (time, action)); 54 } 55 56 public Coroutine FadeIn (float time) 57 { 58 return FadeIn (time, null); 59 }
回答1件
あなたの回答
tips
プレビュー