質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

onclick

onclickとはユーザーのクリック処理を指します。これは"onmousedown"(押下)と"onmouseup"(押上)の二つの事象の組み合わせです

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2696閲覧

Unity シーン移動前に実行したコルーチンが実行されない

groggy_egg

総合スコア24

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

onclick

onclickとはユーザーのクリック処理を指します。これは"onmousedown"(押下)と"onmouseup"(押上)の二つの事象の組み合わせです

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/09/03 07:06

Unity 2019.4.9f1(64bit)を使用

ButtonのOnClick()実行時にフェードインアウトのコルーチンを実行し
実行終了後にシーン移動するつもりのプログラムなのですが
シーン移行はできるのにフェードインアウトが実行されません。
(インスペクタ上でFadeCanvasのスライダーをいじるとちゃんと表示されます)

フェードインアウトのコードはこちらのFaceCamera2を使用しています。

Fade.cs

C#

1public class Fade : MonoBehaviour 2{ 3 IFade fade; 4 5 void Start () 6 { 7 Init (); 8 fade.Range = cutoutRange; 9 } 10 11 float cutoutRange; 12 13 void Init () 14 { 15 fade = GetComponent<IFade> (); 16 } 17 18 void OnValidate () 19 { 20 Init (); 21 fade.Range = cutoutRange; 22 } 23 24 IEnumerator FadeoutCoroutine (float time, System.Action action) 25 { 26 float endTime = Time.timeSinceLevelLoad + time * (cutoutRange); 27 28 var endFrame = new WaitForEndOfFrame (); 29 30 while (Time.timeSinceLevelLoad <= endTime) { 31 cutoutRange = (endTime - Time.timeSinceLevelLoad) / time; 32 fade.Range = cutoutRange; 33 yield return endFrame; 34 } 35 cutoutRange = 0; 36 fade.Range = cutoutRange; 37 38 if (action != null) { 39 action (); 40 } 41 } 42 43 IEnumerator FadeinCoroutine (float time, System.Action action) 44 { 45 float endTime = Time.timeSinceLevelLoad + time * (1 - cutoutRange); 46 47 var endFrame = new WaitForEndOfFrame (); 48 49 while (Time.timeSinceLevelLoad <= endTime) { 50 cutoutRange = 1 - ((endTime - Time.timeSinceLevelLoad) / time); 51 fade.Range = cutoutRange; 52 yield return endFrame; 53 } 54 cutoutRange = 1; 55 fade.Range = cutoutRange; 56 57 if (action != null) { 58 action (); 59 } 60 } 61 62 public Coroutine FadeOut (float time, System.Action action) 63 { 64 StopAllCoroutines (); 65 return StartCoroutine (FadeoutCoroutine (time, action)); 66 } 67 68 public Coroutine FadeOut (float time) 69 { 70 return FadeOut (time, null); 71 } 72 73 public Coroutine FadeIn (float time, System.Action action) 74 { 75 StopAllCoroutines (); 76 return StartCoroutine (FadeinCoroutine (time, action)); 77 } 78 79 public Coroutine FadeIn (float time) 80 { 81 return FadeIn (time, null); 82 } 83}

フェードイン実行用スクリプトFadeCtrl.csとボタンアクション用スクリプトUIAction.csを
同じGameObjectにアタッチして実行しています。
FadeCtrl.cs

C#

1 [SerializeField] Fade fade; 2 public void doFade(float t) 3 { 4 //fade.FadeIn(t, () => { fade.FadeOut(t); }); 5 fade.FadeIn(t, () => Debug.Log("EndFadeIn")); 6 fade.FadeOut(t, () => Debug.Log("EndFadeOut")); 7 }

UIAction.cs

C#

1 static FadeCtrl fade; 2 //シーンを移動 3 public static void gotoScene(Scenes s) 4 { 5 fade.doFade(1f); 6 SceneManager.LoadScene(SceneName[(int)s]); 7 } 8 public void OnClickTitleStart() 9 { 10 gotoScene(Scenes.Setting); 11 } 12 void Start() 13 { 14 fade = GetComponent<FadeCtrl>(); 15 }

ボタンを押すとシーン移動はするのですがフェードインもDebug.Logも出力されません。
FadeCanvasを最前面に移動したのですが変わりませんでした。

なぜ実行されないのか、どう直せばいいかもわかりません。

わかる方アドバイスをお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Y0241-N

2020/09/04 00:24

FadeCtrl.csのフェード処理開始部分がコメントアウされていますが、これは意図したものですか?
groggy_egg

2020/09/04 01:10

デバッグ用にログを出力したかったので //フェードイン→フェードアウト フェードイン→ログ出力 フェードアウト→ログ出力 にしています
Y0241-N

2020/09/04 02:47

見た限りでは呼び出し出来そうですけどね... フェードの処理のみを抜き出して単純なInput.GetKeyDown()などで作動するかテストし、 しないようであればfadeのどこかで処理が止まっているかを確認するか、そういう感じで後詰めで 見ていく感じですかね... あとは可能性としてはスクリプトの呼び出し順の問題で上手くいっていないかもしれないです。
guest

回答1

0

ベストアンサー

質問内容を読む限りでは**FadeCanvasDontDestroyOnLoadにしないでシーン遷移している**為にフェードの処理がシーン遷移で破棄されています。

FadeCanvasをシーン遷移で破棄されないようにする。
SceneManager.LoadScene(SceneName[(int)s])をコルーチンを使ってフェードインアウトが終わるまで待たせる。

上記どちらかをおこなって下さい。

下の方法を簡単に書けば

UIAction.cs

1 static FadeCtrl fade; 2 //シーンを移動 3 public static IEnumerator gotoScene(Scenes s) 4 { 5 fade.doFade(1f); 6 yield return new WaitForSeconds( 2f ); 7 SceneManager.LoadScene(SceneName[(int)s]); 8 } 9 public void OnClickTitleStart() 10 { 11 StartCoroutine( gotoScene() ); 12 } 13 void Start() 14 { 15 fade = GetComponent<FadeCtrl>(); 16 }

の様にシーン遷移前に2秒間待たせて下さい。
これで取り合えずフェードインアウトは動くようになるかと思います。
出来るならyield return new WaitForSeconds( 2f );を使わず「コルーチンを待ち合わせ」の作りにすると良いです。

現在のデバッグログは最後のコルーチン以外キャンセルされるのでEndFadeOutしか表示されません。
//fade.FadeIn(t, () => { fade.FadeOut(t); });こっちの方をコメントアウト外して使って下さい。

補足

このコードだとフェードアウトが終わってから遷移するので変な気もしていますが

フェードインアウトのコルーチンを実行し実行終了後にシーン移動する

という想定の様なのでそうしています。
思っていたのと違う場合は自身で調整して下さい。

投稿2020/09/04 05:59

編集2020/09/05 06:26
Hawn

総合スコア1222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

groggy_egg

2020/09/05 00:31

教えていただいた通り修正したところ思っていた動作が出来ました。 ご指摘の通り、切り替え前にフェードアウトすると変ですね。 こちらも修正しておきます。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問