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)
————————————————

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JAVA 学习 面试(二)多线程篇

Java多线程 线程池 线程池原理 创建方式&#xff1a;newFixedThreadPool (固定数目线程的线程池)、newCachedThreadPool(可缓存线程的线程池)、newSingleThreadExecutor(单线程的线程池)、newScheduledThreadPool(定时及周期执行的线程池)、new ThreadPoolExecutor() &#x…

windows 11安装VMware 17 ,VMware安装Ubuntu 20.4

一、下载安装激活VMware 17 下载与激活&#xff1a;Vmware 17 下载地址、最新激活码 2024 _ 注意&#xff1a;安装路径自己选择&#xff0c;路径中尽可能避免中文或空格 二、下载Ubuntu 镜像 下载镜像地址&#xff1a;清华大学开源软件镜像站 点开下载镜像地址&#xff0c;找…

[docker] 关于docker的面试题

docker命名空间 docker与虚拟机的区别 容器虚拟机所有容器共享宿主机的内核每个虚拟机都有独立的操作系统和内核通过namespace实现资源隔离&#xff0c;通过cgroup实现限制资源的最大使用量完全隔离。每个虚拟机都有独立的硬件资源秒级启动速度分钟级启动速度容器相当于宿主机…

如何测试你的 Golang 代码

文章目录 简单概述最易想到的方法一个快速体验案例学会使用 go testing测试的编写规则灵活记忆 API 的使用 实践一个案例简洁紧凑的表组测试详细的日志输出灵活控制运行哪些测试总结参考 不论是开源项目&#xff0c;还是日常程序的开发&#xff0c;测试都是必不可少的一个环节。…

软件测试Fiddler手机抓包iPhone

Fiddler不但可以截获各种浏览器发出的HTTP/HTTPS请求&#xff0c;也可以截获各种移动设备&#xff0c;发出的HTTP/HTTPS请求。最关键的是&#xff0c;Fiddler还可以断点调试&#xff0c;修改Request和Response&#xff0c;而且即便抓包的是IOS设备&#xff0c;这些操作也可以直…

Hive 行列转化 方式总结

行列转换 列转行 使用 lateral view explode(array|map) 或 lateral view inline(array_struct) 可以将列转换为行。 单列转多行&#xff0c;降维&#xff08;单列数组或键值对&#xff09; 示例1&#xff1a;explode(array(…)) select ..., A from T lateral view exp…

C语言——结构体讲解

目录 一、结构体类型的声明 二、结构体变量的定义和初始化 三、结构体的重命名 四、结构体的自引用 五、结构体内存对齐 六、结构体传参 七、结构体实现位段 7.1 什么是位段 7.2 位段的声明和使用 7.3 位段的空间大小计算 7.4 位段的内存分配 7.5 位段的跨平…

wamp集成环境部署

Windows下Apache服务器搭建 第一步&#xff1a;下载Windows下的最新ZIP压缩包 推荐下载网址&#xff1a;http://www.apachelounge.com/download/ 为了让Apache服务器发挥更好的性能&#xff0c;请根据自己的系统选择下载&#xff0c;如果不清楚自己的系统是64位还是32位&am…

x-cmd pkg | frp - 内网穿透工具

简介 frp&#xff08;Fast Reverse Proxy&#xff09;是一个专注于内网穿透的高性能反向代理应用&#xff0c;可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 它采用 C/S 模式&#xff0c;将服务端部署在具有公网 IP 的机器上&#xff0c;客户端部…

企业品牌推广方式,产品推广方法

如何有效推广平台和产品成为了企业不可忽视的重要问题。推广不仅仅是为了提升知名度&#xff0c;更是为了吸引目标受众、促进销售、建立品牌形象。 一、平台推广&#xff1a;构建线上线下双通道 建立专业网站&#xff1a; 企业的网站是线上推广的重要窗口&#xff0c;要确保网…

操作系统【OS】Ch2【大题】 PV题型分类

生产者-消费者问题&#xff1a;生产资源-消费资源理发师问题&#xff1a;服务-被服务读者-写者问题&#xff1a;同类进程不互斥、异类进程互斥哲学家进餐问题&#xff1a;只有一类进程&#xff0c;每个进程需要同时拥有多种资源才能运行单纯的同步问题&#xff1a;前驱后继图 生…

dubbo:服务暴露

节点角色说明&#xff1a; Provider:暴露服务的服务提供方。 Consumer::调用远程服务的服务消费方。 Registry:服务注册与发现的注册中心。 Monitor:统计服务的调用次调和调用时间的监控中心。 Container:服务运行容器。 调用关系说明&#xff1a; 0.服务容器负责启动&#xff…

ubuntu上创建ftp服务器

今天在linux电脑上安装了ftp服务器&#xff0c;中间碰到不少问题&#xff0c;参照各路攻略&#xff0c;修改多次配置后终于完成了服务器搭建 1&#xff1a;安装vsftp服务器 最简答的一步&#xff0c;直接&#xff1a;apt-get install vsftp 安装完成后&#xff0c;查看版本号…

蓝桥杯(C++ 最大开支 优先队列)

优先队列&#xff1a; 蓝桥杯&#xff08;C 整数删除 优先队列 &#xff09;-CSDN博客 思路&#xff1a; 1、每个人依此选择项目&#xff0c;每个人选项目时都&#xff08;选择当下花费增加最多的项目&#xff09;&#xff0c;若项目i的门票价格为kxb&#xff0c;那么增加一个…

机器学习 | 深入理解并掌握核心概念

在如今数字化时代的浪潮下&#xff0c;机器学习已经成为人工智能领域的璀璨明星。它像一面魔镜&#xff0c;赋予计算机系统学习和改进的能力&#xff0c;让机器能够从海量数据中提取规律、预测未来&#xff0c;甚至做出智能决策。本 专栏 将带您踏上机器学习的奇妙之旅&#xf…

机器人学论文——智能施药机器人调研报告

目录 摘 要 Abstract 第一章&#xff1a;引言 1.1研究背景 1.2 研究意义 1.3文章架构 第二章&#xff1a;智能施药机器人发展现状 2.1引言 2.2 大田智能施药机器人发展现状 2.3 果园智能施药机器人发展现状 2.4 设施农业智能施药机器人发展现状 第三章&#xff1a;智能施药机器…

短视频推广方案,新品推广攻略

短视频以其生动、直观的特点吸引了大量用户&#xff0c;成为品牌塑造、产品推广的有效手段。本文将深入解读短视频推广方法&#xff0c;帮助企业在这个充满创意和活力的平台上实现产品的成功推广。 一、抓住用户注意力的前奏&#xff1a;创意内容制作 引人入胜的开篇&#xff…

打家劫舍系列(三合一)(动态规划)

本篇博客讲解一下动态规划的打家劫舍系列&#xff0c;对应的力扣题目分别是198. 打家劫舍&#xff0c;213. 打家劫舍 II&#xff0c;337. 打家劫舍 III 198. 打家劫舍&#xff1a; 题目&#xff1a; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的…

关于C#中的HashSet<T>与List<T>

HashSet<T> 表示值的集合。这个集合的元素是无须列表&#xff0c;同时元素不能重复。由于这个集合基于散列值&#xff0c;不能通过数组下标访问。 List<T> 表示可通过索引访问的对象的强类型列表。内部是用数组保存数据&#xff0c;不是链表。元素可重复&#xf…

【数据结构】快速排序,归并排序

快速排序 1.hoare版本 根据动图的演示&#xff0c;整理的思路如下&#xff0c; 1.定义left,right,key。key默认是左边第一个元素&#xff0c;像两个指针&#xff0c;左边找比key大的&#xff0c;右边找比k小的&#xff0c;找到的话&#xff0c;交换二者&#xff0c;往返这个过…