【Unity程序技巧】Unity中的单例模式的运用


👨‍💻个人主页@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏Unity基础实战

⭐🅰️⭐



文章目录


⭐前言⭐

菜鸟教程

"单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供了一个全局访问点来访问该实例。
注意:

1、单例类只能有一个实例。

2、单例类必须自己创建自己的唯一实例。

3、单例类必须给所有其他对象提供这一实例。"

  • 有错误的地方在于new 的部分


🎶(1)未继承Mono的单例模式


  • 脚本:
csharp 复制代码
public class  GameManagers
{
    private static GameManagers instance;
    public static GameManagers GetInstance()
    {
        if (instance == null) instance = new GameManagers();
        return instance;
    }
}

🎶(2)通用单例模式的基类泛型模板


  • 脚本:
csharp 复制代码
public class  GameManagers<T> where T : new()
{
    private static T instance;
    public static T GetInstance()
    {
        if (instance == null) instance = new T();
        return instance;
    }
}
//继承单例模式泛型模板的基类
public class BaseContorl : GameManagers<BaseContorl>
{

}

🎶(3)继承Mono的单例模式


  • 脚本:
csharp 复制代码
public class Single : MonoBehaviour
{
    private static Single singleControl;
    public static Single SingleControl => singleControl;

    private void Awake()
    {
        singleControl = this;
    }
}
  • 存在的问题

不要在此处new了


🎶(4)继承Mono的单例模式的泛型模板


  • 脚本:
csharp 复制代码
public class SingleBase<T> : MonoBehaviour where T : MonoBehaviour
{
    private static T singleControl;
    public static T SingleControl => singleControl;
    
    //保护类型的虚函数,可供子类重写 
    protected virtual  void Awake()
    {
        singleControl = this as T;
    }
}

//当子类继承单例模式的泛型模板的时候
public class GameContorls : SingleBase<GameContorls>
{
  
    protected override void Awake()
    {
        //子类需要要重写,因为示例返回需要执行
        base.Awake();
    }
}
  • 缺点:

🎶(5)单例模式的泛型模板自动添加


  • 之前的那种模式,当我们连续把单例模式脚本拖拽两次就会破坏单例模式的唯一性
  • 避免了手动拖拽脚本才可以激活单例模式 ,自动添加单例模式,想用就直接调用方法
csharp 复制代码
public class SingleBase<T> : MonoBehaviour where T : MonoBehaviour
{
    private static T instance;

    public static T Geteinstance()
    {
        if (instance == null)
        {
            //用代码创建一个新对象并且添加单例模式脚本
            GameObject obj = new GameObject();
            //设置对象的名字为脚本的名字
            obj.name = typeof(T).ToString();
            //instance就等于添加的这个脚本
            instance = obj.AddComponent<T>();
            //为了保证换场景的时候单例模式还存在
            DontDestroyOnLoad(obj);
        }

        return instance;
    }
}

⭐🅰️⭐


【Unityc#专题篇】之c#进阶篇】

【Unityc#专题篇】之c#核心篇】

【Unityc#专题篇】之c#基础篇】

【Unity-c#专题篇】之c#入门篇】

【Unityc#专题篇】---进阶章题单实践练习

【Unityc#专题篇】---基础章题单实践练习

【Unityc#专题篇】---核心章题单实践练习


你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!



相关推荐
温玉琳琅3 小时前
【UE5】虚幻引擎小百科
ue5·游戏引擎·虚幻
两水先木示7 小时前
【Unity3D】微信小游戏适配安全区域或胶囊控件(圆圈按钮)水平高度一致方案
unity·微信小游戏·安全区域·ui适配·胶囊控件·safearea
枯萎穿心攻击7 小时前
ECS由浅入深第三节:进阶?System 的行为与复杂交互模式
开发语言·unity·c#·游戏引擎
不绝1918 小时前
怪物机制分析(有限状态机、编辑器可视化、巡逻机制)
网络·游戏·unity·游戏引擎
unicrom_深圳市由你创科技9 小时前
Unity开发如何解决iOS闪退问题
unity·ios·蓝桥杯
Yasin Chen14 小时前
C# Dictionary源码分析
算法·unity·哈希算法
深海潜水员1 天前
【Behavior Tree】-- 行为树AI逻辑实现- Unity 游戏引擎实现
游戏·unity·c#
Thomas_YXQ1 天前
Unity3D游戏内存优化指南
游戏·unity·职场和发展·性能优化·蓝桥杯·游戏引擎·unity3d
chillxiaohan1 天前
Unity接入Steamworks.NET实现通信功能
unity
枯萎穿心攻击2 天前
响应式编程入门教程第二节:构建 ObservableProperty<T> — 封装 ReactiveProperty 的高级用法
开发语言·unity·c#·游戏引擎