メインメニューを作成する次のコードがあります。
public class EscapeGUI : MonoBehaviour {
public GUISkin MySkin;
public bool pauseToggle = false;
public bool showGUI = false;
public bool levelLoaded = false;
static string filePath;
private List<string> list = new List<string>();
private string line;
void Update() {
if (!levelLoaded) {
showGUI = true;
Time.timeScale = 0;
Debug.Log ("NO LEVEL LOADED");
} else {
if (Input.GetKeyDown (KeyCode.Escape)) {
pauseToggle = !pauseToggle;
if (pauseToggle) {
Time.timeScale = 0;
showGUI = true;
} else {
Time.timeScale = 1;
showGUI = false;
}
}
Debug.Log("FILEPATH IS " + filePath);
Debug.Log("LEVEL IS LOADED");
}
}
void OnGUI() {
if (showGUI) {
GUI.skin = MySkin;
GUILayout.BeginArea (new Rect (Screen.width / 4, Screen.height / 4, 400, Screen.width / 2));
GUILayout.BeginHorizontal ();
if (levelLoaded){
if (GUILayout.Button ("Resume")) {
Time.timeScale = 1;
showGUI = false;
pauseToggle = false;
}
}
GUILayout.EndHorizontal ();
GUILayout.BeginHorizontal ();
if (levelLoaded){
if (GUILayout.Button ("Restart")) {
Application.LoadLevel (0);
showGUI = false;
pauseToggle = false;
Time.timeScale = 1;
levelLoaded = true;
Debug.Log ("Game is restarted with this level: " + filePath);
}
}
GUILayout.EndHorizontal ();
GUILayout.BeginHorizontal ();
if (GUILayout.Button ("Load")) {
filePath = EditorUtility.OpenFilePanel("Select JSON file",Application.streamingAssetsPath,"txt");
Debug.Log ("Game is loaded with this level: " + filePath);
StreamReader reader = new StreamReader(filePath);
while ((line = reader.ReadLine()) != null)
{
list.Add(line);
//Debug.Log(line);
}
//Do this as soon as the JSON is checked and found to be OK.
GameObject.Find("Preserved Variables").SendMessage("setFilePath", filePath);
Time.timeScale = 1;
levelLoaded = true;
showGUI = false;
pauseToggle = false;
}
GUILayout.EndHorizontal ();
GUILayout.BeginHorizontal ();
if (GUILayout.Button ("Quit")) {
Application.Quit();
}
GUILayout.EndHorizontal ();
GUILayout.EndArea ();
}
}
}
ゲームは JSON ファイルをインポートすることによって作成されます (コードではテスト用の txt のみで、JSON 部分はまだ実装していません)。この JSON ファイルでは、ゲーム フローが記述されます。
基本的に、プレーヤーがロードをクリックすると、ゲームがプレイ可能になり、クリックすると「Application.LoadLevel (0);」のために再起動します。コードはすべて削除されるため、現在のファイル (レベル) が何であったかはわかりません。
そこで、'Preserved Variables' という空のゲーム オブジェクトを作成し、これに C# スクリプト コンポーネントを配置しました。スクリプトは次のようになります。
public class PreservedVariables : MonoBehaviour {
public string filePath;
public static PreservedVariables instance;
void Awake() {
if(instance){
Destroy(this);
} else {
DontDestroyOnLoad(this);
instance = this;
}
}
void setFilePath(string fp) {
filePath = fp;
}
string getFilePath() {
return filePath;
}
}
問題は、これを実行してゲーム内で「ロード」をクリックし、ファイルを選択して、これまでのところすべてが良好であることです。しかし、「再起動」をクリックすると、次の2つの問題が発生します。
1)メインメニューには、ゲームがロードされていないときにのみ表示されるはずの「ロード」と「終了」のみが表示されます(したがって、これは起動時にのみ発生します)。ただし、これはnr.2を修正することで修正されると思います(下記参照)
2) ファイルをロードした後に再起動をクリックするとすぐに、ゲームオブジェクトの「Preserved Variables」が再び作成されますが、今回はスクリプト コンポーネントが添付されていません。(元のゲームオブジェクトの FilePath は正しく更新されています)。
これについて非常に小さな質問をしたいのですが、再起動コードで使用できるように、空のゲームオブジェクト「Preserved Variables」からファイルパス変数を正確に取得するにはどうすればよいですか?