Unity3D仿星露谷物语开发5之角色单例模式

news/2024/12/24 20:23:24/

1、目的

使用单例模式创建角色对象,保证整个游戏中只有一个角色,并且让游戏对象具有全局可访问性。

2、流程

(1)创建SingletonMonobehaviour脚本

Assets下创建Scripts目录用于存放所有的脚本,再创建Misk子目录,创建SingletonMonobehaviour脚本。

public abstract class SingletonMonobehaviour<T> : MonoBehaviour where T: MonoBehaviour
{private static T instance;public static T Instance {  get { return instance; } }protected virtual void Awake(){if (instance == null){instance = this as T;}else{Destroy(gameObject);}}
}

(2)创建Player脚本

public class Player : SingletonMonobehaviour<Player>
{}

(3)挂载Player脚本并执行程序

将Player脚本挂载到Prefabs -> Player对象上。

然后通过Player预设体创建两个对象,执行程序后发现只剩下一个对象。

3、代码解读

这段代码实现了一个Unity中的单例模式,专门用于MonoBehaviour类。

在Unity游戏开发中,单例模式是一种常用的设计模式,,用于确保一个类只有一个实例,并提供一个全局访问点。

这个实现方式利用了Unity的生命周期方法Awake来确保实例的唯一性。

(1)SingletonMonobehaviour<T> 类

泛型类,其中T被约束继承自MonoBehaviour。这意味着这个单例模式只能用于MonoBehaviour的子类。

  • private static T instance;

instance是一个静态字段,用于存储类的唯一实例。由于是静态的,它将在类的所有实例之间共享。

  • public static T Instance

提供了一个公共的静态属性Instance,用于访问类的唯一实例。上面提到过,单例模式提供了一个全局访问点,而Instance属性就是这个全局访问点

  • protected virtual void Awake()

重写了Unity的Awake方法。Awake在对象被加载时自动调用,这使得它成为初始化单例实例的理想位置。

在Awake方法中,首先检查instance是否为null。如果是,表示这是第一个被创建的实例,因此将当前实例(通过this as T)赋值给instance.

如果instance不为null,表示已经存在一个实例。在这种情况下,为了避免多个实例同时存在,当前的游戏对象(gameObject)会被销毁。

(2)Player类

Player 类继承自SingletonMonobehaviour<Player>。通过这样做,Player 类自动获得了单例模式的特性。

由于SingletonMonobehaviour<T>是一个泛型类,Player 指定了T为Player自身,这意味着instance字段将特定于Player类,确保Player类在场景中只有一个实例。

后续假设在游戏管理类GameManager类中访问该游戏对象,可以通过Player.Instance获取该实例

单例模式不负责创建对象,它只是确保只有一个实例存在并提供访问它的方式

在本例中,第一个Player被创建的时候,当前的gameObject会被存放到Player单例的instance变量中。当第二个Player被创建的时候,发现instance变量已经有值了,就通过Destory(gameObject)把当前对象删除掉。


http://www.ppmy.cn/news/1557821.html

相关文章

Java的基础概念(一)

一、注释 **注意&#xff01;&#xff1a;**注释内容不会参与编译和运行&#xff0c;仅仅是对代码的解释说明。 Java支持单行注释、多行注释、文档注释。 单行注释 以//开头 &#xff0c;格式【 //注释内容 】 例子如下&#xff1a; 多行注释 格式【 / 注释内容 / 】 例…

【视觉SLAM:Panoptic FPN全景分割网络】

Panoptic FPN是一种全景分割&#xff08;Panoptic Segmentation&#xff09;的经典网络&#xff0c;最早由 Kirillov 等人在 2019 年提出。全景分割是一种统一的视觉任务&#xff0c;结合了实例分割&#xff08;Instance Segmentation&#xff09;和语义分割&#xff08;Semant…

前端中的拖拽知识

概述 本文主要介绍前端中拖拽相关的知识以及如何在 vue3 工程里实现拖拽指令。 前端中的拖拽 前端中的拖拽功能是一种交互设计&#xff0c;允许用户通过鼠标或触摸操作移动页面上的元素到不同的位置。这一功能的实现涉及 HTML、CSS 和 JavaScript 的综合运用。 HTML元素拖拽…

RabbitMQ的工作模型

RabbitMQ 其实一共有六种工作模式&#xff1a;简单模式&#xff08;Simple&#xff09;、工作队列模式&#xff08;Work Queue&#xff09;、发布订阅模式&#xff08;Publish/Subscribe&#xff09;、路由模式&#xff08;Routing&#xff09;、通配符模式&#xff08;Topic&a…

sqlilabs第三十关到第三十五关靶场攻略

第三十关 第三十关和二十九关差不多&#xff0c;将单引号换成双引号 查询表名&#xff0c;字段名&#xff0c;数据 ?id1&id-2" union select 1,group_concat(table_name),3 from information_schema.tables where table_schemadatabase()-- ?id1&id-2" …

搜索引擎蜘蛛池的原理是什么,蜘蛛池搭建教程(蜘蛛池.中国)

搜索引擎蜘蛛池的原理 模拟自然链接结构&#xff1a;通过大量域名和服务器资源创建众多站点页面&#xff0c;相互链接形成类似自然的庞大链接结构&#xff0c;吸引搜索引擎蜘蛛频繁访问. 制造活跃假象&#xff1a;蜘蛛池中的网页内容丰富且更新频繁&#xff0c;会让搜索引擎蜘…

前端项目发布后打开报错Uncaught SyntaxError: Unexpected token ‘<‘ (at chunk-vendors)

报错原因&#xff1a;请求js拿到的是一个非js脚本文件&#xff0c;因为请求没拿到正确路径。 如&#xff1a;我的项目是部署在www.a.com/web下&#xff0c;打包后index.html内请求的脚本默认是 <script src"/static/js/chunk-vendors.ea8a242f.js"></scrip…

STL源码剖析(侯捷版本) —— 第四章 序列式容器(三)

传送门 STL源码剖析(侯捷版本) —— 第一章 STL 概论与版本简介 STL源码剖析(侯捷版本) —— 第二章 空間配置器 allocator STL源码剖析(侯捷版本) —— 第三章 迭代器(Iterators)与Traits编程技巧在C STL中的应用 STL源码剖析(侯捷版本) —— 第四章 序列式容器&#xff08…