前回、ヘルプ画面を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;というのがあって、これのおかげで、ヘルプ画面の表示中はスタートからの時間を計っている時計も止まります。