设计模式02———建造者模式 c#

首先我们打开一个项目

在这个初始界面我们需要做一些准备工作

建基础通用包

创建一个Plane 重置后 缩放100倍 加一个颜色

更换天空盒(个人喜好)

任务:使用【UI】点击生成6种车零件组装不同类型车 【建造者模式】

首先资源商店下载车模型

将Car导入资源拖拽至场景 将导入包放进WBag外包方便整理

将Car完全解压缩 为了取出小车各部分零件 方便我们组装车

拆分第一个组件 车体 命名为CarBody 放进预制体包Prefabs

删除场景中的 CarBody

拆分第二个组件 车座命名为 CarShadle

将剩余物体 设置 成空父物体的子物体 作为一个整体 命名为 CarWheels

准备工作做完后    接下我们做【建造者模式】

建造者模式属于23设计模式中的一种 是一种创建型模式

通常是为了 通过多种组件 由指挥者 拼装出 多种不同所需产品 

建造者模式最低需要四个类就可以完成加上Main类中调用需要五个

首先需要         【产品类】

其实需要         【抽象建造类】

再其次需要     【建造具体类】

再再其次需要 【指挥者类】

最后我们通过Main继承Mono挂载再脚本上调用即可

实现:

1.创建脚本【产品类】:

using UnityEngine;
public class Car{
    public GameObject CarPart {
        get;
        set;
    }
}

2.【抽象建造类】:

public abstract class IBuildCar{
    public abstract void SetCarBody();
    public abstract Car GetCar();
}

3.【建造具体类】:

using UnityEngine;
public class BuildCarA : IBuildCar{
    Car car;
    public BuildCarA(Car car){
        this.car = car;
    }
    public override void SetCarBody(){
        car.CarPart = Resources.Load<GameObject>("Prefabs/CarBody");
        if(car.CarPart != null)
            GameObject.Instantiate(car.CarPart,new Vector3(0,0,0),Quaternion.identity);
    }
    public override Car GetCar(){
        return car;
    }
}

4.【指挥者类】:

public class Director{
    public IBuildCar type;
    public Director(IBuildCar type){
        this.type = type;
    }
    public void GetCarBody() {
        type.SetCarBody();
    }
}

5.【控制挂载类】

using UnityEngine;
public class Main : MonoBehaviour{
    private void Start(){
        Car car = new Car();
        //里氏替换
        IBuildCar type = new BuildCarA(car);
        Director d1 = new Director(type);
        d1.GetCarBody();
    }
}

我们回到unity场景中创建一个空物体改名Obj 重置位置 将Main脚本挂载

运行即可生成

接下来我们利用UI + 事件 控制【建造者模式】

1.【产品类】 不动代码

2.【抽象建造类】        不动代码

3.【建造具体类】        修改代码:

using UnityEngine;
public class BuildCarA : IBuildCar{
    //按钮计数器
    int count = 0;
    Car car;
    public BuildCarA(Car car){
        this.car = car;
    }
    public override void SetCarBody(){
        count++;
        car.CarPart = Resources.Load<GameObject>("Prefabs/CarBody");
        if(car.CarPart != null && count % 2 != 0)
            GameObject.Instantiate(car.CarPart,new Vector3(0,1,0),new Quaternion(0,10,10,0));
    }
    public override Car GetCar(){
        return car;
    }
}
4.【指挥者类】      不动代码

5.【控制挂载类】  修改代码:

using UnityEngine;
using UnityEngine.UI;
public class Main : MonoBehaviour{
    //开放Button按钮
    public Button setCarBodyButton;
    //按钮计数器
    int count = 0;
    private void Start(){
        Car car = new Car();
        //里氏替换
        IBuildCar type = new BuildCarA(car);
        Director d1 = new Director(type);
        setCarBodyButton.onClick.AddListener(() => d1.GetCarBody());
    }
    public void DestroyCarBody(){
        if (count % 2 == 0)
            Destroy(GameObject.Find("CarBody(Clone)"));
    }
}
我们回到unity场景中创建button     【做一个折叠按钮】

ctrl + d复制 Button

将未开启的Button 改名为 Close 开启的Button改名为 open

修改Panel尺寸

新建Button 作为 创建车体的按钮 改名为 ButtonA

开启 按钮事件:

将Obj 拖拽至 框选栏 并选择

选择我们脚本代码中自定义的函数

最后将ButtonA 代码 绑定在 Main中

运行

点击ButtonA 按钮

再点消失

关闭选项

 目前已完成

如果想在建造其他组件则需要:

1.【产品类】               不动代码

2.【抽象建造类】        增加代码:

public abstract class IBuildCar{
    public abstract void SetCarBody();
    public abstract void SetCarWheels();
    public abstract Car GetCar();
}
3.【建造具体类】        增加代码:

using UnityEngine;
public class BuildCarA : IBuildCar{
    //按钮计数器
    int count = 0;
    Car car;
    public BuildCarA(Car car){
        this.car = car;
    }
    public override void SetCarBody(){
        count++;
        car.CarPart = Resources.Load<GameObject>("Prefabs/CarBody");
        if(car.CarPart != null && count % 2 != 0)
            GameObject.Instantiate(car.CarPart,new Vector3(-14,1,0),new Quaternion(0,10,10,0));
    }
    public override void SetCarWheels()
    {
        count++;
        car.CarPart = Resources.Load<GameObject>("Prefabs/CarWheels");
        if (car.CarPart != null && count % 2 != 0)
            GameObject.Instantiate(car.CarPart, new Vector3(-14, 0.24f, 25.29f), Quaternion.identity);
    }
    public override Car GetCar(){
        return car;
    }
}

4.【指挥者类】      增加代码:

public class Director{
    public IBuildCar type;
    public Director(IBuildCar type){
        this.type = type;
    }
    public void GetCarBody() {
        type.SetCarBody();
    }
    public void GetCarWheels()
    {
        type.SetCarWheels();
    }
}

5.【控制挂载类】  增加代码:

using UnityEngine;
using UnityEngine.UI;
public class Main : MonoBehaviour{
    //开放Button按钮
    public Button setCarBodyButton;
    public Button setCarWheelsButton;
    //按钮计数器
    int count = 0;
    private void Start(){
        Car car = new Car();
        //里氏替换
        IBuildCar type = new BuildCarA(car);
        Director d1 = new Director(type);
        setCarBodyButton.onClick.AddListener(() => d1.GetCarBody());
        setCarWheelsButton.onClick.AddListener(() => d1.GetCarWheels());
    }
    public void DestroyCarBody(){
        if (count % 2 == 0)
            Destroy(GameObject.Find("CarBody(Clone)"));
    }
    public void DestroyCarWheels()
    {
        if (count % 2 == 0)
            Destroy(GameObject.Find("CarWheels(Clone)"));
    }
}
回到unity场景中   重复事件操作即可完成运行

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

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

相关文章

高效团队协作软件推荐:提升工作效率的优选方案!

使用团队协作软件有什么好处&#xff1f;可以摆脱过时的电子表格&#xff0c;有了单一的真实来源&#xff0c;您可以随时检查任何任务并获得可用的最新信息。 一目了然地查看所有正在进行的工作&#xff0c;看板式面板、甘特图和燃尽图等可视化工具可让您随时轻松获得项目的高级…

【web实现右侧弹窗】JS+CSS如何实现右侧缓慢弹窗动态效果『附完整源码下载』

文章目录 写在前面涉及知识点页面效果1、页面DOM创建1.1创建底层操作dom节点1.2 创建存放弹窗dom节点 2、页面联动功能实现&#xff08;关闭与弹出&#xff09;2.1 点击非右侧区域实现关闭2.2 点击叉叉及关闭按钮实现关闭功能 3、完整源码包下载3.1百度网盘3.2 123云盘3.3邮箱留…

HDMI 基于 4 层 PCB 的布线指南

HDMI 基于 4 层 PCB 的布线指南 简介 HDMI 规范文件里面规定其差分线阻抗要求控制在 100Ω 15%&#xff0c;其中 Rev.1.3a 里面规定相对放宽了一些&#xff0c;容忍阻抗失控在 100Ω 25%范围内&#xff0c;不要超过 250ps。 通常&#xff0c;在 PCB 设计时&#xff0c;注意控…

【深度学习实验】循环神经网络(一):循环神经网络(RNN)模型的实现与梯度裁剪

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 数据处理 2. rnn 测试 3. grad_clipping 4. 代码整合 经验是智慧之父&#xff0c;记忆是智慧之母。 ——谚语 一、实验介绍 本实验介绍了一个简单的循环神经网络…

排序算法——选择排序

一、介绍&#xff1a; 选择排序就是按照一定的顺序从选取第一个元素索引开始&#xff0c;将其储存在一个变量值中&#xff0c;根据排序规则比较后边每一个元素与这个元素的大小&#xff0c;根据排序规则需要&#xff0c;变量值的索引值进行替换&#xff0c;一轮遍历之后&#x…

通用监控视频web播放方案

业务场景 对接监控视频&#xff0c;实现海康大华等监控摄像头的实时画面在web端播放 方案一&#xff0c;使用 RTSP2webnode.jsffmpeg 说明&#xff1a;需要node环境&#xff0c;原理就是RTSP2web实时调用ffmpeg解码。使用单独html页面部署到服务器后&#xff0c;在项目中需要播…

Element组件案例 Vue路由 前端打包部署步骤

目录 Element组件案例案例需求与分析环境搭建整体布局顶部标题左侧导航栏核心-右侧导航栏表格编写表单编写分页工具栏编写 异步数据加载异步加载数据性别展示修复图片展示修复 Vue路由Vue路由简介Vue路由入门 打包部署前端工程打包部署前端工程nginx介绍部署 Element组件案例 …

云原生Kubernetes:K8S集群版本升级(v1.20.6 - v1.20.15)

目录 一、理论 1.K8S集群升级 2.集群概况 3.升级集群 4.验证集群 二、实验 1.升级集群 2.验证集群 三、问题 1.给node1节点打污点报错 一、理论 1.K8S集群升级 &#xff08;1&#xff09;概念 搭建K8S集群的方式有很多种&#xff0c;比如二进制&#xff0c;kubeadm…

把短信验证码储存在Redis

校验短信验证码 接着上一篇博客https://blog.csdn.net/qq_42981638/article/details/94656441&#xff0c;成功实现可以发送短信验证码之后&#xff0c;一般可以把验证码存放在redis中&#xff0c;并且设置存放时间&#xff0c;一般短信验证码都是1分钟或者90s过期&#xff0c;…

Redis 新手必读。这篇文章是学 Redis 的捷径。

Redis 简介Redis 优势Redis 数据类型基本命令发布订阅订阅者的客户端显示如下事务持久化复制哨兵分片 Redis 简介 Redis 是完全开源免费的&#xff0c;遵守 BSD 协议&#xff0c;是一个高性能的 key - value 数据库 Redis 与 其他 key - value 缓存产品有以下三个特点&#…

RAMday9

设置按键中断&#xff0c;按键1按下&#xff0c;LED亮&#xff0c;再按一次,灭&#xff1b;按键2按下&#xff0c;蜂鸣器响&#xff0c;再按一次&#xff0c;不响&#xff1b;按键3按下&#xff0c;风扇转,再按一次,风扇停 代码 do_irq.c #include "key.h" extern…

网工内推 | 技术支持工程师,厂商公司,HCIA即可,有带薪年假

01 华为终端有限公司 招聘岗位&#xff1a;初级技术支持 职责描述&#xff1a; 1、通过远程方式处理华为用户在产品使用过程中各种售后问题&#xff1b; 2、收集并整理消费者声音&#xff0c;提供服务持续优化建议&#xff1b; 3、对服务中发现的热点、难点问题及其他有可能造…

PTA 7-5 令人抓狂的四则运算

题目 曾记否&#xff0c;我们小学时&#xff0c;遇到这种四则运算&#xff0c;心情是抓狂的&#xff1a; 那么当我们学会使用计算机&#xff0c;自然是要程序去完成这个工作啦~ 现在请对输入的四则运算求值。注意&#xff1a; 四则运算表达式必定包含运算数&#xff0c;还可能…

记一次惊险的CDH6.3.2集群断电后重启的过程

重启服务 systemctl restart cloudera-scm-server.service systemctl restart cloudera-scm-agent.service查看服务是否启动&#xff0c;显然结果是failed systemctl status cloudera-scm-server.service查看异常 journalctl -xe去看服务日志 发现是这个位置错误 SqlExcep…

使用 Eziriz .NET Reactor 对c#程序加密

我目前测试过好几个c#加密软件。效果很多时候是加密后程序执行错误&#xff0c;或者字段找不到的现象 遇到这个加密软件用了一段时间都很正常&#xff0c;分享一下使用流程 破解版本自行百度。有钱的支持正版&#xff0c;我用的是 Eziriz .NET Reactor 6.8.0 第一步 安装 Ezi…

35道Rust面试题

这套Rust面试题包括了填空题、判断题、连线题和编码题等题型。 选择题 1 &#xff0c;下面哪个是打印变量language的正确方法&#xff1f; A&#xff0c;println("{}", language); B&#xff0c;println(language); C&#xff0c;println!("{}", langu…

Vue-2.3v-model原理

原理&#xff1a;v-model本质上是一个语法糖&#xff0c;例如应用在输入框上&#xff0c;就是value属性和input事件的合写。 作用&#xff1a;提供数据的双向绑定 1&#xff09;数据变&#xff0c;视图跟着变:value 2&#xff09;视图变&#xff0c;数据跟着变input 注意&a…

RabbitMQ详细使用

工作队列 注意事项&#xff1a;一个消息只能被处理一次&#xff0c;不可以处理多次 轮询分发信息 消息应答 消费者在接收到消息并且处理该消息之后&#xff0c;告诉rabbitmq它已经处理了&#xff0c;rabbitmq可以把该消息删除了。倘若mq没有收到应答&#xff0c;mq会将消息转…

微信小程序 movable-view 控制长按才触发拖动 轻轻滑动页面正常滚动效果

今天写 movable-areamovable-view遇到了个头疼的问题 那就是 movable-view 监听了用户拖拽自己 但 我们小程序 上下滚动页面靠的也是拖拽 也就是说 如果放在这里 用户拖动 movable-view部分 就会永远触发不了滚动 那么 我们先可以 加一个 bindlongpress"longpressHandler…

FHRP首跳冗余的解析

首跳冗余的解析 个人简介 HSRP hot standby router protocol 热备份路由协议 思科设备上 HSRP VRRP 华为设备上 VRRP HSRP v1 version 1 HSRP v2 version 2 虚拟一个HSRP虚拟IP地址 192.168.1.1 开启HSRP的抢占功能 通过其他参数 人为调整谁是主 谁是从 &a…