在Unity中实现简单工厂模式(Simple Factory Pattern)是一个常见的设计模式,特别适合用来创建对象且无需直接暴露实例化逻辑的场景,比如生成敌人、武器、道具等。

以下是一个完整的示例,展示如何在Unity中使用简单工厂模式来生成不同类型的游戏对象(比如敌人)。


1. 简单工厂模式的基本概念

简单工厂模式的核心思想是通过一个工厂类来负责创建实例,而客户端代码只需调用工厂类的方法,而不需要自己去实例化对象。

优点:

  • 将对象的创建逻辑与使用逻辑分离。
  • 简化客户端代码。
  • 易于扩展,只需修改工厂类即可支持新的对象类型。

2. 示例:实现一个敌人工厂

(1) 定义敌人基类
// Enemy.cs
using UnityEngine;

public abstract class Enemy : MonoBehaviour
{
    public abstract void Attack();
}

这里定义了一个抽象类 Enemy,所有敌人对象都需要继承它,并实现 Attack 方法。


(2) 定义具体的敌人类
// MeleeEnemy.cs
using UnityEngine;

public class MeleeEnemy : Enemy
{
    public override void Attack()
    {
        Debug.Log("Melee Enemy attacks with melee weapons!");
    }
}

// RangedEnemy.cs
using UnityEngine;

public class RangedEnemy : Enemy
{
    public override void Attack()
    {
        Debug.Log("Ranged Enemy attacks from a distance!");
    }
}

这里实现了两个具体的敌人类:MeleeEnemy(近战敌人)和 RangedEnemy(远程敌人),它们继承自 Enemy 并实现 Attack 方法。


(3) 创建工厂类

工厂类负责根据输入参数决定创建哪种类型的敌人。

// EnemyFactory.cs
using UnityEngine;

public static class EnemyFactory
{
    public static Enemy CreateEnemy(string enemyType, Vector3 position)
    {
        GameObject enemyObject;

        switch (enemyType)
        {
            case "Melee":
                enemyObject = new GameObject("MeleeEnemy");
                enemyObject.AddComponent<MeleeEnemy>();
                break;

            case "Ranged":
                enemyObject = new GameObject("RangedEnemy");
                enemyObject.AddComponent<RangedEnemy>();
                break;

            default:
                throw new System.ArgumentException("Invalid enemy type: " + enemyType);
        }

        enemyObject.transform.position = position; // 设置敌人的生成位置
        return enemyObject.GetComponent<Enemy>();
    }
}
  • CreateEnemy 方法根据传入的 enemyType 参数(如 "Melee""Ranged")来创建对应的敌人对象。
  • 同时为敌人设置生成位置。

(4) 测试工厂模式

在Unity场景中创建一个空物体,附加一个脚本 GameManager 来测试工厂模式:

// GameManager.cs
using UnityEngine;

public class GameManager : MonoBehaviour
{
    void Start()
    {
        // 使用工厂创建敌人
        Enemy meleeEnemy = EnemyFactory.CreateEnemy("Melee", new Vector3(0, 0, 0));
        meleeEnemy.Attack(); // 输出:Melee Enemy attacks with melee weapons!

        Enemy rangedEnemy = EnemyFactory.CreateEnemy("Ranged", new Vector3(2, 0, 0));
        rangedEnemy.Attack(); // 输出:Ranged Enemy attacks from a distance!
    }
}

3. 运行结果

  1. 游戏启动后,会在场景中生成两个敌人:
    • 一个 MeleeEnemy 出现在 (0, 0, 0)
    • 一个 RangedEnemy 出现在 (2, 0, 0)
  2. 控制台输出:
    Melee Enemy attacks with melee weapons!
    Ranged Enemy attacks from a distance!
    

4. 扩展性

如果需要添加新的敌人类型,比如一个“Boss敌人”,只需:

  1. 创建一个新的敌人类 BossEnemy,继承 Enemy 并实现 Attack 方法。
  2. 在工厂类的 CreateEnemy 方法中添加对应的逻辑:
case "Boss":
    enemyObject = new GameObject("BossEnemy");
    enemyObject.AddComponent<BossEnemy>();
    break;

这样就完成了扩展,客户端代码无需修改。


5. 总结

通过简单工厂模式:

  • 客户端代码只需要调用工厂方法,不关心具体对象的创建逻辑。
  • 工厂类集中管理对象的创建逻辑,便于维护和扩展。

这在Unity项目中非常有用,特别是在需要动态生成大量游戏对象(如敌人、道具等)时,可以有效简化代码并提高扩展性。

更多推荐