关于Unity的脚本,用过的人应该都会觉得使用之方便了,又加上Unity把脚本与界面集成,使他更为人性化。已经这么方便了,为什么还要讲一些编程思维呢?
其实做一些小应用是没有关系的,不过当工程越来越大时,你会发现其维护难度会越来越大,Unity其他我讲不了,脚本上我做一些个人学习总结,以作各位参考,疏漏出错之处,还请补充,一起进步。
废话不多说,让我们开始。
我也不讲单例模式的概念了,英文叫singleton,大家可以Google一下概念。
切入正文。单例模式可以用来做什么呢?他可以很方便地提供数据、对象的访问方式,单例仅允许被实例一次,这就保证了他在各个程序模块间的唯一性。大家可能会想到全局变量,是的,确实可以用全局变量来做。不过为了提供代码的可维护性,全局是有很大局限的。你又想在Unity里经常还可Static 变量会共享信息,不过你还发现他被声明在各处。对的,不好找,不好维护。
下面我做个数据共享的单例模式的例子:
创建一个名为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;
        }
    }
}

怎么使用呢?如下面一个MonoBehaviour 成为场景中对象的行为后,他就会一直访问这个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;
        }
    }
}

下面是另一个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="";
        }
    }
}

这个部分只是演示了如何对数据的一种管理思想。单例模式在Unity里的应用其实是很广泛的,如观察者模式中就用到了这个模式,本人将在有时间单独写个报道。

补充C#属性(get/set)的一些使用技巧:
2,添加逻辑,如
ModelLocator 可以这样写:
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,访问控制:
public string myString{
        get{
            return "CG says:"+_myString;
        }

那么myString是只读属性
public string myString{       
        set{
            _myString=value;
        }
    }
那么myString不可读,但可写,

注:ModelLocator 不需附加到场景中的物体,实际上他不是个MonoBehaviour ,是添加不了的。如此更明确了他的功能,以上代码已经经过测试,没有问题。