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

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

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

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

Unity

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

Q&A

解決済

2回答

359閲覧

Unity シーン切り替え フェードアウト

kurasivui

総合スコア15

C#

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

Unity

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

0グッド

0クリップ

投稿2019/03/09 18:00

編集2019/03/09 18:11

前提・実現したいこと

■開発環境
Unity 2017.2.0f3
OS Windows10 Home(64bit)

Unityを使いノベルゲームを作成中です。
シーン切り替え前にフェードアウト機能を使いたいのですが上手くいきません。

発生している問題・エラーメッセージ

下記コードの太字部分(FadeScript.cs 関数Fadeout())の動作が確認できません。
問題点について教示頂けないでしょうか。
(組み込みソフトウェア開発経験はあるのですが、Unityは触り始めて1週間程です…)

■求めている動作
①タイトル画面のオブジェクト"Button"を押下し、[NewStartDirector.cs]が作動
※UnityのGUI "Button"を使用。
②[NewStartDirector.cs]にて[FadeScript.cs]を埋め込んだ、オブジェクト"Image"の情報を取得
※UnityのGUI "Image"を使用。ゲーム画面全体に表示
③[FadeScript.cs]の内部関数<Fadeout()>にて、"Image"のRBGを操作することで、画面全体をフェードアウトする
④フェードアウト完了後、[NewStartDirector.cs]にて別シーン「NewStartScene」へ切り替え

■コード
<NewStartDirector.cs>
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class NewStartDirector : MonoBehaviour {

void Start(){ } void Update(){ } public void NewStart(){ GameObject obj = GameObject.Find ("Image") as GameObject;

print ("a\n"); //動作確認用出力1
FadeScript fadeout = obj.GetComponent<FadeScript>();
print ("b\n"); //動作確認用出力2
fadeout.Fadeout ();
print ("d\n"); //動作確認用出力4

SceneManager.LoadScene ("NewStartScene"); }

}

<FadeScript.cs>
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class FadeScript : MonoBehaviour {

public float speed = 0.01f; //透明化の速さ public float alfa = 0f0; //A値を操作するための変数 public float red; //RGBを操作するための変数 public float green; public float blue; void Start () { //Panelの色を取得 red = GetComponent<Image>().color.r; green = GetComponent<Image>().color.g; blue = GetComponent<Image>().color.b; } void Update(){ } **public void Fadeout() {** **GetComponent<Image> ().color = new Color (red, green, blue, alfa);** **alfa += speed;**

print ("c\n"); //動作確認用出力3
}
}

エラーメッセージなし

試したこと

各所にprint処理を埋め込んだのですが、件のFadeout()の出力 C も得られました。
関数そのものは動いているようなのですが、オブジェクト Imageのフェードアウトが行われません。

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

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

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

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

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

guest

回答2

0

ベストアンサー

問題点

一つ目の問題。Fadeout()が一回しか呼ばれていないため、あなたが思うような「フェードアウト」の動作はしません。一度だけalfaが+0.01されるだけなので若干薄暗くなるぐらいです。(そしてalfaではなくalphaです)

二つ目。一度Fadeout()が呼ばれた後にUnityに描画させずSceneを変えているため、フェードアウトされたかどうかもわかりません。フェードアウトが完了してからシーンを変えると、思う通りの動作になるでしょう。

解決法

どちらの問題も「コルーチン」というものを用いれば解決できます。あなたの成長の妨げにならないようここに答えは書かないでおきますが、いくつかの検索のキーワードは書いておきます。(どうしても無理だと言うならば書きますが)
キーワード: コルーチン, Coroutine, IEnumerator

追記

C#

1public IEnumerator Fadeout(float time) 2{ 3 var deltaAlpha = 1 / time; 4 var image = GetComponent<Image>(); 5 6 for (var alpha = 1f; alpha >= 1; alpha -= deltaAlpha * Time.deltaTime) 7 { 8 var color = image.color; 9 10 color.a = a; 11 12 image.color = color; 13 14 yield return null; 15 } 16 17 color.a = 0; 18 image.color = color; 19 20 // 任意のScene読み込み 21}

FadeScriptの中身はこれとFadeoutcallのみ、それ以外は不要です。
timeはその名前の通りフェードアウトに要する時間です。

投稿2019/03/10 01:07

編集2019/03/13 07:05
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kurasivui

2019/03/10 16:58 編集

ご回答ありがとうございます。 >どちらの問題も「コルーチン」というものを用いれば解決できます。 >(どうしても無理だと言うならば書きますが) 色々やってみたのですが意図通りの処理にならず…。 申し訳ないのですが記載頂けないでしょうか…。 以下、問題点とコードです…。 ※コメントアウト箇所は、FadeScript.csのUpdateで描画し、シーン切り替えは3秒後にするという処理にしてみたものを残した所です。 ■問題点 ・描画が一瞬で終わるためフェードアウトとなっていない  ※処理フレーム間隔を調整したが上手くいかず…。 <NewStartDirector.cs> using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; public class NewStartDirector : MonoBehaviour { void Start(){ } void Update(){ } public void NewStart(){ GameObject obj = GameObject.Find ("Image"); FadeScript fadeout = obj.GetComponent<FadeScript>(); fadeout.Fadeoutcall (); // Invoke ("NewStartLoad", 3.0f); SceneManager.LoadScene ("NewStartScene"); } // void NewStartLoad(){ // SceneManager.LoadScene ("NewStartScene"); // } } using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; <FadeScript.cs> using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class FadeScript : MonoBehaviour { public float speed = 0.01f; //透明化の速さ public float alpha; //A値を操作するための変数 public float red; //RGBを操作するための変数 public float green; public float blue; public bool alpha_flg = false; public bool alpha_end_flg = false; void Start () { //Imageの色を取得 red = GetComponent<Image>().color.r; green = GetComponent<Image>().color.g; blue = GetComponent<Image>().color.b; alpha = GetComponent<Image>().color.a; } public void Update(){ // if (alpha_flg == true) { // alpha += speed; // GetComponent<Image> ().color = new Color (red, green, blue, alpha); // } } public void Fadeoutcall(){ // alpha_flg = true; StartCoroutine ("Fadeout"); } IEnumerator Fadeout() { while (alpha < 1) { alpha += speed; GetComponent<Image> ().color = new Color (red, green, blue, alpha); } yield return null; // while (alpha < 1) { // Fadeoutcall (); // } } }
退会済みユーザー

退会済みユーザー

2019/03/13 07:06

ごめんなさい、返信が遅れました。 回答の方に追記をしておきました。
kurasivui

2019/03/14 14:24

追記確認させて頂きました。 こちらの実行環境に合わせいくつかのロジックに変更がありましたが、無事意図通りに稼働しました…! ご丁寧に教示頂きありがとうございました。
退会済みユーザー

退会済みユーザー

2019/03/14 14:27

「ロジックの変更」ですか…? Imageコンポーネントがあれば動くように書いたと思うのですが、不備があったのでしょうか。
kurasivui

2019/03/14 14:32

>for (var alpha = 1f; alpha >= 1; alpha -= deltaAlpha * Time.deltaTime) 私の都合でImageのa値の初期値を調整したりしたので、こちらの条件等いくつか変更したところです。 質問段階では提示頂いたものでちゃんと動いています。 時系列考えずのコメントで申し訳ない。
退会済みユーザー

退会済みユーザー

2019/03/14 22:35

そういうことでしたか。 ちゃんと動いていたようで安心です。
guest

0

今日似たような質問があったのでそちらもご参考ください。

Unity-タイトル画面でスタートボタンを押したらフェードアウトしながらシーン遷移したい

投稿2019/03/13 07:52

hogefugapiyo

総合スコア3302

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

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

kurasivui

2019/03/14 14:26

ご回答ありがとうございます。 色々なやり方を見ることができ、今後の参考になりそうです。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問