Unity原型模式

在游戏开发或业务系统中,我们经常会遇到这样的需求:

需要在运行时创建大量结构相同、但状态彼此独立的对象,例如怪物、技能、Buff 或道具。

如果每次都通过 new 并在构造函数中手动初始化所有字段,不仅代码冗长,而且容易产生重复逻辑。

为了解决这一问题,设计模式中的 原型模式(Prototype Pattern) 提供了一种更高效的思路:
通过复制已有对象来创建新对象,而不是重新构造。

1.定义原型接口

cs 复制代码
public interface IPrototype
{
    IPrototype Clone();
}

2.定义怪物类

定义了怪物的基础属性,并实现克隆方法返回一个接口类型的数据。MemberwiseClone() 是 .NET 在 System.Object 中提供的受保护方法,用于对当前对象进行逐字段的浅拷贝,不会调用构造函数。

⚠️ 注意:
MemberwiseClone() 永远是浅拷贝。

当对象中只包含值类型字段(如 intfloat)时,拷贝后的对象是完全独立的;

但如果后续为怪物添加了 ListDictionary 等可变的引用类型字段,则需要在 Clone() 方法中手动处理深拷贝逻辑。

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Monster :IPrototype
{
    public int Hp;
    public int Attack;

    public IPrototype Clone()
    {
        // 浅拷贝
        return this.MemberwiseClone() as IPrototype;
    }
}

3.克隆怪物并使用

这里的怪物并没有继承MonoBehaviour所以可以用New的方式创建,实际开发中可以把这个脚本换成怪物的数据脚本,创建怪物后将数据脚本附加到继承了MonoBehaviour脚本的真正怪物身上。

这种「数据与表现分离」的结构,在 Unity 项目中非常常见,也更适合与原型模式配合使用。

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MonsterCreat : MonoBehaviour
{
    void Start() 
    {
        Monster monsterA = new Monster { Hp = 100, Attack = 20 };
        Monster monsterB = monsterA.Clone() as Monster;

        monsterB.Hp = 200;

        Debug.Log("monsterA.Hp: " + monsterA.Hp);
        Debug.Log("monsterB.Hp: " + monsterB.Hp);
    }
}

4.运行

将怪物创建脚本加到场景中的一个空对象上并运行,可以看到两个怪物的数据打印了出来,并且修改其中一只怪物的数据并不会影响到另外一个怪物。

5.总结

原型模式的关键并不在于"如何复制对象",而在于清楚地知道哪些数据应该被复制,哪些数据应该被共享。理解这一点,才能在复杂项目中真正发挥它的价值。

相关推荐
小大宇7 小时前
python flask框架 SSE流式返回、跨域、报错
开发语言·python·flask
柒星栈7 小时前
PHP 源码怎么加密防破解?三套方案实战指南
开发语言·php·android studio
勉灬之7 小时前
Next.js + Prisma 跨平台部署踩坑记
开发语言·javascript·ecmascript
这是个栗子8 小时前
前端开发中的常用工具函数(九)
开发语言·javascript·ecmascript·at
蓝创工坊Blue Foundry8 小时前
图片文字提取到 Excel:批量任务如何先定义要交付的字段
运维·服务器·开发语言·数据库·自动化·ocr·excel
会飞的小新8 小时前
C 标准库之 <fenv.h> 详解与深度解析
c语言·开发语言·microsoft
郝学胜-神的一滴8 小时前
[简化版 GAMES 104] 现代游戏引擎 02:拆解现代游戏引擎5+1层级架构,吃透引擎底层核心逻辑
c++·unity·架构·游戏引擎·图形渲染·unreal engine·系统设计
电子科技圈8 小时前
先进封装、芯粒架构和3D集成——先进异构集成亟需兼具标准化与定制化能力的互联及总线IP解决方案
tcp/ip·设计模式·架构·软件构建·代码规范·设计规范
雪的季节9 小时前
dir (obj) 与dir()
开发语言
大不点wow9 小时前
Java序列化与反序列化:让对象走出JVM
java·开发语言·jvm