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

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

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

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

Unity

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

Q&A

解決済

3回答

4134閲覧

Unityで指定時間後のフェード表現ができない

agen44

総合スコア26

C#

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

Unity

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

0グッド

2クリップ

投稿2017/01/17 08:37

Unityでフェードアウトするシーン遷移を行いたいのですが、
「28秒後にPanelの透明度を上げる→30秒後にシーン切り替え」
という動作を以下のコードで実装しようとしたところ、
エラーもなくシーンは切り替わるのですが、
フェードができませんでした。

スクリプトは黒いPanelにアタッチしていて、
GetComponent<Image>().color = new Color(red, green, blue, alfa);
alfa += speed;
の部分をUpdateに入れてInvoke("Fade", 28)を消すと、
ゲーム再生直後ちゃんとフェードが起こります。

エラーが出ないので何が問題かわかりません。
どうしたらフェードアウトできるでしょうか。

C#

1using UnityEngine; 2using System.Collections; 3using UnityEngine.SceneManagement; 4using UnityEngine.UI; 5 6public class toGame : MonoBehaviour { 7 8 float alfa; 9 float speed = 0.01f; 10 float red, green, blue; 11 12void Start() { 13 14 red = GetComponent<Image>().color.r; 15 green = GetComponent<Image>().color.g; 16 blue = GetComponent<Image>().color.b; 17 18 Invoke("Fade", 28); 19 Invoke("Load", 30); 20 21 } 22 23 24void Fade(){ 25 26 GetComponent<Image>().color = new Color(red, green, blue, alfa); 27 alfa += speed; 28} 29 30 31void Load () { 32 SceneManager.LoadScene("Game"); 33 } 34 35}

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

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

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

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

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

guest

回答3

0

ベストアンサー

Invoke("Update", 28); でも大丈夫なのでしょうか?

これはダメです。Update関数はフレーム毎に毎回呼び出される関数で、スクリプトが有効になっている限り実行されます。一度下記を参考にしてみてください。
https://docs.unity3d.com/jp/current/ScriptReference/MonoBehaviour.Update.html
https://docs.unity3d.com/ja/current/Manual/ExecutionOrder.html

また、パネル以外にもテキストなどをこのような表現で遅延表示させたいのですが、

それぞれに実行フラグ(isFade, isTextFade1, isTextFade2など)とメソッドを用意すれば想像している動作になるかと思います。

一つのスクリプトにまとめず、別々のスクリプトを作ってパネルやテキストに個々にアタッチしていけば確実でしょうか。

ある程度使い回すのであれば、専用のスクリプトを作ってしまう方が良いでしょうね。その際、フェードするまでの時間の変数をpublicで宣言しておけばインスペクタウィンドウから設定できるので、汎用性が高くなります。

public float fadeStartTime; // publicで宣言 float alfa; float speed = 0.01f; float red, green, blue; bool isFade = false; void Start() { red = GetComponent<Image>().color.r; green = GetComponent<Image>().color.g; blue = GetComponent<Image>().color.b; Invoke("Fade", fadeStartTime); } ....

投稿2017/01/17 11:29

Kapustin

総合スコア1186

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

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

agen44

2017/01/17 13:45

ありがとうございます! 家に帰って実装してみたところ問題なくできました! 大変わかりやすく教えていただいて本当に助かりました!
guest

0

この書き方では、28秒後に一度だけ Fade() を実行することになります。
つまり、 alfa += speed; が一度しか更新されないので(さらに言うと、更新される前の値を代入している)、見た目の変化が全くないことになります。
解決するには、Update関数の中に alfa += speed を書きつつ、それを実行するためのフラグを用意すると解決できます。
試してないですが、下記でうまくいくと思います。

// 追加変数 bool isFade = false; // 追加 void Update(){ if(isFade){ alfa += speed; GetComponent<Image>().color = new Color(red, green, blue, alfa); } } // 修正 void Fade(){ // GetComponent<Image>().color = new Color(red, green, blue, alfa); // alfa += speed; isFade = true; }

投稿2017/01/17 09:06

編集2017/01/17 09:25
Kapustin

総合スコア1186

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

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

agen44

2017/01/17 11:00

早々のご回答ありがとうございます! Update関数じゃないと繰り返されないのですね! プログラミング初心者でよく理解していませんでした。 いま外出していて私も試せないのですが、 Invokeで遅延させる場合は、 Invoke("Update", 28); でも大丈夫なのでしょうか? また、パネル以外にもテキストなどをこのような表現で遅延表示させたいのですが、 すべてをUpdateの中に入れてしまうと各々で時間指定ができないですよね。 その場合でも繰り返し更新を行うためにはどのようにすればよいでしょうか。 一つのスクリプトにまとめず、別々のスクリプトを作ってパネルやテキストに個々にアタッチしていけば確実でしょうか。 重ねて質問してしまい申し訳ないのですが、 お時間がありましたらまた教えていただけると助かります。 宜しくお願い致します。
guest

0

Fadeを繰り返し実行する処理が書かれていないので、1回しか実行されず、フェードしなかったのだと思います。
Updateに書いた場合は、繰り返し実行されるのでフェードできたんだと思います。

投稿2017/01/17 09:06

nico29

総合スコア76

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

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

agen44

2017/01/17 12:25

ありがとうございます! プログラミング初心者であまり理解せずコードを書いていたのですが、今回の問題についてようやく理解できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問