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

1、目的

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

2、流程

(1)创建SingletonMonobehaviour脚本

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

cs 复制代码
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脚本

cs 复制代码
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)把当前对象删除掉。

相关推荐
牙膏上的小苏打23331 小时前
Unity Surround开关后导致获取主显示器分辨率错误
unity·主屏幕
Unity大海3 小时前
诠视科技Unity SDK开发环境配置、项目设置、apk打包。
科技·unity·游戏引擎
卡戎-caryon7 小时前
【Linux网络与网络编程】03.UDP Socket编程
linux·服务器·网络·笔记·单例模式·udp·网络通信
浅陌sss9 小时前
Unity中 粒子系统使用整理(一)
unity·游戏引擎
维度攻城狮13 小时前
实现在Unity3D中仿真汽车,而且还能使用ros2控制
python·unity·docker·汽车·ros2·rviz2
为你写首诗ge16 小时前
【Unity网络编程知识】FTP学习
网络·unity
神码编程18 小时前
【Unity】 HTFramework框架(六十四)SaveDataRuntime运行时保存组件参数、预制体
unity·编辑器·游戏引擎
菲fay20 小时前
Unity 单例模式写法
unity·单例模式
火一线21 小时前
【Framework-Client系列】UIGenerate介绍
游戏·unity
ZKY_241 天前
【工具】Json在线解析工具
unity·json