溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

[unity]單例模式

發(fā)布時(shí)間:2020-08-29 20:17:46 來(lái)源:網(wǎng)絡(luò) 閱讀:742 作者:蓬萊仙羽 欄目:開(kāi)發(fā)技術(shù)

關(guān)于Unity的腳本,用過(guò)的人應(yīng)該都會(huì)覺(jué)得使用之方便了,又加上Unity把腳本與界面集成,使他更為人性化。已經(jīng)這么方便了,為什么還要講一些編程思維呢?
其實(shí)做一些小應(yīng)用是沒(méi)有關(guān)系的,不過(guò)當(dāng)工程越來(lái)越大時(shí),你會(huì)發(fā)現(xiàn)其維護(hù)難度會(huì)越來(lái)越大,Unity其他我講不了,腳本上我做一些個(gè)人學(xué)習(xí)總結(jié),以作各位參考,疏漏出錯(cuò)之處,還請(qǐng)補(bǔ)充,一起進(jìn)步。
廢話不多說(shuō),讓我們開(kāi)始。
我也不講單例模式的概念了,英文叫singleton,大家可以Google一下概念。
切入正文。單例模式可以用來(lái)做什么呢?他可以很方便地提供數(shù)據(jù)、對(duì)象的訪問(wèn)方式,單例僅允許被實(shí)例一次,這就保證了他在各個(gè)程序模塊間的唯一性。大家可能會(huì)想到全局變量,是的,確實(shí)可以用全局變量來(lái)做。不過(guò)為了提供代碼的可維護(hù)性,全局是有很大局限的。你又想在Unity里經(jīng)常還可Static 變量會(huì)共享信息,不過(guò)你還發(fā)現(xiàn)他被聲明在各處。對(duì)的,不好找,不好維護(hù)。
下面我做個(gè)數(shù)據(jù)共享的單例模式的例子:
創(chuàng)建一個(gè)名為ModelLocator的C#腳本,
using UnityEngine;
using System.Collections;

public class ModelLocator {

    public string myString;
    private static ModelLocator instance;
    public static ModelLocator getInstance{
        get{
            if(instance==null){
                instance=new ModelLocator();
            }
            return instance;
        }
    }
}

怎么使用呢?如下面一個(gè)MonoBehaviour 成為場(chǎng)景中對(duì)象的行為后,他就會(huì)一直訪問(wèn)這個(gè)myString的變量了。
using UnityEngine;
using System.Collections;

public class Action1 : MonoBehaviour {

    // Use this for initialization
    void Start () {
          
    }
    
    // Update is called once per frame
    void Update () {
        if(ModelLocator.getInstance.myString!=null && ModelLocator.getInstance.myString!=""){
            //do somethings;
        }
    }
}

下面是另一個(gè)MonoBehaviour 做的事:
using UnityEngine;
using System.Collections;

public class Action2 : MonoBehaviour {
    
    public bool state=true;
    // Use this for initialization
    void Start () {
        
    }
    
    // Update is called once per frame
    void Update () {
        if(state){
            ModelLocator.getInstance.myString="I'm a Unityer!";
        }else{
            ModelLocator.getInstance.myString="";
        }
    }
}

這個(gè)部分只是演示了如何對(duì)數(shù)據(jù)的一種管理思想。單例模式在Unity里的應(yīng)用其實(shí)是很廣泛的,如觀察者模式中就用到了這個(gè)模式,本人將在有時(shí)間單獨(dú)寫(xiě)個(gè)報(bào)道。

補(bǔ)充C#屬性(get/set)的一些使用技巧:
2,添加邏輯,如
ModelLocator 可以這樣寫(xiě):
using UnityEngine;
using System.Collections;

public class ModelLocator {

    private string _myString;
    private static ModelLocator instance;
    public static ModelLocator getInstance{
        get{
            if(instance==null){
                instance=new ModelLocator();
            }
            return instance;
        }
    }
    public string myString{
        get{
            return "CG says:"+_myString;
        }
        set{
            _myString=value;
        }
    }
}
1,訪問(wèn)控制:
public string myString{
        get{
            return "CG says:"+_myString;
        }

那么myString是只讀屬性
public string myString{       
        set{
            _myString=value;
        }
    }
那么myString不可讀,但可寫(xiě),

注:ModelLocator 不需附加到場(chǎng)景中的物體,實(shí)際上他不是個(gè)MonoBehaviour ,是添加不了的。如此更明確了他的功能,以上代碼已經(jīng)經(jīng)過(guò)測(cè)試,沒(méi)有問(wèn)題。
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI