༺༽༾ཊ—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.

相关推荐
SmalBox1 天前
07-02-打包系统-压缩与加密策略
unity3d·游戏开发
甲维斯1 天前
白嫖Tripo3D ?Kimi 3D Make可以玩起来!
人工智能·unity3d
SmalBox2 天前
07-01-打包系统-资源分组策略
unity3d·游戏开发
SmalBox3 天前
06-04-源码-加密解密服务
unity3d·游戏开发
音视频牛哥3 天前
大牛直播SDK(SmartMediaKit)iOS平台Unity3D RTSP/RTMP播放器集成实践
音视频·unity3d·ios rtmp播放器·ios rtsp播放器·ios unity3d播放器·ios unity rtsp·ios unity rtmp
Behavior4 天前
16天,他用Opus 5.5把《小王子》做成3D游戏,书里的星球能逛了
aigc·unity3d·游戏开发
SmalBox4 天前
06-03-源码-下载系统(DownloadSystem)
unity3d·游戏开发
SmalBox5 天前
06-02-源码-内置文件系统实现
unity3d·游戏开发
SmalBox6 天前
06-01-源码-文件系统体系(IFileSystem)
unity3d·游戏开发
程序边界6 天前
一台数据集成软件的拆解笔记(上):把 KFS 装起来、跑起来,再挑一堆毛病
笔记·原型模式