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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Unity

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

Q&A

解決済

1回答

298閲覧

unity フェードイン・フェードアウトのおかしな挙動

tillumination

総合スコア38

Unity

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

0グッド

1クリップ

投稿2018/08/29 23:48

編集2018/08/29 23:51

プレイヤーがステージから落下したら画面を一瞬暗転(フェードアウト)させて開始位置に戻し、フェードインさせる、という処理を作りたいと思っています。そのために、以下の関数を作りました。

ただ、以下の処理ではプレイヤーを元に戻す処理とフェードインが2回行われているような挙動をします。恐らくコルーチンを使い慣れていないことが原因だと思うのですが解決できません。

C#

1private IEnumerator salvation(float fadeOutTime, float fadeInTime = 0.1f) 2 { 3 float time = 0; 4 5 while (true) 6 { 7 Color color = m_fadePlane.GetComponent<Image>().color; 8 color.a = time / fadeOutTime; 9 m_fadePlane.GetComponent<Image>().color = color; 10 time += Time.deltaTime; 11 12 if (color.a > 1f) 13 { 14 break; 15 } 16 yield return null; 17 } 18 19 20 //プレイヤーを元の位置に戻す処理が入る 21 22 23 time = 0; 24 while (true) 25 { 26 Color color = m_fadePlane.GetComponent<Image>().color; 27 color.a = 1f-time / fadeOutTime; 28 m_fadePlane.GetComponent<Image>().color = color; 29 time += Time.deltaTime; 30 31 if (color.a < 0f) 32 { 33 break; 34 } 35 yield return null; 36 } 37 38 39 } 40

そして、この関数を呼び出す場所で

C#

1StartCoroutine(salvation(fadeOutTime, fadeInTime));

と呼び出しています。

このとき、おおよそはうまく動作するのですが、プレイヤーを元に戻す処理とフェードインが2回行われているような挙動をします。恐らくコルーチンを使い慣れていないことが原因だと思うのですが解決できません。

よろしくお願いいたします。

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

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

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

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

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

sakura_hana

2018/08/30 01:37

StartCoroutineを2回実行しているとかではないですか?(コルーチンは呼んだら呼んだ回数分だけ複製されて実行されます)
tillumination

2018/08/30 08:37

まさにその通りでした。コードを編集して解決いたしました。(先日に引き続きありがとうございました)
guest

回答1

0

自己解決

まずsalvation関数を次のように変更を加えます(isSalvatedプロパティを追加しました)

C#

1 2 3bool isSalvated{get;private set;} 4private IEnumerator salvation(float fadeOutTime, float fadeInTime = 0.1f) 5 { 6 float time = 0; 7 isSalvated=true; 8 9 while (true) 10 { 11 Color color = m_fadePlane.GetComponent<Image>().color; 12 color.a = time / fadeOutTime; 13 m_fadePlane.GetComponent<Image>().color = color; 14 time += Time.deltaTime; 15 16 if (color.a > 1f) 17 { 18 break; 19 } 20 yield return null; 21 } 22 23 24 //プレイヤーを元の位置に戻す処理が入る 25 26 27 time = 0; 28 while (true) 29 { 30 Color color = m_fadePlane.GetComponent<Image>().color; 31 color.a = 1f-time / fadeOutTime; 32 m_fadePlane.GetComponent<Image>().color = color; 33 time += Time.deltaTime; 34 35 if (color.a < 0f) 36 { 37 break; 38 } 39 yield return null; 40 } 41 42 isSalvated=false 43 }

そしてStartCoroutineの呼び出し元で

C#

1if(!****.Instance.isSalvated){ 2StartCoroutine(salvation(***,***)); 3}

とすれば遷移中はsalvation関数内を通らずに済みます

投稿2018/08/30 08:42

tillumination

総合スコア38

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問