༺༽༾ཊ—Unity之-04-原型模式—ཏ༿༼༻

首先创建一个项目,

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

建基础通用文件夹,

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

任务1:使用 建造者模式 创建三种 金刚猿猴 零部件 拼接组合

首先资源商店下载 金刚猿猴 模型,

将资源对象拖拽至场景并完全解压缩,

将金刚组件拆分为三份重命名为Ape1-3放进自己的预制体包Prefabs并在场景中删除,

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

using UnityEngine;
public class Ape{
    public GameObject ApeBody{ get;set; }
}

2.【抽象建造类】:

public abstract class AbsBuildApe{
    public abstract void SetApeBody();
    public abstract Ape GetApe();
}

3.【建造具体类】:

using UnityEngine;
public class BuildApeA : AbsBuildApe{
    Ape _ape;
    public BuildApeA(Ape ape){
        _ape = ape;
    }
    public override void SetApeBody(){
        _ape.ApeBody = Resources.Load<GameObject>("Prefabs/ape1");
        if (_ape.ApeBody != null)
            GameObject.Instantiate(_ape.ApeBody, new Vector3(0, 0, 0), Quaternion.identity);
    }
    public override Ape GetApe(){
        return _ape;
    }
}

4.【指挥者类】:

public class Director{
    public AbsBuildApe _type;
    public Director(AbsBuildApe type){
        _type = type;
    }
    public void GetApeBody(){
        _type.SetApeBody();
    }
}

5.【主类】

using UnityEngine;
public class Main : MonoBehaviour{
    void Start(){
        Ape ape = new Ape();
        //里氏替换
        AbsBuildApe type = new BuildApeA(ape);
        Director d1 = new Director(type);
        d1.GetApeBody();
    }
}

修改代码:

public abstract class AbsBuildApe{
    public abstract void SetApeBody();
    public abstract void SetApeBody1();
    public abstract Ape GetApe();
}

修改代码:

using UnityEngine;
public class BuildApeA : AbsBuildApe{
    Ape _ape;
    public BuildApeA(Ape ape){
        _ape = ape;
    }
    public override void SetApeBody(){
        _ape.ApeBody = Resources.Load<GameObject>("Prefabs/ape1");
        if (_ape.ApeBody != null)
            GameObject.Instantiate(_ape.ApeBody, new Vector3(0, 0, 0), Quaternion.identity);
    }
    public override Ape GetApe(){
        return _ape;
    }
    public override void SetApeBody1(){
        _ape.ApeBody = Resources.Load<GameObject>("Prefabs/ape2");
        if (_ape.ApeBody != null) {
            // 设置旋转角度,例如绕y轴旋转90度
            Quaternion rotation = Quaternion.Euler(-90, 0, 0);
            // 实例化物体并设置位置和旋转
            GameObject.Instantiate(_ape.ApeBody, new Vector3(0.5f, 0.5f, -0.38f), rotation);
        }
    }
}

修改代码:

public class Director{
    public AbsBuildApe _type;
    public Director(AbsBuildApe type){
        _type = type;
    }
    public void GetApeBody(){
        _type.SetApeBody();
    }
    public void GetApeBody1() {
        _type.SetApeBody1();
    }
}

修改代码:

运行即可完成 建造者模式任务,

下面搭配原型模式进行修改代码:

【解析】通常对于这种比较繁琐复杂的建造者模式好不容易建造了一个金刚类型,如果再有需要,再次使用建造者模式还会如此麻烦,为了用简单的方式实现,需要配合原型模式,让这个复杂的类完成自我复制,也就是说在这个复杂的类中按一个原型方法,让这个类可以自我复制,

修改代码:

using UnityEngine;
public class Ape {
    public GameObject ApeBody { get; set; }
    public Ape(GameObject apeBody){
        ApeBody = apeBody;
    }
    public Ape Clone(){
        GameObject clonedApeBody = null;
        if (ApeBody != null)
            clonedApeBody = GameObject.Instantiate(ApeBody);
        return new Ape(clonedApeBody);
    }
}

修改代码:

public abstract class AbsBuildApe{
    public abstract void SetApeBody();
    public abstract void SetApeBody1();
    public abstract Ape GetApe();
    public abstract void SetApeBody2();
}

using UnityEngine;
public class BuildApeA : AbsBuildApe{
    Ape _ape;
    public BuildApeA(Ape ape){
        _ape = ape;
    }
    public override void SetApeBody(){
        _ape.ApeBody = Resources.Load<GameObject>("Prefabs/ape1");
        if (_ape.ApeBody != null)
            GameObject.Instantiate(_ape.ApeBody, new Vector3(0, 0, 0), Quaternion.identity);
    }
    public override Ape GetApe(){
        return _ape;
    }
    public override void SetApeBody1(){
        _ape.ApeBody = Resources.Load<GameObject>("Prefabs/ape2");
        if (_ape.ApeBody != null) {
            // 设置旋转角度,例如绕y轴旋转90度
            Quaternion rotation = Quaternion.Euler(-90, 0, 0);
            // 实例化物体并设置位置和旋转
            GameObject.Instantiate(_ape.ApeBody, new Vector3(0.5f, 0.5f, -0.38f), rotation);
        }
    }
    public override void SetApeBody2(){
        _ape.ApeBody = Resources.Load<GameObject>("Prefabs/ape3");
        if (_ape.ApeBody != null)
            GameObject.Instantiate(_ape.ApeBody, new Vector3(1, 0, 0), Quaternion.identity);
    }
}

修改代码:

using System;
public class Director : ICloneable{
    public AbsBuildApe _type;
    public Director(AbsBuildApe type){
        _type = type;
    }
    public object Clone(){
        // 调用 AbsBuildApe 类的 Clone 方法
        return _type.GetApe().Clone();
    }
    public void GetApeBody(){
        _type.SetApeBody();
    }
    public void GetApeBody1() {
        _type.SetApeBody1();
    }
    public void GetApeBody2(){
        _type.SetApeBody2();
    }
}
修改代码:

运行项目即用原型模式实现了 金刚的自我复制 ,即与建造者模式的结合

End.

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

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

相关文章

上位机图像处理和嵌入式模块部署(二进制图像的读写)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 之前我们说过&#xff0c;对于图像处理而言&#xff0c;势必会涉及到文件的读写。但是不同格式文件的读写&#xff0c;这本身又是体力活&#xff0…

vue yarn certificate has expired

背景&#xff1a;我在用ant design pro框架进行初始化时&#xff0c;安装脚手架时&#xff0c;安装yarn时显示报错 原因分析&#xff1a;查了很久的资料&#xff0c;这种情况应该是开了服务器代理访问导致ssl安全证书失效了 解决办法&#xff1a; 在终端输入&#xff1a;yarn…

【2024.2.1练习】01迷宫

题目描述 题目思路 一开始想用动态规划&#xff0c;但是这道题没有明显的顺序性和递推关系可以找&#xff0c;起点也是自定义的&#xff0c;鉴于迷宫尺寸不大&#xff0c;考虑使用DFS或BFS。 在自己推算几遍后发现&#xff0c;假设可以在地图上畅通无阻&#xff0c;那么格子只…

书签管理和稍后阅读工具Readeck

什么是 Readeck ? Readeck 是一个简单的 Web 应用程序&#xff0c;可让您保存您喜欢并希望永久保留的网页的宝贵可读内容。将其视为书签管理器和稍后阅读工具。 网络上的内容每天都会消失。很可能您几个月前偶然发现的一篇文章或图片现在已经消失了。当您在 Readeck 中保存某些…

运维SRE-02 正则表达式、grep

1.特殊符号补充 1.1位置相关的特殊符号 . 当前目录 .. 当前目录的上级目录 ~ 当前用户家目录 / 根目录 cd - 返回上次所在目录1.2熟练掌握 # 注释符号,root命令提示符 | 管道符号.1.3了解其他特殊符号 $ 取值(取出变量的值),普通用户的提示符 ! % ^ & * (){} [] ; ? \…

Quick BI中lod函数之lod_fixed

一、lod函数简介 LOD函数的全称是详细级别表达式&#xff08;Level Of Detail Expressisons&#xff09;。它主要是为了克服一些表达式之间计算颗粒度不一致的问题。比如&#xff0c;要计算第一季度各月销售收入占比&#xff0c;这里分子计算颗粒度为’月’&#xff0c;但是分…

2024年美国大学生数学建模D题思路分析 - 大湖区水资源问题

# 1 赛题 问题D&#xff1a;大湖区水资源问题 背景 美国和加拿大的五大湖是世界上最大的淡水湖群。这五个湖泊和连接的水道构成了一个巨大的流域&#xff0c;其中包含了这两个国家的许多大城市地区&#xff0c;气候和局部天气条件不同。 这些湖泊的水被用于许多用途&#xff…

TypeScript 学习笔记(Day4)

「写在前面」 本文为 b 站黑马程序员 TypeScript 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. TypeScript 学习笔记&#xff08;Day1&#xff09; 2. TypeScript 学习笔…

大力说视频号第三课:手把手教你视频号如何认证

视频号生态不断完善&#xff0c;越来越多的创作者认识到视频号认证的重要性。微信视频号认证不但能提升搜索排名&#xff0c;还能直播推流、与企业微信的关联等优势。 今天大力就来向大家介绍一下视频号如何做认证。 01 个人认证 个人认证又包括兴趣认证和职业认证。 A、兴趣…

基于Java SSM框架实现校园快领服务系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现校园快领服务系统演示 摘要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于校园快领服务系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了…

保姆级的指针详解(超详细)

目录 一.内存和地址  1.初识指针 2.如何理解编址 二. 指针变量 三.指针的解引用操作符 1.指针变量的大小 四.指针变量类型的意义 五.指针的运算 1.指针加减整数 2.指针减指针 3.野指针 3.1指针未初始化 3.2指针越界访问 3.3指针指向的空间被提前释放 3.4如何规…

Rust学习之Features

Rust学习之Features 一 什么是 Features二 默认 feature三 简单的features应用示例四 可选(optional)的依赖五 依赖的特性5.1 在依赖表中指定5.2 在features表中指定 六 命令行中特性控制七 特性统一路径八 其它8.1 相互排斥特性8.2 观察启用特性8.3 [Feature resolver version…

从源码角度透视QTcpServer:解构QTcpServer的底层原理与技术细节

深入了解QTcpServer的底层原理和技术细节 一、背景二、QTcpServer的基本原理2.1、TCP协议简介2.2、QTcpServer的概念 三、QTcpServer源码解析3.1、QTcpServer的构造函数3.2、调用listen函数启动tcpserver3.3、QSocketNotifier的实现 总结 一、背景 QTcpServer是Qt网络模块中的…

花瓣网美女图片爬取

爬虫基础案例01 花瓣网美女图片 网站url&#xff1a;https://huaban.com 图片爬取 import requests import json import os res requests.get(url "https://api.huaban.com/search/file?text%E7%BE%8E%E5%A5%B3&sortall&limit40&page1&positionsear…

『C++成长记』string使用指南

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;C &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、string类介绍 二、string类的常用接口说明 &#x1f4d2;2.1string类对象的常…

数据结构+算法(第10篇):叉堆“功夫熊猫”的速成之路

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

Elasticsearch:集群故障排除和优化综合指南

Elasticsearch 是一个强大的搜索和分析引擎&#xff0c;是许多数据驱动应用程序和服务的核心。 它实时处理、分析和存储大量数据的能力使其成为当今快节奏的数字世界中不可或缺的工具。 然而&#xff0c;与任何复杂的系统一样&#xff0c;Elasticsearch 可能会遇到影响其性能和…

【ACL 2023】Enhancing Document-level EAE with Contextual Clues and Role Relevance

【ACL 2023】Enhancing Document-level Event Argument Extraction with Contextual Clues and Role Relevance 论文&#xff1a;https://aclanthology.org/2023.findings-acl.817/ 代码&#xff1a;https://github.com/LWL-cpu/SCPRG-master Abstract 与句子级推理相比&…

linux中的静态库和共享库

库&#xff1a;库是二进制文件&#xff0c;是源代码文件的另一种表现形式&#xff0c;是加了密的源代码&#xff1b;是一些功能相近或者相似函数的集合体 库的使用&#xff1a; 头文件--包含了库函数的声明 库文件--包含了库函数的代码实现 注意&#xff1a;库不能单独使用…

应用智能家居领域中的低功耗蓝牙模块

智能家居&#xff08;smart home, home automation&#xff09;是以住宅为平台&#xff0c;利用综合布线技术、网络通信技术、 安全防范技术、自动控制技术、音视频技术将家居生活有关的设施集成&#xff0c;构建高效的住宅设施与家庭日程事务的管理系统&#xff0c;提升家居安…