mieki256's diary



2014/02/16() [n年前の日記]

#1 [unity] シングルトンについて勉強中

以下の解説ページを参考にして実験中。

_naichilab - Android iOSアプリ開発メモ: 【Unity】なんちゃらManagerクラスを作ろう(シングルトン)
_ざんないプログラマァのアプリ開発日記 Unity3D Singleton
_テラシュールウェア [Unity3D]もっと楽なシングルトンの実装
_Unity勉強 六日目(STG作成開始・シングルトン) - ぼっちプログラマのメモ
_[Unity]Generic Based Singleton for MonoBehaviours完全版(?) | ケットシーウェア

既に該当オブジェクトが存在してた場合、 Destroy() で自分を削除、しているつもりが削除できなくてハマったり。一応、こんな感じにしたら消えてくれたけど…合ってるのかな…。

SingletonMonoBehaviour.cs
using UnityEngine;
// using System.Collections;

// Singletonを簡単に使う
public class SingletonMonoBehaviour<T> : MonoBehaviour where T : MonoBehaviour {
    private static T instance;
    public static T Instance {
        get {
            if (instance == null) {
                System.Type type = typeof(T);
                instance = FindObjectOfType(type) as T;
                if (instance == null) {
                    Debug.LogError(typeof(T) + " is nothing");
                }
            }
            return instance;
        }
    }

    protected void Awake() {
        if (instance == null) {
            instance = this as T;
            DontDestroyOnLoad(this.gameObject);
        }
        else {
            // Debug.LogError(typeof(T) + " exist");
            Destroy(this.gameObject);
        }
    }
}

GWk.cs
using UnityEngine;
using System.Collections;

// グローバルワーク。Singletonを使う
public class GWk : SingletonMonoBehaviour<GWk> {

    public static int PlayerLife = 100;
    public static int PlayerLifeMax = 100;

    void Start() {

    }

    void Update() {

    }
}
とりあえず、シーンに空の GameObject を配置して、その GameObject に GWk.cs を追加、かつ、GameObjectの名前を GWk に変更。さらに、その GameObject を Prefab化。

StartButton.cs
using UnityEngine;
using System.Collections;

public class StartButton : MonoBehaviour {
    public string NextSceneName = "";
    public string ButtonText = "";
    private bool pushEnable = false;
    private bool nextScened = false;
    private float timer = 0;

    public GameObject gwk;
    public GameObject fadeManager;

    void Awake() {
    }

    void Start() {
        pushEnable = false;
        nextScened = false;
        timer = 0.5f;

    }

    void Update() {
        if (nextScened || pushEnable) return;

        timer -= Time.deltaTime;
        if (timer > 0) return;

        if (Input.GetKeyDown(KeyCode.Space)
            || Input.GetButtonDown("Fire1")
            || Input.GetButtonDown("Jump")) {
            // ボタンが押されたらフラグを立てる
            pushEnable = true;
        }
    }

    void OnGUI() {
        if (nextScened) return;

        int w = 200;
        int h = 32;
        int x = (Screen.width - w) / 2;
        int y = (Screen.height - h - 32);
        if (GUI.Button(new Rect(x, y, w, h), ButtonText)) pushEnable = true;

        if (pushEnable) {
            // ボタンが押された

            if (GWk.Instance == null)
                Instantiate(gwk);

            if (Application.loadedLevelName == "about") {
                // aboutシーンなら、ゲーム用ワークを初期化
                GWk.PlayerLife = 100;
                GWk.PlayerLifeMax = 100;
            }

            if (FadeManager.Instance == null)
                Instantiate(fadeManager);

            // シーン移行
            // Application.LoadLevel(NextSceneName);
            FadeManager.Instance.LoadLevel(NextSceneName, 0.3f);

            nextScened = true;
        }
    }
}

最初に実行されるシーンにあらかじめ配置しておく分には問題無いのだけど。途中のシーンをいきなり実行しようとすると、「そんなオブジェクトは無い」と言われてしまうので…。hoge.Instance が null を返した場合は、該当オブジェクトが無いから Prefab から発生( Instantiate(hoge); )、ということにしてしのいでいるけど、これも合ってるのかどうか…。

以上です。

過去ログ表示

Prev - 2014/02 - Next
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project