关于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(); //instance=FindeObjectOfType(typeof(ModelLocator)) as 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 ,是添加不了的。如此更明确了他的功能,以上代码已经经过测试,没有问题。