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

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

ただいまの
回答率

89.99%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,431

izumiasa

score 7

タイトル画面でスタートボタンを押したらフェードアウトしながらオープニングへシーン遷移したいのですが、上手くいきません。

スタートボタンを押すと瞬時に消えて次のシーンが瞬時に現れる状態です。
フェードアウトが終わってから次のシーンが実行されるようにしたいです。
いろんなところを参考にし試してみたのですが、どれも出来ませんでした。

何かいい方法はないでしょうか。
よろしくお願いいたします。

イメージ説明

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; //パネルのイメージを操作するのに必要
using UnityEngine.SceneManagement;

public class FadeController : MonoBehaviour
{

    float fadeSpeed = 0.02f;        //透明度が変わるスピードを管理
    float red, green, blue, alfa;   //パネルの色、不透明度を管理

    public bool isFadeOut = false;  //フェードアウト処理の開始、完了を管理するフラグ
    public bool isFadeIn = false;   //フェードイン処理の開始、完了を管理するフラグ

    Image fadeImage;                //透明度を変更するパネルのイメージ

    void Start()
    {
        fadeImage = GetComponent<Image>();
        red = fadeImage.color.r;
        green = fadeImage.color.g;
        blue = fadeImage.color.b;
        alfa = fadeImage.color.a;
    }

    void Update()
    {
        if (isFadeIn)
        {
            StartFadeIn();
        }

        if (isFadeOut)
        {
            StartFadeOut();
        }
    }

    void StartFadeIn()
    {
        alfa -= fadeSpeed;                //a)不透明度を徐々に下げる
        SetAlpha();                      //b)変更した不透明度パネルに反映する
        if (alfa <= 0)
        {                    //c)完全に透明になったら処理を抜ける
            isFadeIn = false;
            fadeImage.enabled = false;    //d)パネルの表示をオフにする
        }
    }

    void StartFadeOut()
    {
        fadeImage.enabled = true;  // a)パネルの表示をオンにする
        alfa += fadeSpeed;         // b)不透明度を徐々にあげる
        SetAlpha();               // c)変更した透明度をパネルに反映する
        if (alfa >= 1)
        {             // d)完全に不透明になったら処理を抜ける
            isFadeOut = false;
        }
    }

    void SetAlpha()
    {
        fadeImage.color = new Color(red, green, blue, alfa);
    }

    // スタートボタンを押したら実行する
    public void GameStart()
    {
        SceneManager.LoadScene("Opening");
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Bongo

    2019/03/13 06:58

    いろいろ試されたご様子ですが、そのダメだったコードと、それを実行するとどのような不具合が発生するのかを質問文に追記いただけますと回答が付きやすくなるかと思います。もしかすると、それをいくらか修正することで正しく動作させられるかもしれません。

    キャンセル

  • izumiasa

    2019/03/13 08:10

    Bongo様
    アドバイスありがとうございます。
    現在のコードを追記いたしました。
    流れとしましては、
    フェードインでタイトル画面表示→New Game押下でフェードアウト後Openingシーンへ遷移
    のようにしたいのですが、フェードアウトのみ実行されない状況です。

    キャンセル

回答 2

checkベストアンサー

+1

GameStart()を呼び出すだけだとそのままシーン遷移するのですぐ切り替わるのは仕様です。
FadeOut処理を呼んで、なおかつフェードアウトが終わったことを検知してから遷移処理を始める必要があります。

あんまりきれいなやり方じゃないですが、下記ならたぶん動くと思います。
changeSceneNameという変数名にシーン名が入っていれば、フェードアウト後にそのシーンに遷移します。変数にセットされていなければフェードアウトだけして終わります。

なのでGameStartでは、isFadeOutをtrueにしてフェードアウト処理を開始するのと共に、遷移したいシーン名をセットしています。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; //パネルのイメージを操作するのに必要
using UnityEngine.SceneManagement;

public class FadeController : MonoBehaviour {

    float fadeSpeed = 0.02f;        //透明度が変わるスピードを管理
    float red, green, blue, alfa;   //パネルの色、不透明度を管理

    public bool isFadeOut = false;  //フェードアウト処理の開始、完了を管理するフラグ
    public bool isFadeIn = false;   //フェードイン処理の開始、完了を管理するフラグ
    public string changeSceneName; // フェードアウト処理後、シーン遷移する場合のシーン名

    Image fadeImage;                //透明度を変更するパネルのイメージ

    void Start() {

        fadeImage = GetComponent<Image>();
        red = fadeImage.color.r;
        green = fadeImage.color.g;
        blue = fadeImage.color.b;
        alfa = fadeImage.color.a;
    }

    void Update() {
        if (isFadeIn) {
            StartFadeIn();
        }

        if (isFadeOut) {
            StartFadeOut();
        }
    }

    void StartFadeIn() {
        alfa -= fadeSpeed;                //a)不透明度を徐々に下げる
        SetAlpha();                      //b)変更した不透明度パネルに反映する
        if (alfa <= 0) {                    //c)完全に透明になったら処理を抜ける
            isFadeIn = false;
            fadeImage.enabled = false;    //d)パネルの表示をオフにする
        }
    }

    void StartFadeOut() {
        fadeImage.enabled = true;  // a)パネルの表示をオンにする
        alfa += fadeSpeed;         // b)不透明度を徐々にあげる
        SetAlpha();               // c)変更した透明度をパネルに反映する
        if (alfa >= 1) {             // d)完全に不透明になったら処理を抜ける
            isFadeOut = false;

            if(changeSceneName != "") {
                Debug.Log(changeSceneName + "に遷移します。");
                SceneManager.LoadScene(changeSceneName);
            }
        }
    }

    void SetAlpha() {
        fadeImage.color = new Color(red, green, blue, alfa);
    }

    // スタートボタンを押したら実行する
    public void GameStart() {
        isFadeOut = true;
        changeSceneName = "Opening";
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/13 11:31 編集

    ありがとうございます。
    早速試してみましたが、タイトル画面が出ずにOpeningシーンから始まってしまいました。
    ChangeSceneNameを空欄にもしてみましたが、タイトル画面は出るものの、フェードアウトがされませんでした。
    こちらのスクリプトをNew Gameボタンにアタッチし、それをインスペクターのボタンスクリプトのクリック時()のところへ持って行き、Editor And Runtime、GameStart()を選択しています。
    スクリプトのアタッチ方法が正しくないのでしょうか。

    キャンセル

  • 2019/03/13 12:04

    スクリプトを読む感じだとフェードイン・アウト用のImageが既にヒエラルキーに配置されており
    それに対してこのスクリプトをアタッチしていますよね? なのでButton側ではそのImageにアタッチされているスクリプトからメソッドを参照して呼び出します。

    ・Image(フェード用画像…スクリプトをアタッチ、テスト用にインスペクターからIsFadeinにチェック)
    ・Button(OnClickでImageをアタッチ、GameStart()を選択)

    これでシーンをスタートして、まずフェードインが行われるかを確認します。
    次にButtonをクリックしてフェードアウトが始まるかをチェックしてみてください

    キャンセル

  • 2019/03/13 12:43

    無事フェードアウトができました。
    度々のご回答と丁寧なご対応ありがとうございました…!

    キャンセル

0

以下の記事は参考にならないでしょうか?

Unityでフェードイン/フェードアウトを実装する方法 | tama-lab

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/13 12:48

    こちらの記事では上手く解決出来なかった為、受付中に他の方から頂いたコードで無事に実装できました。
    ご丁寧にありがとうございました。

    キャンセル

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

  • ただいまの回答率 89.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • C#に関する質問
  • Unity-タイトル画面でスタートボタンを押したらフェードアウトしながらシーン遷移したい