rustum 发表于 2022-1-11 20:43

Unity 常用设计模式之工厂模式

工厂模式(Factory Pattern)是 游戏开发中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对用户暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
先来看一个生活中的真实的案例,某个品牌的汽车制造工厂,对外提供生产这个品牌的不同型号汽车的服务。外界只要下一个”汽车型号”, 工厂可以根据型号构建出来不同型号的汽车。这样外界不用关心工厂内部是怎么运作的,当用户需要某个型号的汽车的时候调用接口就可以了,同时内部工厂的机制,可以任意的修改,比如增加了一个新的汽车型号的服务等。
通过上面的例子,我们来分析一下工程模式的几个重要的元素,掌握这几个元素,你就可以非常方便的在你的游戏项目中使用工厂模式。
   首先是要定义和规划我们工厂模式创建出来的对象,我们可以成为”工厂元素”。这些工厂元素都属于不同的类型(上面例子中的不同型号的某品牌汽车),这些类型都属于同一个基类(某品牌汽车,具有汽车的通用功能)。所以工厂元素的设计规划就是 基类+子类的模式,基类提供对外使用的接口(如汽车的功能), 而子类定义具体的不同的类型。如果要新增一种类型,那么只要继承自这个基类就可以了。



工厂元素设计好了以后,接下来就是提供一个”工厂构造接口”来构造不同的类型的实例,一般我们会提供一个 Create的接口,用户传递一个标识类型的参数,Create里面根据用户传递的类型来new 不同的子类实例,返回一个基类的引用, 让基类指向子类的实例。如图:



用户就可以基于基类来管理子类的实例。当我们新加一种类型的时候,只要继承自基类,然后在Create接口加一个类型来构造这个新类的实例就可以了。

介绍完工厂模式后,相信大家对工厂模式已经有所了解了,接下来我们来通过地图上战斗单元的设计来讲解一下我们整个战斗系统中使用工厂模式来处理敌人小怪。
步骤1:定义一个怪物的基类:
Class BaseEnemy extends MonoBehaviour {
//攻击接口
// end
// 行走接口
// end ….
}
步骤2: 定义具体战斗单元的子类FlyEnemy, MonestEnemy , 重载实现具体的接口
Class FlyEnemy extends Enemy {
// …
}
Class MonestEnemy extends Enemy {
// …
}
步骤3: 编写一个工厂模式的Create接口
Class EnemyFactory {
Public static BaseEnemy AddEnemyComponent(GameObject obj, int enmeyType) {
switch(enemyType) {
        case eFlyEnemy:
                return obj.AddComponent<FlyEnmey>();
        break;
    case eMonestEnemy:
                return obj.AddComponent<MonestEnemy> ();
        break;
    …
}
}
}

步骤4: 根据Excel表格描述与地图数据来生成敌人。
敌人类型描述表,如图:



地图数据描述表,如图:



我们编写地图管理代码,读取地图表格,读取到地图上怪物的类型,资源路径,位置,缩放,旋转,然后我们根据描述来在地图上创建怪物,代码如下:
GameObject obj = GameObject.Instantiate(资源路径对应的预制体);
obj.transform.position = new Vector3(配置表读取的位置);

// 通过工厂模式把敌人构建出来
BaseEenemy enemy = EnemyFactory.AddEnemyComponent(obj, 配置表读取的type);

这样我们就把地图上的不同的敌人都构建与创建出来了,如果有新的敌人,这边的逻辑都不用改,只要加一种类型,加一个子类就可以了。这就是工厂模式在游戏中的设计,很有用,大家要多多体会实践。

今天的分享就到这里了。

DomDomm 发表于 2022-1-11 20:51

建议排版弄好一点,加个标题加粗,首行空格什么的[魔性笑]。
页: [1]
查看完整版本: Unity 常用设计模式之工厂模式