Cinema4Dメモ

Cinema4Dという3DCGソフトに関するメモ書きです。

NGUI(2.7)でヘルプ画面等を作る場合

2014-05-21 19:46:36 | Unity&Cinema4D

前回、ヘルプ画面をunityのOnGUIを使っていたのをNGUIで作り直そうとしていたわけですが、OnGUIでやる場合、現在のシーンの他にヘルプ画面用のシーンを用意しておいて、

Application.LoadLevelAdditive("guide_01");

なんて感じで、呼び出していたんです。LoadLevelAdditiveを使うと、すると現在のシーンに呼び出したシーンが融合されます。同じことを、NGUIを使って行うと、NGUIのUIの階層構造(UIRoot(2D)以下)がもう一つ読み込まれて、合計2つになってしまって、おかしなことになってしまいました。(前後関係の設定が正しく出来なかった?)

そんで、どうやって解決するのかと考えていたんだけど、「別にもう一つのシーンを読み込む必要ないんじゃね?」ということに気づき、現在のシーンのNGUIのUIにヘルプ画面と、元の画面に戻るための「もどる」ボタンを用意して、必要に応じて表示することにしました。そして実際にこれはうまく行くように見えました。しかし、新たな問題が発生しました。それは非アクティブにしているボタンをGameObject.Findで探すことができないということでした(つまりSetActive(true);ができない)。そして、このことを回避するために、ボタンのコライダとボタンの画像のUIスクリプトのenabledをスクリプトでtrue,falseでコントロールしてみました。ちょっとスマートじゃないような気がしましたが、これでほぼうまく行きました。しかしちょっとボタンの挙動がおかしいかったけど。

この問題を回避するためにいろいろ調べ回った結果、解決策は、最初はボタンを表示しておいて、そのボタンを変数に格納し、その後すぐ隠してしまうということでした。

スクリプトは下のようになりました。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

using UnityEngine;
using System.Collections;

public class Stage01Help : MonoBehaviour {

    private GameObject BackButton;

    void Awake(){
        //最初から非アクティブ化しておくとGameObject.Findで探せないので、
        //最初は表示しておいて、変数に格納した後に非アクティブ化して隠す
        BackButton = GameObject.Find("ButtonBackToStage01");
        BackButton.SetActive(false);
    }

    public void HelpButtonClick() {
        Debug.Log("Help Button is Pushed!");
        //ザ・ワールド!時よ止まれ!
        Time.timeScale = 0;
        //ターゲットカメラのオーディオソースを止める(Stage01のBGMを止める)
        GameObject.Find ("TargetCamera").GetComponent<AudioSource>().enabled = false;
        //自動車のエンジン音を止める
        GameObject.Find ("Car").GetComponent<AudioSource>().enabled = false;
        //Helpのオーディオソースを鳴らす
        GameObject.Find ("Help").GetComponent<AudioSource>().enabled = true;
        //ヘルプのテクスチャを表示する
        GameObject.Find("Sprite (Stage1_Playguide)").GetComponent<UISprite>().enabled = true;
        //Help画面のもどるボタンを表示する
        BackButton.SetActive(true);
    }

    public void BackToStage01ButtonClick(){
        //時は動きだす!
        Time.timeScale = 1;
        //ターゲットカメラのオーディオソースを元に戻す
        GameObject.Find ("TargetCamera").GetComponent<AudioSource>().enabled = true;
        //自動車のエンジン音を元に戻す
        GameObject.Find ("Car").GetComponent<AudioSource>().enabled = true;
        //Helpのオーディオソースを止める
        GameObject.Find ("Help").GetComponent<AudioSource>().enabled = false;
        //ヘルプのテクスチャを隠す
        GameObject.Find("Sprite (Stage1_Playguide)").GetComponent<UISprite>().enabled = false;
        //Help画面のもどるボタンを隠す
        BackButton.SetActive(false);
    }
}

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

というかんじ。な… 何を言ってるのか わからねーと思うが

おれもよくかわからない…

Time.timeScale = 0;というのがあって、これのおかげで、ヘルプ画面の表示中はスタートからの時間を計っている時計も止まります。