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

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

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

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

Unity

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

Q&A

1回答

488閲覧

Unity PanelのImageのグラデーション

Oda_chin

総合スコア12

C#

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

Unity

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

0グッド

1クリップ

投稿2019/05/06 19:19

前提・実現したいこと

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値を変更しても画面には反映されないということでしょうか。
ご教授の程よろしくお願いいたします。

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

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

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

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

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

Bongo

2019/05/06 21:37

ご提示のコードをちょっと試してみましたが、ちゃんとcolorが反映されていい感じにクロスフェードしていました。 bgFrontObjectのcolorをいじっているのはこのスクリプトだけでしょうか。別のコンポーネント...たとえばAnimatorあたりがcolorを操作している可能性はないでしょうか?
Oda_chin

2019/05/08 08:38

コメントありがとうございます。 Animatorの方はいじっていないですね。他のスクリプトがcolorを操作しているところを探すのはなんとも難しいです。しかし、Bongoさんの方で正しく動いたというので、他の影響部分を探す方針でいきたいと思います。ありがとうございました。
Bongo

2019/05/08 21:48

プレイ中にInspectorを見たときにちゃんとColorのアルファを示す白黒バーが0.4から1.0に伸びていっているようでしたら、どうやら他のコンポーネントが妨害している可能性はなさそうですね。 問題特定の一案としては、まっさらなシーンを新しく作って、フェード関連のスクリプトだけを使ってちゃんとクロスフェードするか試してみるのもいいかと思います。 もしそれで失敗するならフェード機構のどこかにミスがあるだろうと推測できますし、うまくいったならそのシーンに少しずつオブジェクトやコンポーネントを付け足して元のシーンに近づけていき、どこかの時点でクロスフェードが起こらなくなればそのあたりが怪しいだろうと絞り込めるんじゃないでしょうか。
guest

回答1

0

unityのバグです。
既に修正されているので、アップデートしたら直りますよ。

投稿2019/12/05 17:09

mi-yan

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問