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

首先创建一个项目,

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第1张图片

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

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第2张图片

建基础通用文件夹,

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第3张图片

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

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第4张图片

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第5张图片

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

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

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第6张图片

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第7张图片

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

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第8张图片

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

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第9张图片

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

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第10张图片

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第11张图片

接下来编写代码:

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

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第12张图片

双击AbsRole.cs编写代码:

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第13张图片

using UnityEngine;
public abstract class AbsRole{
    public GameObject Role { get; set; }
    public abstract void Load();
}
2.创建脚本【具体产品类之人物类】

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第14张图片

双击RoleA.cs编写代码:

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第15张图片

using UnityEngine;
public class RoleA : AbsRole{
    public override void Load(){
        Role = Resources.Load("Prefabs/role1");
        if (Role != null)
            Role = GameObject.Instantiate(Role, new Vector3(0, 0, 0), Quaternion.identity);
    }
}
3.创建脚本【抽象工厂类】

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第16张图片

public abstract class AbstractFactory{
    public abstract AbsRole GetRole(string type);
}
༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第17张图片

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第18张图片

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.创建脚本【主类】

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第19张图片

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第20张图片

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,

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第21张图片

运行即生成,

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第22张图片

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

创建脚本:

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第23张图片

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第24张图片

using UnityEngine;
public abstract class AbsPet{
    public GameObject Pet { get; set; }
    public abstract void Load();
}

创建脚本:

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第25张图片

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第26张图片

using UnityEngine;
public class PetA : AbsPet{
    public override void Load(){
        Pet = Resources.Load("Prefabs/pet1");
        if (Pet != null)
            Pet = GameObject.Instantiate(Pet, new Vector3(3, 0, 0), Quaternion.identity);
    }
}
修改脚本:

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第27张图片

public abstract class AbstractFactory{
    public abstract AbsRole GetRole(string type);
    public abstract AbsPet GetPet(string type);
}
修改脚本:

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第28张图片

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;
    }
}
修改主类:

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第29张图片

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("宠物空引用");
    }
}
运行项目即完成,

༺༽༾ཊ—Unity之-05-抽象工厂模式—ཏ༿༼༻_第30张图片

End.

你可能感兴趣的:(抽象工厂模式,1024程序员节,c#)