首先创建一个项目,

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

建基础通用文件夹,

创建一个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.



















