header_medi8

ビットコイン取引高日本一の仮想通貨取引所 coincheck bitcoin

2016年3月29日火曜日

Unityロゴ表示後に指定した秒数カスタムロゴを表示して画面遷移する方法

Unity5になってから、無料版でもPro版と同じ機能を使えるということで、非常に嬉しいことですが、無料版とPro版の大きな違いは、起動時にUnityロゴが表示されるかどうかにあると思います。

現在、Unityで製作しているアプリを公開に向けて頑張っているのですが、
無料版だからUnityロゴが出るのは仕方ないとして、Unityロゴの後に自分で用意したロゴを表示してから最初の画面に遷移できないかなぁと考えました。

手順としては以下の通りです。

  1. 独自ロゴ表示用 Scene を作成し、画面全体にロゴ画像が表示されるようにする
  2. アプリ起動時に1.で作成したSceneが表示される様に[Build Settings]を設定する
  3. スクリプトを作成して、一定時間経過後に別のシーンに遷移する様にする


1. 独自ロゴ表示用 Scene を作成し、画面全体にロゴ画像が表示されるようにする


「Title」という名前で、Sceneを作成します(名前はなんでもいいです)。
UI コンポーネントの Image を追加して、用意しておいたロゴをしていします。

詳細は今回の本質ではないので除外します。

2. アプリ起動時に1.で作成したSceneが表示される様に[Build Settings...]を設定する


[File - Build Settings...]メニューを選択し、Scene In Build に以下のようにSceneを追加して、起動時にTitle Scene が表示されるようにします。


2つ目のScene名は現在作成中のアプリに合わせて変更してください。


3. スクリプトを作成して、一定時間経過後に別のシーンに遷移する様にする


スクリプトを作成して、Main Cameraにでも設定しておいてください。
作成できたら、スクリプトに以下のように書いて、2秒間カスタムロゴを表示して、別のシーンに遷移するようにします。

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;

public class TitleSplash : MonoBehaviour {
    float startTime = 0.0f;

    // Use this for initialization
    void Start () {
        startTime = Time.time;
    }
  
    // Update is called once per frame
    void Update () {
        if (Application.isShowingSplashScreen == false) {
            // 広告などの処理.
            float now = Time.time;
            float elapsedTime = now - startTime;
            if (elapsedTime > 2.0f) {
                SceneManager.LoadScene("HogeHoge");
            }
        }
    }
}


これでOK!
と思いきや!ここでハマりました。

実際に起動してみると、明らかにロゴが表示されてから2秒も経っていないのに次のSceneに遷移してしまいました。

これは、Unityロゴが表示されている途中にTitleシーンが読み込まれていて、時間の計測が始まってしまっていることが原因でした。

以下の値をチェックすることで、Unityロゴが表示されているかどうかをチェックすることができます。

Application.isShowingSplashScreen 

なので、少し修正して以下のように書き換えてやると、2秒間カスタムロゴを表示した後に、Build Settings で指定した次のScene に遷移します。

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;

public class TitleSplash : MonoBehaviour {
    bool  isMySplashShowing = false;
    float startTime = 0.0f;

    // Use this for initialization
    void Start () {
    }
   
    // Update is called once per frame
    void Update () {
        if (Application.isShowingSplashScreen == false) {
            if (!isMySplashShowing) {
                startTime = Time.time;
                isMySplashShowing = true;
            } else {
                // 広告などの処理.
                float now = Time.time;
                float elapsedTime = now - startTime;
                if (elapsedTime > 2.0f) {
                    SceneManager.LoadScene("HogeHoge");
                }
            }
        }
    }
}

0 件のコメント:

コメントを投稿