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

DesignMode__unity__抽象工厂模式在unity中的应用、用单例模式进行资源加载

目录

抽象工厂模式

思维导图

接口(抽象类)

工厂接口

抽象产品类

抽象武器接口

抽象人物接口

具体工厂和具体产品

具体工厂

(1)产品接口,生成具体人物

(2)武器接口,生成具体武器

具体产品的实现

Soldier类型

ShotGunA 类型

单例模式资源加载

测试

GameController

PerformanceTest


抽象工厂模式

思维导图

一个工厂里面可以生产多个产品

一个工厂可以生产一系列产品(一族产品),极大减少了工厂类的数量

接口(抽象类)

工厂接口

在工厂里声明创造的武器和产品

武器:创造武器方法创造具体的武器

人物:创造产品方法创造具体的人物

public interface IGameFactory
{IWeapon GreateWeapon();ICharacter CreateCharacter();
}

抽象产品类

抽象武器接口

用来生产不同的武器,武器类型

/// <summary>
/// 抽象武器接口-抽象产品
/// </summary>
public interface IWeapon
{void Use();//使用武器void Display();//显示武器
}
抽象人物接口

用来生成不同的产品,人物类型

/// <summary>
/// 抽象产品
/// </summary>
public interface ICharacter
{void Display();//显示模型
}

具体工厂和具体产品

现代风格的具体工厂,返回具体的产品

具体工厂

(1)产品接口,生成具体人物

返回要生成的产品,Soldier类型

(2)武器接口,生成具体武器
public class ModernGameFactory : IGameFactory
{public ICharacter CreateCharacter(){return new Soldier();}public IWeapon GreateWeapon(){return new ShotGunA();}
}

具体产品的实现

Soldier类型

实现ICharacter接口,生产具体的人物

/// <summary>
/// 具体产品---士兵
/// </summary>
public class Soldier : ICharacter
{private GameObject _model;public Soldier(){_model = ResourceManager.Instance.GetResource("Bot/SoldierA");}public void Display(){if (_model != null){GameObject.Instantiate(_model);}else{Debug.LogError("Soldier model not found");}}
}

ShotGunA 类型

ShotGunA产品的生产

实现IWeapon接口

public class ShotGunA : IWeapon
{private GameObject _model;public ShotGunA(){_model = ResourceManager.Instance.GetResource("Weapon/LaserGun_A");}public void Display(){if (_model != null){GameObject.Instantiate(_model);}else{Debug.LogError("ShotGunA model not found");}}public void Use(){Debug.Log("使用武器");}
}

单例模式资源加载

单例模式(Singleton Pattern):是一种创建对象的设计模式,确保一个类只有一个实例,并提供全局访问点。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;/// <summary>
/// 单例模式
/// </summary>
public class ResourceManager
{//本类实例的引用private static ResourceManager _instance;//资源缓存器private Dictionary<string, GameObject> _resourceCache = new Dictionary<string, GameObject>();//为私有的字段准备的属性public static ResourceManager Instance{get//保证有且只有一个实例{if (_instance == null){_instance = new ResourceManager();}return _instance;}}//获取资源的工作代码,从硬盘或者缓存中获取模型资源//传入路径pathpublic GameObject GetResource(string path){//询问资源存储器中是否包含当前路径(不需要重复加载)if (!_resourceCache.ContainsKey(path)){GameObject resource = Resources.Load<GameObject>(path);if (resource == null){Debug.LogError($"Failed to load resource at path: {path}");return null;}_resourceCache[path] = resource;}return _resourceCache[path];}
}

测试

GameController

建个空物体挂上即可

功能:创建产品进行测试

public class GameController : MonoBehaviour
{private ICharacter _character;private IWeapon _weapon;public void StartGame(IGameFactory factory){try{_character = factory.CreateCharacter();          _weapon = factory.GreateWeapon();_character.Display();_weapon.Use();}catch (System.Exception e){Debug.LogError($"Error starting game: {e.Message}");}}
}

PerformanceTest

建个空物体挂上即可

功能:测试用抽象工厂模式创建物体和直接实例化物体的时间性能区别

(直接创建会快)

public class PerformanceTest : MonoBehaviour
{private void Start(){//TestDirectInstantiation(500);TestFactoryPattern(500);}//直接实例化void TestDirectInstantiation(int count){Stopwatch stopwatch = new Stopwatch();stopwatch.Start();List<GameObject> objects = new List<GameObject>();GameObject prefab = Resources.Load<GameObject>("Bot/SoldierA");for (int i = 0; i < count; i++){objects.Add(GameObject.Instantiate(prefab));}stopwatch.Stop();UnityEngine.Debug.Log($"Direct Instantiation ({count} objects): {stopwatch.ElapsedMilliseconds} ms");// Clean upforeach (var obj in objects){GameObject.Destroy(obj);}objects.Clear();Resources.UnloadUnusedAssets();}//抽象工厂的实例化测试void TestFactoryPattern(int count){Stopwatch stopwatch = new Stopwatch();stopwatch.Start();IGameFactory factory = new ModernGameFactory();List<ICharacter> characters = new List<ICharacter>();for (int i = 0; i < count; i++){characters.Add(factory.CreateCharacter());characters[i].Display();}stopwatch.Stop();UnityEngine.Debug.Log($"Factory Pattern ({count} objects): {stopwatch.ElapsedMilliseconds} ms");//Clean upcharacters.Clear();Resources.UnloadUnusedAssets();}}

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

相关文章:

  • Leetcode3289. 数字小镇中的捣蛋鬼
  • 13_Python的高阶函数
  • 清空当前机器所有Docker容器和镜像
  • FreeRTOS学习——Systick中断、SVC中断、PendSV中断
  • 汇量科技大数据面试题及参考答案
  • 移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——14.AVL树
  • Python 的数据类型与操作
  • Python燃烧废气排放推断算法模型
  • Qt中多语言的操作(以QtCreator为例)
  • 计算机毕业设计 社区医疗服务系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • html+css学习
  • 2.gitlab ce 细粒度的权限控制
  • G - Merchant Takahashi / F - Useless for LIS
  • 自然语言处理实例
  • 『功能项目』主角属性值显示【75】
  • 单片机嵌入式编程中常用技术点
  • 【毕业论文+源码】基于ASP+NET的人事管理系统
  • 计算机毕业设计 校园志愿者管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • 速通LLaMA2:《Llama 2: Open Foundation and Fine-Tuned Chat Models》全文解读
  • 如何使用VM中win10搭建Hfish蜜罐(危险感知平台)。从下载到部署详细教程
  • Rust: AES 加密算法库
  • 计算机网络34——Windows内存管理
  • Redisson 总结
  • EfficientFormer实战:使用EfficientFormerV2实现图像分类任务(一)
  • 文心智能体搭建步骤
  • PHP安全
  • c++278函数指针
  • sklearn特征选取之SelectFromModel
  • vue一级、二级路由设计
  • python爬虫:将知乎专栏文章转为pdf