当前位置: 首页 > news >正文

unity进阶学习笔记:单例模式

游戏框架:

游戏框架一般包括消息框架,状态机,管理器,工具类。

消息框架指游戏物体之的通信框架,虽然unity引擎自带一套消息框架,但该框架只能用于父子物体之间通信,无法实现大部分非父子关系的物体间通信。因此我们要在后续自己完成一套消息框架

状态机用于管理每一个物体不同状态,如对于一个人物可能有移动,攻击,死亡等多个状态。使用状态机可以更好进行状态管理和切换

管理器用于完成一个特定游戏功能。如角色管理器,背包管理器,任务系统管理器等

工具类用于封装一些会反复出现的函数或功能,如创建随机数,生成伤害,加密内容等

单例类:

单例只一个类只生成一个对象。一般来说,游戏内容的管理类,如消息管理类,网络管理类都只应有一个对象,这时就要使用单例实现。

游戏中每将一个脚本挂载到一个游戏物体上作为组件时,就会生成一个该脚本类的对象。因此要实现单例必须保证只挂载一个物体

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class TestMonobehavior : MonoBehaviour
{private static TestMonobehavior instance;public static TestMonobehavior Instance {get {return instance;}}void Awake(){instance = this;}// Update is called once per framevoid Update(){}
}

在该实例中,我们创建一个单例对象instance(一般单例对象常用名)用于给外界访问。并定义一个静态方法用于返回该单例对象。这样外界就可以通过TestMonobehavior.Instance对单例进行访问

我们考虑到一个游戏中可能有多个单例对象(如多个管理类)。因此我们可以编写一个泛型单例类基类,然后让后续的单例类继承该基类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class SingletonBase<T> : MonoBehaviour where T : MonoBehavior
{private static T instance;public static T Instance {get {return instance}}protected virtual void Awake(){instance = this as T; }protected virtual void OnDestroy(){instance = null;}
}

这里我们的程序和上面基本一致,只不过将instance设为泛型对象。另外注意以下几点:

public class SingletonBase<T> : MonoBehaviour where T : MonoBehavior

在类定义中,where T : MonoBehavior指泛型T必须是MonoBehavior(unity游戏对象类)子类

protected virtual void Awake()

这里Awake()和Destroy()的方法可能会在子类重写。因此我们将其设为protected权限(不可外部访问,但可以被继承)的抽象方法

对于普通类(非unity脚本),可以使用以下方法实现单例

public class Test : MonoBehaviour
{private static Test instance;public static Test Instance {get {if (instance == null) {instance = new Test();}return instance;}
}

这里我们在Instance方法里先判断instance是否被创建,用于在第一次调用单例方法时创建单例。之后我们就正常使用return instance得到单例对象

http://www.lryc.cn/news/65705.html

相关文章:

  • 软件测试——性能指标
  • leetcode 405. 数字转换为十六进制数
  • 部门来了个软件测试,听说是00后,上来一顿操作给我看呆了...
  • 使用篇丨链路追踪(Tracing)很简单:链路拓扑
  • 2023年厦门等保二级备案办理流程
  • 提高开发效率,从这些小技巧开始——5个让你爱上IDEA的增加体验小技巧
  • Python基础合集 练习22 (错误与异常处理语句2)
  • ELK -- kibana 用nginx代理后无法访问
  • 什么是分布式事务
  • 在 Python 中将整数转换为罗马数字
  • HashTable,Properties,TreeSet源码分析
  • 多维图像去噪方法研究
  • 托福口语考察内容和形式
  • 【地铁上的设计模式】--结构型模式:代理模式
  • Oracle 体系结构
  • java手写日历系统(亲测)
  • 35-40的技术人员为什么会被“不友好”,请你们自身反思-拒做职场的“嗯嗯”怪
  • 工地烟火AI监控识别分析系统 yolov7
  • MATLAB算法实战应用案例精讲-【人工智能】对比学习(概念篇)(补充篇)
  • 代码随想录算法训练营第三十一天 | 贪心1,想不到怎么找局部最优就做不出来
  • 【SVN】版本控制管理的文件(夹)如何重命名
  • 必须包含数字,字母组合的密码正则表达式
  • JavaScript:栈和对列
  • [数据库系统] 一、创建表以及使用主键约束(educoder)
  • 《走进对象村4》之面向对象的第一大特性——封装
  • 罗马数字转整数、整数转罗马数字----2023/5/4
  • 2023-05-04:用go语言重写ffmpeg的scaling_video.c示例,用于实现视频缩放(Scaling)功能。
  • QT Android QTextEdit 复制粘贴文本后出现多余数据问题
  • 知识变现海哥:你为什么努力却不富有,大概率是你不懂这个道理
  • 【Mybatis】增删改查