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

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

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

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

Unity

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

Q&A

2回答

2602閲覧

[Unity5.6]スプライトをOnTriggerでフェードイン・フェードアウトしたい

YA_MA

総合スコア8

C#

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

Unity

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

0グッド

0クリップ

投稿2017/06/28 01:02

###前提・実現したいこと
Unity・C#初心者です。

あるスプライトにプレイヤーが接触したらそのスプライトの透明度が変わるコードを書いています。
下記のようなコードで、OnTriggerEnter2Dでフェードアウト・OnTriggerExit2Dでフェードインさせることができました。
しかし、フェードアウト中にOnTriggerExit2Dを呼び出すと思うように動作しませんでした。

nowOpacityという変数を作ってフェード中(Whileの繰り返し処理中)に値を代入、もしフェードアウト中にOnTriggerExit2D(フェードイン)が呼び出されても、0からではなくnowOpacityに代入された値からフェードインを開始する(逆の場合も)ということがしたいのですが、どのように書けばよいのでしょうか。

Unityのバージョンは5.6.1f1
言語はC#
MonoDevelopでスクリプトを書いています。

###該当のソースコード
フェードイン・フェードアウトさせたいスプライトにアタッチしたコードです。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class SpriteManager : MonoBehaviour { 6 7 public GameObject sprite; 8 public float fadeSpeed = 0.5f; // 分かりやすいようにフェード速度を遅くして確認しました 9 private float nowOpacity; 10 11 IEnumerator FadeOutSprite() { 12 Color spriteColor = sprite.GetComponent<SpriteRenderer>().color; 13 // フェードアウト 14 while(spriteColor.a >= 0) { 15 spriteColor.a -= Time.deltaTime * fadeSpeed; 16 sprite.GetComponent<SpriteRenderer>().color = 17 new Color(spriteColor.r, spriteColor.g, spriteColor.b, spriteColor.a); 18 nowOpacity = spriteColor.a; 19 yield return null; 20 } 21 } 22 23 IEnumerator FadeInSprite() { 24 Color spriteColor = sprite.GetComponent<SpriteRenderer>().color; 25 26 // フェードイン 27 while(spriteColor.a <= 1) { 28 spriteColor.a += Time.deltaTime * fadeSpeed; 29 sprite.GetComponent<SpriteRenderer>().color = 30 new Color(spriteColor.r, spriteColor.g, spriteColor.b, spriteColor.a); 31 nowOpacity = spriteColor.a; 32 yield return null; 33 } 34 } 35 36 void OnTriggerEnter2D () { 37 Color spriteColor = sprite.GetComponent<SpriteRenderer>().color; 38 spriteColor.a = nowOpacity; 39 StartCoroutine(FadeOutSprite()); 40 } 41 42 void OnTriggerExit2D () { 43 Color spriteColor = sprite.GetComponent<SpriteRenderer>().color; 44 spriteColor.a = nowOpacity; 45 StartCoroutine (FadeInSprite ()); 46 } 47}

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

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

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

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

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

guest

回答2

0

恐らくフェードイン処理とフェードアウト処理が同時に発生しているので表示がおかしくなっているものと推測されます。
「StartCoroutine」を使うとコルーチンを止められます。

nowOpacityに代入して〜とありますが、
sprite.GetComponent<SpriteRenderer>().color = new Color(〜);
の時点で新しい透過度が割り当てられている為、(このコードだけで見るなら)nowOpacityに代入する必要もありません。

なお、StopCoroutineはstring型で引数を渡さないと止める時少々面倒なのでStart側も変えています。
参考:コルーチンの止め方と処理間隔について - Qiita

ちなみに負荷のことを考えると、
SpriteRenderer、FadeOutSprite、FadeInSpriteをそれぞれクラス変数として持っておく方がスマートかと思います。
(いちいちGetComponentするのは負荷が高いです)

以上を踏まえた全文は以下の通り。(実働チェックはしていないので適宜修正お願いします)

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class SpriteManager : MonoBehaviour { 6 7 public GameObject sprite; 8 public float fadeSpeed = 0.5f; // 分かりやすいようにフェード速度を遅くして確認しました 9 10 private SpriteRenderer rend; 11 private IEnumerator fadeIn; 12 private IEnumerator fadeOut; 13 14 void Start() { 15 rend = sprite.GetComponent<SpriteRenderer>(); 16 fadeIn = FadeInSprite(); 17 fadeOut = FadeOutSprite(); 18 } 19 20 IEnumerator FadeOutSprite() { 21 Color spriteColor = rend.color; 22 // フェードアウト 23 while(spriteColor.a >= 0) { 24 spriteColor.a -= Time.deltaTime * fadeSpeed; 25 rend.color = new Color(spriteColor.r, spriteColor.g, spriteColor.b, spriteColor.a); 26 yield return null; 27 } 28 } 29 30 IEnumerator FadeInSprite() { 31 Color spriteColor = rend.color; 32 33 // フェードイン 34 while(spriteColor.a <= 1) { 35 spriteColor.a += Time.deltaTime * fadeSpeed; 36 rend.color = new Color(spriteColor.r, spriteColor.g, spriteColor.b, spriteColor.a); 37 yield return null; 38 } 39 } 40 41 void OnTriggerEnter2D () { 42 StopCoroutine(fadeIn); //先にもう片方を止める 43 StartCoroutine(fadeOut); //引数変更 44 } 45 46 void OnTriggerExit2D () { 47 StopCoroutine(fadeOut); //先にもう片方を止める 48 StartCoroutine (fadeIn); //引数変更 49 } 50}

投稿2017/06/28 05:18

sakura_hana

総合スコア11427

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

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

0

Color spriteColor = sprite.GetComponent<SpriteRenderer>().color; spriteColor.a = nowOpacity; sprite.GetComponent<SpriteRenderer>().color = spriteColor; // add StartCoroutine(~~);

これでどうでしょうか

投稿2017/06/28 04:28

kuuki_yomenaio

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問