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

相关推荐
gc_22991 小时前
学习C#调用OpenXml操作word文档的基本用法(20:学习嵌入文件类)
c#·word·openxml·嵌入文档
玩泥巴的1 小时前
如何实现一套.net系统集成多个飞书应用
c#·.net·二次开发·飞书
ghie90901 小时前
基于C#实现俄罗斯方块游戏
开发语言·游戏·c#
开开心心就好1 小时前
免费抽奖工具支持批量导入+自定义主题
linux·运维·服务器·macos·pdf·phpstorm·1024程序员节
ccut 第一混1 小时前
C# 基于 RS485 与设备通讯(以照度计为例子)
c#·rs485
贾修行2 小时前
.NET 全栈开发学习路线:从入门到分布式
c#·.net·wpf·asp.net core·web api·winforms·services
无风听海2 小时前
C# 中的 LinkedList
开发语言·c#
chen_2273 小时前
kanzi节点转换插件
c#·kanzi
PfCoder3 小时前
WinForm真入门(22)---定时器控件System.Windows.Forms.Timer
windows·c#·.net·timer