关于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 ,是添加不了的。如此更明确了他的功能,以上代码已经经过测试,没有问题。