Unity 建造者模式(实例详解)

文章目录

      • 说明
      • 实例1:构建游戏角色
      • 实例2:构建游戏场景
      • 实例3:构建UI界面

说明

在Unity中,建造者模式(Builder Pattern)是一种创建型设计模式,它通过分离对象构建过程的复杂性,允许您以更灵活和可扩展的方式创建不同变体的对象。这种模式尤其适用于需要构造具有多个可选或必须组件的对象,并且希望客户端代码无需了解内部构造细节的情况下。

以下是Unity中使用建造者模式的三个实例:

实例1:构建游戏角色

假设我们正在开发一个角色扮演游戏,游戏角色由多种部件组成,如身体、头部、装备、技能等。我们可以为游戏角色创建一个Builder类来逐个添加这些部分:

// 角色接口
public interface ICharacterBuilder
{void SetBody(BodyPart body);void SetHead(HeadPart head);void SetEquipment(Equipment equipment);void SetSkills(List<Skill> skills);// 构建完整角色的方法Character Build();
}// 具体的建造者实现
public class PlayerCharacterBuilder : ICharacterBuilder
{private BodyPart _body;private HeadPart _head;private Equipment _equipment;private List<Skill> _skills;public void SetBody(BodyPart body) => _body = body;public void SetHead(HeadPart head) => _head = head;public void SetEquipment(Equipment equipment) => _equipment = equipment;public void SetSkills(List<Skill> skills) => _skills = skills;public Character Build(){return new Character(_body, _head, _equipment, _skills);}
}// 客户端代码调用
var builder = new PlayerCharacterBuilder();
builder.SetBody(someBody);
builder.SetHead(someHead);
builder.SetEquipment(someEquipment);
builder.SetSkills(characterSkills);
var player = builder.Build();

实例2:构建游戏场景

在Unity中,构建复杂的场景也是一个可以利用建造者模式的过程。例如,一个SceneBuilder类可以用来逐步地添加游戏对象、灯光、摄像机和其他组件到场景中:

// 场景构建器接口
public interface ISceneBuilder
{void AddGameObject(GameObject go);void SetMainCamera(Camera camera);void AddLight(Light light);Scene BuildScene();
}// 具体场景构建器实现
public class LevelOneSceneBuilder : ISceneBuilder
{private List<GameObject> _gameObjects = new List<GameObject>();private Camera _mainCamera;private List<Light> _lights = new List<Light>();public void AddGameObject(GameObject go) => _gameObjects.Add(go);public void SetMainCamera(Camera camera) => _mainCamera = camera;public void AddLight(Light light) => _lights.Add(light);public Scene BuildScene(){var scene = new Scene(); // Unity 不直接支持这样创建场景,此处仅做示意foreach (var go in _gameObjects)SceneManager.MoveGameObjectToScene(go, scene);_mainCamera.gameObject.SetActive(true); // 设置主摄像机foreach (var light in _lights)SceneManager.MoveGameObjectToScene(light.gameObject, scene);return scene; // 返回构建完成的场景(实际应用中会有所不同)}
}// 使用示例
var levelBuilder = new LevelOneSceneBuilder();
levelBuilder.AddGameObject(playerGO);
levelBuilder.AddGameObject-enemyGO);
levelBuilder.SetMainCamera(mainCam);
levelBuilder.AddLight(sceneLight);
var scene = levelBuilder.BuildScene();

实例3:构建UI界面

在Unity UI系统中,构建用户界面可能涉及到很多不同的元素,如面板、按钮、文本标签等。通过Builder Pattern,可以简化这个过程:

// UI构建器接口
public interface IUIMenuBuilder
{void AddButton(string text, Action onClick);void AddLabel(string labelText);void AddSlider(float min, float max, float value);UnityEngine.UI.Canvas BuildCanvas();
}// 具体UI构建器实现
public class MainMenuBuilder : IUIMenuBuilder
{private CanvasGroup canvasGroup;private RectTransform container;private List<UnityEngine.UI.Button> buttons = new List<UnityEngine.UI.Button>();private List<UnityEngine.UI.Text> labels = new List<UnityEngine.UI.Text>();private List<UnityEngine.UI.Slider> sliders = new List<UnityEngine.UI.Slider>();public MainMenuBuilder(Canvas canvas){canvasGroup = canvas.GetComponent<CanvasGroup>();container = new GameObject("Menu Container").AddComponent<RectTransform>();container.SetParent(canvas.transform);}public void AddButton(string text, Action onClick){var button = Instantiate(buttonPrefab, container);button.GetComponentInChildren<Text>().text = text;button.onClick.AddListener(() => onClick());buttons.Add(button);}public void AddLabel(string labelText){var label = Instantiate(labelPrefab, container);label.text = labelText;labels.Add(label);}public void AddSlider(float min, float max, float value){var slider = Instantiate(sliderPrefab, container);slider.minValue = min;slider.maxValue = max;slider.value = value;sliders.Add(slider);}public UnityEngine.UI.Canvas BuildCanvas(){return canvasGroup.canvas;}
}// 使用示例
var menuBuilder = new MainMenuBuilder(mainCanvas);
menuBuilder.AddButton("Start Game", StartGame);
menuBuilder.AddLabel("Welcome to the game!");
menuBuilder.AddSlider(0f, 100f, 50f);
var builtCanvas = menuBuilder.BuildCanvas();

请注意,以上示例中的Build方法返回的是构建的产品,在Unity中可能是具体的Unity Object或者是一个逻辑结构,实际操作时要根据Unity API的特点进行调整。

python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)
————————————————

​最后我们放松一下眼睛
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/640051.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【cucumber】CucumberOptions详解

CucumberOptions注解&#xff1a;相当于Cucumber的初始化配置 Maven依赖包 <!-- 用户验收测试框架 io.cucumber.junit.CucumberOptions --><dependency><groupId>io.cucumber</groupId><artifactId>cucumber-junit</artifactId><vers…

第一节 K8S的基础概念

第一节 K8S的基础概念 Node 可以理解为一个物理机或者虚拟机 ,K8S中的一个节点 ,每个节点包含Pod 所需的服务, 这些节点 是由 Control Plane 来管理, 节点的名称 用来标识Node 对象,名称必须是唯一的. Node上有三个组件分别是 kubelet ,kube-proxy,container-runtime . kubel…

Linux命令-ab命令(Apache服务器的性能测试工具 )

Apache服务器的性能测试工具 ab命令 是一个测试你 Apache http 服务器的工具&#xff0c;你可以通过这个工具&#xff0c;指定一个单位时间内向 apache 发出的请求数量来看看你的 Apache 和机器配合的性能如何。 语法 []内容为ab命令后跟的语法&#xff0c;eg&#xff1a;ab …

MySQL索引优化:深入理解索引下推原理与实践

随着MySQL的不断发展和升级&#xff0c;每个版本都为数据库性能和查询优化带来了新的特性。在MySQL 5.6中&#xff0c;引入了一个重要的优化特性——索引下推&#xff08;Index Condition Pushdown&#xff0c;简称ICP&#xff09;。ICP能够在某些查询场景下显著提高查询性能&a…

小程序学习-20

建议每次构建npm之前都先删除miniprogram_npm

HJ7 取近似值【C语言】

【华为机试题 HJ7】取近似值 描述输入描述:输出描述:示例1示例2参考代码1参考代码2参考代码3描述 写出一个程序,接受一个正浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于 0.5 ,向上取整;小于 0.5 ,则向下取整。 数据范围:保证输入的数字在 32 位浮点数范…

【Java】小白友好的java IO操作学习笔记

慢就是快&#xff0c;让知识先沉淀一会。 目录 流 数据流 文件流 文件复制 缓冲流 字符流 序列化 流 在 Java 中&#xff0c;流是一种用于处理输入和输出的数据序列的抽象概念。Java 提供了丰富的流类和接口&#xff0c;用于处理不同类型的数据源和数据目标。 Java 中…

Windows11家庭版上安装Hyper-V并导入虚拟机的方法

大纲 安装启用Hyper-V下载并安装启用 导入虚拟机代码地址 一般我们新买的电脑默认自带的是Windows家庭版。这个版本是没有Hyper-V的。如果安装自带Hyper-V的版本&#xff0c;则需要另外购买。但是我们还是有办法在Windows11的家庭版上安装和启用Hyper-V的。 安装启用Hyper-V …

前端模板字符串的使用

目录 1.说明 2.示例 3.总结 1.说明 模板字符串是用反引号&#xff08;&#xff09;分隔的字面量&#xff0c;允许多行字符串&#xff0c;带有嵌入表达式的字符串插值和一种带标签的模板的特殊结构。 是增强版的字符串&#xff0c;在进行字符串拼接时&#xff0c;可以拼接固…

如何理解伪标签中的置信度

伪标签中常常有置信度这一说法&#xff0c;通过置信度&#xff0c;我们可以筛选出质量高的伪标签&#xff08;直观来说是像素&#xff09;&#xff0c;那比如说预测结果为一个2256256的概率图&#xff0c;那针对一个像素的两个通道值&#xff0c;怎样才算质量高或者低呢&#x…

11 python快速上手

函数进阶 函数进阶1.参数的补充1.1 参数内存地址相关【面试题】1.2 函数的返回值是内存地址1.3 参数的默认值【面试题】1.4 动态参数 2. 函数和函数名2.1 函数做元素2.2 函数名赋值2.3 函数名做参数和返回值 3.返回值和print4. 作用域4.1 函数为作用域4.2 全局和局部4.3 global…

一种计数算法

前言 常见的一个问题: 给定一个整形数组, 统计其中有多少唯一的元素. 常见的思路有哪些呢? 元素去重并统计, 利用哈希表进行去重计数.数组排序后统计 以上空间复杂度均与元素数量关联, 如果允许损失精度, 是否可以使用较低的空间占用来统计呢? 利用布隆过滤器是一种的一…

SHELL编程-Linux自动化运维基础(变量与条件控制语法)

SHELL编程-Linux自动化运维基础 变量使用 定义与使用 r123localhost:~$ first_varaaa r123localhost:~$ echo $first_var aaa r123localhost:~$ second_var123 r123localhost:~$ echo $second_var 123 r123localhost:~$ third"bbb ccc" r123localhost:~$ echo $th…

在CentOS 7 中配置NFS服务器

目录 1、克隆两个虚拟机 2、安装 NFS 服务 3、NFS 服务使用 1、克隆两个虚拟机 nfs-servernfs-client&#xff08;修改ip地址&#xff09;[rootxnode1 ~]# cd /etc/sysconfig/network-scripts/[rootxnode1 network-scripts]# vi ifcfg-eno16777736 #修改内容如下 BOOTPROT…

【Oracle】ORA-32017和ORA-00384错误处理

文章目录 【Oracle】ORA-32017和ORA-00384错误处理问题描述问题原因和解决测试验证 【声明】文章仅供学习交流&#xff0c;观点代表个人&#xff0c;与任何公司无关。 编辑|SQL和数据库技术(ID:SQLplusDB) 收集Oracle数据库内存相关的信息 【Oracle】ORA-32017和ORA-00384错误…

Linux 常见性能指标 -- 磁盘

本系列记录操作系统常见性能指标&#xff0c;写这个主要是记录也是回顾&#xff0c;笔记很长&#xff0c;拆分了几个部分&#xff0c;本篇记录 磁盘 的性能指标 常见概念 响应时间 简单描述&#xff1a;I/O 请求从发出到收到响应的间隔时间 是衡量磁盘性能的关键指标&#x…

【QT+QGIS跨平台编译】之二:【zlib+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、zlib介绍二、文件下载三、文件分析四、pro文件五、编译实践 一、zlib介绍 zlib是一套通用的解压缩开源库&#xff0c;提供了内存&#xff08;in-memory&#xff09;压缩和解压函数。zlib是一套通用的解压缩开源库&#xff0c;提供了内存&#xff08;in-memory&am…

【小沐学GIS】基于C#绘制三维数字地球Earth(OpenGL)

&#x1f37a;三维数字地球系列相关文章如下&#x1f37a;&#xff1a;1【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第一期2【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第二期3【小沐学GIS】…

DQL基础查询

DQL基础查询 ● DQL&#xff08;Data Query Language&#xff09;数据查询语言查询是使用频率最高的一个操作&#xff0c;可以从一个表中查询数据&#xff0c;也可以从多个表中查询数据。 ● 基础查询语法&#xff1a; select 查询列表 from 表名; ● 特点&#xff1a; 查询…

三、内存分配

1. JVM 简化架构概览 1.1 运行时数据区&#xff08;即内存区域&#xff0c;又称 JVM 内存结构&#xff09; 如上面的 JVM 简化架构图所示&#xff0c;内存区域分为如下五个部分&#xff08;这五个部分统称为运行时数据区&#xff09;&#xff1a; PC 寄存器&#xff08;又称程…