前提・実現したいこと
Unityで2Dゲームを作っています。
背景遷移をPanel(前)とPanel(後)の2つを用意して、Imageとcolorのαチャンネルを変更することで実装しようとしています。
具体的には、
1.Panel(後)をPanel(前)の画像に変える。Panel(後)の透明度は1.0f。
2.Panel(前)を任意の画像に変える。
3.Panel(前)のαチャンネルを0.0fから1.0fまで段階的に増加させることでグラデーションする。
という方法です。
しかし、Panel(前)のゲームオブジェクトをbgFrontObjectとしたとき、
bgFrontObject.GetComponent<Image>().colorの値は
RGBA(1.000, 0.000, 0.000, 0.400)…RGBA(1.000, 1.000, 1.000, 0.707)…RGBA(1.000, 1.000, 1.000, 0.999)
というように望ましく変わっているにもかかわらず、実際のゲーム画面では初期値(RGBA(1.000, 0.000, 0.000, 0.400))から変更されません。
該当のソースコード
float colR = 1.0f; float colG = 1.0f; float colB = 1.0f; float startA = 0.4f; float goalA = 1.0f; private IEnumerator BgShow() { string bgName = bgString[0];//背景画像の名前 float timeGradation = 1.0f;//背景の遷移グラデーション時間 float timeStart = Time.time;//グラデーション開始時間 float timePass = 0;//グラデーション経過時間 bgBackObject.GetComponent<Image>().sprite = bgFrontObject.GetComponent<Image>().sprite;//Panel(後)画像変更、うまくいっている bgFrontObject.GetComponent<Image>().sprite = dicBg[bgName];//Panel(前)画像変更、うまくいっている while (timePass <= timeGradation)//経過時間が終了時間に達していなかったら { bgFrontObject.GetComponent<Image>().color = new Color(colR, colG, colB, startA + timePass / timeGradation * (goalA - startA));//透明度グラデーション yield return null;//フレーム更新 timePass = GetTimePass(timeStart, timePass, timeGradation); Debug.Log(bgFrontObject.GetComponent<Image>().color);//上に記載した色の変更自体はうまくいっているように見えるという確認 } } public float GetTimePass(float timeStart, float timePass, float timeGroundGoal) { if (Input.GetKeyDown(KeyCode.Return) || Input.GetMouseButtonDown(0) || Input.GetKey(KeyCode.LeftControl)) { timePass = timeGroundGoal + 1;//キー入力されたらカウントを終了まで増やす } else if (timePass <= timeGroundGoal) { timePass = Time.time - timeStart;//経過時間カウント } return timePass; }
補足
右のInspectorでのPanelオブジェクトのImage(Sprite)のcolor値はうまく変わっています。
また、画像の変更も行えています。
Play中はPanelオブジェクトのImageのcolor値を変更しても画面には反映されないということでしょうか。
ご教授の程よろしくお願いいたします。