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

相关推荐
浮游本尊3 天前
对象、函数、原型之间的关系
开发语言·javascript·原型模式
越甲八千3 天前
重拾设计模式--原型模式
设计模式·原型模式
小嘟嚷ovo3 天前
String.prototype.padStart() 方法来实现日不足两位时补充零
原型模式
抓哇FullStack-Junior5 天前
设计模式——原型模式
java·开发语言·设计模式·原型模式
shi57835 天前
设计模式之 原型模式 C# 范例
设计模式·c#·原型模式
会思想的苇草i7 天前
JavaScript--原型与原型链
开发语言·前端·javascript·设计模式·原型·原型模式·原型链
tester Jeffky9 天前
JavaScript 原型对象与原型链的魔法与艺术
开发语言·javascript·原型模式
橘子味的冰淇淋~10 天前
js 怎么判断对象是否具有某个属性及各方法的区别
原型模式
犬余10 天前
设计模式之原型模式:深入浅出讲解对象克隆
笔记·学习·设计模式·原型模式
西岭千秋雪_11 天前
设计模式の单例&工厂&原型模式
java·单例模式·设计模式·简单工厂模式·工厂方法模式·抽象工厂模式·原型模式