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

相关推荐
HH牛码2 小时前
C# 中 Array、ArrayList 和 List 的比较
开发语言·c#
HH牛码2 小时前
C#学生管理系统 进阶(通过接口,继承接口的类,实现接口约束_对List中存储的数据进行排列)
c#
吾与谁归in3 小时前
C#实现本地Deepseek模型及其他模型的对话
人工智能·c#·wpf·deepseek
子蛟7 小时前
Get a free SSL certificate interface.
c#·ssl
IT学长编程11 小时前
计算机毕业设计 基于SpringBoot的智慧社区管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·后端·毕业设计·课程设计·论文笔记·1024程序员节
一只蜗牛儿11 小时前
C# 版 OpenCV:OpenCVSharp 最详细最全面教程(万字详细总结)
开发语言·opencv·c#
学海无涯,行者无疆11 小时前
使用Jenkins实现Windows服务器下C#应用程序发布
windows·c#·jenkins·.net·cicd·自动发布·一键发布
tnnnnt13 小时前
今天锐评一下C#
开发语言·c#
Sator114 小时前
C#与AI的交互(以DeepSeek为例)
ai·语言模型·c#
玩c#的小杜同学16 小时前
从“Switch-case“到“智能模式“:C#模式匹配的终极进化指南
开发语言·前端·c#·.net