༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻

首先创建一个项目,

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

建基础通用文件夹,

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

任务:使用 抽象工厂模式 创建 人物与宠物 模型,

首先资源商店下载 人物与宠物 模型,

拖拽至场景中,并完全解压缩

重命名为Role1放进自己的预制体包Prefabs后在场景中删除,

同样手法下载宠物模型最后放进自己的预制体包Prefabs中,

接下来编写代码:

1.创建脚本【抽象产品类之人物类】

双击AbsRole.cs编写代码:

using UnityEngine;

public abstract class AbsRole{

public GameObject Role { get; set; }

public abstract void Load();

}

2.创建脚本【具体产品类之人物类】

双击RoleA.cs编写代码:

using UnityEngine;

public class RoleA : AbsRole{

public override void Load(){

Role = Resources.Load<GameObject>("Prefabs/role1");

if (Role != null)

Role = GameObject.Instantiate(Role, new Vector3(0, 0, 0), Quaternion.identity);

}

}

3.创建脚本【抽象工厂类】

public abstract class AbstractFactory{

public abstract AbsRole GetRole(string type);

}

public class Factory : AbstractFactory{

public override AbsRole GetRole(string type){

AbsRole role;

switch (type){

case "RoleA":

role = new RoleA();

break;

default:

role = null;

break;

}

return role;

}

}

4.创建脚本【主类】

using UnityEngine;

public class Main : MonoBehaviour{

public AbsRole role;

public string type;

void Start(){

AbstractFactory roleFactory = new Factory();

role = roleFactory.GetRole("RoleA");

if (role != null)

role.Load();

else

Debug.LogError("空引用");

}

}

回到unity中将主类Main类挂载在地面上Plane,

运行即生成,

接下来添加宠物类,抽象工厂真正用到的地方,

创建脚本:

using UnityEngine;

public abstract class AbsPet{

public GameObject Pet { get; set; }

public abstract void Load();

}

创建脚本:

using UnityEngine;

public class PetA : AbsPet{

public override void Load(){

Pet = Resources.Load<GameObject>("Prefabs/pet1");

if (Pet != null)

Pet = GameObject.Instantiate(Pet, new Vector3(3, 0, 0), Quaternion.identity);

}

}

修改脚本:

public abstract class AbstractFactory{

public abstract AbsRole GetRole(string type);

public abstract AbsPet GetPet(string type);

}

修改脚本:

public class Factory : AbstractFactory{

public override AbsPet GetPet(string type){

AbsPet pet;

switch (type){

case "PetA":

pet = new PetA();

break;

default:

pet = null;

break;

}

return pet;

}

public override AbsRole GetRole(string type){

AbsRole role;

switch (type){

case "RoleA":

role = new RoleA();

break;

default:

role = null;

break;

}

return role;

}

}

修改主类:

using UnityEngine;

public class Main : MonoBehaviour{

public AbsRole role;

public AbsPet pet;

public string type;

void Start(){

AbstractFactory roleFactory = new Factory();

role = roleFactory.GetRole("RoleA");

if (role != null)

role.Load();

else

Debug.LogError("人物空引用");

AbstractFactory petFactory = new Factory();

pet = petFactory.GetPet("PetA");

if (pet != null)

pet.Load();

else

Debug.LogError("宠物空引用");

}

}

运行项目即完成,

End.

相关推荐
UIU1143 小时前
同一个变量在两个 .c 文件里类型不一致,程序会怎样?
c++·学习·c#
波力海苔夹心脆67514 小时前
C# 值类型与引用类型详解:存储位置、赋值机制、参数传递、相等比较、装箱拆箱与常见陷阱
开发语言·jvm·经验分享·笔记·c#·.net
估值探索者14 小时前
【Python量化策略实战 #02】多因子合成mom和vol两因子打分合成
开发语言·c++·python·数据挖掘·c#
淡海水1 天前
01-04-认知篇-Unity内存全景
unity·c#·游戏引擎·.net·gc
淡海水2 天前
01-03-认知篇-C#内存模型深度解析
unity·c#·游戏引擎·.net·gc
拔剑纵狂歌2 天前
ClickHouse system.query_log 字段详解与排障实践
后端·clickhouse·1024程序员节
lzhdim2 天前
C#不为人知的10个魔法特性:资深开发者也会震惊的底层奥秘
java·前端·javascript·算法·c#
前端 贾公子2 天前
LangChain核心组件 == 提示词(Prompts)
开发语言·c#
码艺-Alimjan2 天前
Web 网站打包桌面应用的另一种方式,超级简单(C# exe 33Kb)
开发语言·前端·c#
海天鹰2 天前
C#入门:显示窗口
c#