[unity]单例模式

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

时间: 2024-11-08 19:11:52

[unity]单例模式的相关文章

Unity(五):使用场景Ⅱ:用于单例模式

单例模式 有关单例模式本身,我想就不用我在这里多说了,它可以说是模式中最简单的一个了.我只是想谈谈我对这个模式的一点想法. 为了实现单例模式,我们通常的做法是,在类中定义一个方法如GetInstance,判断如果实例为null则新建一个实例,否则就返回已有实例.但是我觉得这种做法将对象的生命周期管理与类本身耦合在了一起,与SRP原则相违背.所以我觉得遇到需要使用单例的地方,应该将生命周期管理的职责转移到对象容器上,而我们的类依然是一个干净的类. 为了接下来的说明,我们先编写几个后面需要的接口和类

Unity(六):使用场景Ⅲ:用于依赖注入(上)

有关依赖注入 什么是依赖注入,我想这个问题我在这里说就不大合适了,所以还是推荐一下大师的文章.之前的文章也提到过,"Martin Fowler的Inversion of Control Containers and the Dependency Injection pattern 是不得不推荐的,当然,如果读起来比较费劲的话,吕震宇的你真的了解Ioc与AOP吗?系列也是不错的参考". 这里要多说一句的是,依赖注入(Dependency Injection)和控制反转(Inversion

Unity(四):使用场景Ⅰ:建立类型映射

在之前的一篇文章"Unity(三):快速入门"中,给出了一个简单的示例,让我们对Unity有一个感性的认识.但是,Unity到底是做什么用的呢?一个简单示例并不能解答这个问题. 总的来看,Unity的使用场景主要有以下几个: 建立类型映射 用于单例模式 用于依赖注入 接下来,将逐一介绍各使用场景. 在创建对象时,毫无疑问,类型映射是我们无法回避的一个问题,同时也是一系列工厂模式的根本出发点.类型映射,为面向对象设计的根本原则--"针对接口编程,而不是针对实现编程".

Unity Application Block 1.0系列(7):Lifetime Managers

Unity使用继承于 LifetimeManager 基类的类去控制怎样存放到对象实例的引用和容器怎样销毁这些实例,也就是说Unity基于具体的Lifetime Manager 类去管理对象的创建和销毁. 目前Unity中提供两个Lifetime Manager类可供我们直接使用,当然你也可以实现自己的Lifetime Manager类. 1. ContainerControlledLifetimeManager Unity保存一个指向对象实例的引用.通过Unity容器为同一个类型或对象获取对象

Cardboard Unity SDK Reference 翻译版

最近正在准备雅思,趁机翻译了Cardboard的文档,这个文档挂在谷歌官网上,不翻墙根本看不了,翻了墙这个网页也很不稳定,经常上不去,所以就搬运了过来,不过我英语水平实在有限,这次翻译也是对自己的一次锻炼,有的地方我自己明白但是也很难表述好,还请大神轻喷. 里面有很多奇怪的词汇查不到,都是我自己猜着翻译的,还有的词查到了也不知道是啥,比如"剔除掩膜"啥的-,翻译工作量也很大,都是我自己挤时间翻译的,还请大神们指出翻译的不好的地方,英文版请见我上一篇博客:http://blog.csdn

你知道Unity IoC Container是如何创建对象的吗?

Unity是微软P&P推出的一个开源的IoC框架,最新的官方版本是2.0.Unity之前的版本建立在一个称为ObjectBuild的组件上,熟悉EnterLib的读者,相信对ObjectBuild不会感到陌生.对于EnterLib 5.0之前的版本,ObjectBuild可以说是所有Application Block的基石.ObjectBuild提供一种扩展.可定制的对象创建方式,虽然微软官方没有将ObjectBuild和IoC联系在一起,其本质可以看成是一个IoC框架.在Unity 2.0中,

[Unity3d]单例模式

这几天想把在实习里碰到的一些好的技巧写在这里,也算是对实习的一个总结.好啦,今天要讲的是在Unity里应用一种非常有名的设计模式--单例模式. 开场白 单例模式的简单介绍请看前面的链接,当然网上还有很多更详细的介绍,有兴趣的童靴可以了解一下.其实设计模式对于一个程序员来说还是非常有用的,这点随着学习的深入感受越来越深. 好啦,现在说一下Unity里的单例模式.什么时候需要使用单例模式呢?正如它的名字一样,你认为一些东西在整个游戏中只有一个而你又想可以方便地随时访问它,这时你就可以考虑单例模式了.

Unity 使用快速教程

Unity是微软在CodePlex上的一个开源项目,可用于依赖注入.控制反转,类似Spring,下面是使用示例: 1.先来定义几个接口.类 1 namespace UnityTest 2 { 3 public interface IRun 4 { 5 void Run(); 6 } 7 } View Code : IRun 1 namespace UnityTest 2 { 3 public class Pet 4 { 5 public string Name { set; get; } 6 }

.Net IOC框架入门之一 Unity

一.概述 IOC:英文全称:Inversion of Control,中文名称:控制反转,它还有个名字叫依赖注入(Dependency Injection). 作用:将各层的对象以松耦合的方式组织在一起,解耦,各层对象的调用完全面向接口.当系统重构的时候,代码的改写量将大大减少. 依赖注入: 当一个类的实例需要另一个类的实例协助时,在传统的程序设计过程中,通常有调用者来创建被调用者的实例.然而采用依赖注入的方式,创建被调用者的工作不再由调用者来完成,因此叫控制反转,创建被调用者的实例的工作由IO