前提・実現したいこと
Unity(C#)で、牛がゴールを目指すランゲームを制作していて、
”ゴールが、牛との衝突時→フェードアウト開始→フェードイン開始→次のステージ開始”
という事を実現したいのですが、フードアウト開始のところでつまづいています。
それでは改めて詳しく説明させていただきます。
▽FadeOnCollisionのソースコード(抜粋)
void OnCollisionEnter2D(Collision2D collision) { if(collision.gameObject.name == targetObjectName) { FadeCanvas fadePanel = fadePanelObj.GetComponent<FadeCanvas>(); fadePanel.FadeFlag(); } }
ゴールにはFadeOnCollisionというスクリプトをアタッチしています。
FadeOnCollisionでは、OnCollisionEnter2Dを使い、targeObject(うし)と衝突した時、別のスクリプトであるFadeCanvas内のFadeFlag()を実行しています。
FadeCanvasはFadePanelにアタッチされており、FadePanelとはフェードイン演出を行うための透明化させるオブジェクトです。
FadeOnCollisionのInspector部分では、FadeObjectNameにうし、FadePanelObjにFadePanelを入れ、FadePanelが開かれるようになっています。
▽FadeCanvasのソースコード(一部)
public void FadeFlag() { Debug.Log(fadeOut); fadeOut = true; Debug.Log(fadeOut); } void Update () { Debug.Log(fadeOut); if (fadeOut) { Debug.Log("234"); FadeOut(); } if(fadeIn) { Debug.Log("1"); FadeIn(); } }
FadeCanvas内のFadeFlag()が実行されfadeOut=trueになり、UpdateによりFadeOutが実行されて画面がフェードアウトすることを期待しています。
発生している問題・エラーメッセージ
・FadeFlag() 内でDebug.Log(fadeOut)した時はfadeOut=trueになっているが、Update内のFadeOut()が実行されないこと。
・Unityの▷(Play)を押すごとに、FadeFlagの中だけ数値が上書きされていくこと。
→おそらくFadeFlagの中だけがおかしい気がしています。(理由は試したこと②参照)
→試した結果からメンバ変数として初期化したfadeOutとFadeFlagの中のfadeOutは別物のように見えます。
該当のソースコード
using System.Collections; using System.Collections.Generic; using UnityEngine; //衝突時FadePanelを見えるようにするスクリプト public class FadeShowOnCollision : MonoBehaviour { public string targetObjectName; public GameObject fadePanelObj; void OnCollisionEnter2D(Collision2D collision) { if(collision.gameObject.name == targetObjectName) { FadeCanvas fadePanel = fadePanelObj.GetComponent<FadeCanvas>(); fadePanel.FadeFlag(); } } }
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;//UIを使用可能にする //フェードインとフェードアウトに関するスクリプト public class FadeCanvas : MonoBehaviour { private bool fadeIn = false; private bool fadeOut = false; float fadeSpeed = 0.01f; float red, green, blue, alpha; Image fadeImage; void Start() { fadeImage = GetComponent<Image> (); red = fadeImage.color.r; green = fadeImage.color.g; blue = fadeImage.color.b; alpha = fadeImage.color.a; Debug.Log(fadeOut); } public void FadeFlag() { Debug.Log(fadeOut); //<1> fadeOut = true; Debug.Log(fadeOut); //<2> } void Update () { Debug.Log(fadeOut); if (fadeOut) { Debug.Log("234"); FadeOut(); } if(fadeIn) { Debug.Log("1"); FadeIn(); } } void FadeOut() { fadeImage.enabled = true; alpha += fadeSpeed; SetAlpha(); if(alpha >= 1) { fadeOut = false; fadeIn = true; } } void FadeIn() { alpha -= fadeSpeed; SetAlpha(); if(alpha <= 0) { fadeIn = false; fadeImage.enabled = false; } } void SetAlpha() { fadeImage.color = new Color(red, green, blue, alpha); } }
試したこと
①最初にfadeOut,fadeInは共にfalseにしていて,Startのところではfalseになっていること。
②FadeFlagというメソッドが呼ばれる時、Debug.Logを仕込んだところ、数値が上書きされていくこと。
コンソール結果を(<1>/<2>)という形で記載しています。※<1><2>についてはソースコード参照
1回目 : false / true
2回目以降 : true / true
他の変数(今回はred)を使っても試してみたが、FadeFlagの中だけが上記と同じように上書きされる。
1回目 : 0 / 100
2回目 : 100 / 100
さらに、3回目以降には数値を"red = 100"から"red = 50"に変えて実行してみると
3回目 : 100 / 50
4回目 : 50 / 50
▽試すために使用したコード
public void FadeFlag() { Debug.Log(red); //<1> red = 100; //3回目以降は、red = 50;に変更してみました Debug.Log(red); //<2> }
③fadeInで試した場合は特に問題がなく、なぜかfadeOutのみおかしくなる
補足情報
各種ツールのバージョンを記載させていただきます。
Unity : Version 2019.4.17f1
Visual Studio Code : Version 1.52.1
あなたの回答
tips
プレビュー