在Unity中,建造者模式(Builder Pattern)是一种创建型设计模式,用于分步骤地构建复杂对象。建造者模式可以将对象的构建过程与表示分离,从而使同样的构建过程可以创建不同的对象。

以下是一个完整的示例,展示如何在Unity中使用建造者模式来构建一个复杂的游戏对象,例如一个带有多种组件(模型、材质、行为)的角色。


1. 建造者模式的基本概念

核心角色
  1. Builder(建造者接口):定义构建产品各部分的抽象方法。
  2. ConcreteBuilder(具体建造者):实现 Builder 接口,负责构建产品的各个部分。
  3. Director(指挥者):负责控制构建过程(调用建造者的方法定义构建顺序)。
  4. Product(产品):由建造者构建的最终复杂对象。
优点
  • 将复杂对象的构建过程封装起来,减少客户端代码的复杂性。
  • 可以灵活构建不同的对象表示。

2. 示例:建造一个游戏角色

需求

我们希望通过建造者模式构建一个游戏角色(例如敌人或玩家),角色需要包含以下部分:

  1. 模型:角色的 3D 模型。
  2. 材质:角色的外观。
  3. 行为脚本:角色的功能逻辑。

(1) 定义产品类

Character 类表示需要构建的复杂对象(角色)。

// Character.cs
using UnityEngine;

public class Character
{
    public GameObject Model { get; private set; }
    public Material Material { get; private set; }
    public MonoBehaviour Behavior { get; private set; }

    public void SetModel(GameObject model)
    {
        Model = model;
    }

    public void SetMaterial(Material material)
    {
        Material = material;
    }

    public void SetBehavior(MonoBehaviour behavior)
    {
        Behavior = behavior;
    }

    public void DisplayInfo()
    {
        Debug.Log($"Character Info: Model = {Model?.name}, Material = {Material?.name}, Behavior = {Behavior?.GetType().Name}");
    }
}
  • Character 类包含角色的模型、材质和行为。
  • 提供了设置这些部分的 SetModelSetMaterialSetBehavior 方法。

(2) 定义建造者接口

ICharacterBuilder 接口定义了构建角色各部分的方法。

// ICharacterBuilder.cs
using UnityEngine;

public interface ICharacterBuilder
{
    void BuildModel();
    void BuildMaterial();
    void BuildBehavior();
    Character GetResult();
}
  • BuildModel:构建角色的模型。
  • BuildMaterial:构建角色的材质。
  • BuildBehavior:构建角色的行为。
  • GetResult:返回构建完成的角色。

(3) 定义具体建造者

实现具体建造者,负责构建不同类型的角色。

// EnemyBuilder.cs
using UnityEngine;

public class EnemyBuilder : ICharacterBuilder
{
    private Character _character = new Character();

    public void BuildModel()
    {
        GameObject enemyModel = GameObject.CreatePrimitive(PrimitiveType.Capsule); // 使用胶囊体作为模型
        enemyModel.name = "EnemyModel";
        _character.SetModel(enemyModel);
    }

    public void BuildMaterial()
    {
        Material enemyMaterial = new Material(Shader.Find("Standard"));
        enemyMaterial.color = Color.red; // 设置为红色
        _character.SetMaterial(enemyMaterial);
        _character.Model.GetComponent<Renderer>().material = enemyMaterial;
    }

    public void BuildBehavior()
    {
        _character.SetBehavior(_character.Model.AddComponent<EnemyBehavior>()); // 添加敌人行为脚本
    }

    public Character GetResult()
    {
        return _character;
    }
}

// PlayerBuilder.cs
using UnityEngine;

public class PlayerBuilder : ICharacterBuilder
{
    private Character _character = new Character();

    public void BuildModel()
    {
        GameObject playerModel = GameObject.CreatePrimitive(PrimitiveType.Sphere); // 使用球体作为模型
        playerModel.name = "PlayerModel";
        _character.SetModel(playerModel);
    }

    public void BuildMaterial()
    {
        Material playerMaterial = new Material(Shader.Find("Standard"));
        playerMaterial.color = Color.blue; // 设置为蓝色
        _character.SetMaterial(playerMaterial);
        _character.Model.GetComponent<Renderer>().material = playerMaterial;
    }

    public void BuildBehavior()
    {
        _character.SetBehavior(_character.Model.AddComponent<PlayerBehavior>()); // 添加玩家行为脚本
    }

    public Character GetResult()
    {
        return _character;
    }
}
  • EnemyBuilder:构建敌人角色,模型是胶囊体,材质是红色,行为是 EnemyBehavior
  • PlayerBuilder:构建玩家角色,模型是球体,材质是蓝色,行为是 PlayerBehavior

(4) 定义指挥者

指挥者负责组织建造过程。

// CharacterDirector.cs
public class CharacterDirector
{
    private ICharacterBuilder _builder;

    public CharacterDirector(ICharacterBuilder builder)
    {
        _builder = builder;
    }

    public Character Construct()
    {
        _builder.BuildModel();
        _builder.BuildMaterial();
        _builder.BuildBehavior();
        return _builder.GetResult();
    }
}
  • CharacterDirector 调用建造者的方法,定义建造顺序。
  • Construct 方法返回构建完成的角色。

(5) 定义角色行为脚本

敌人和玩家的行为脚本:

// EnemyBehavior.cs
using UnityEngine;

public class EnemyBehavior : MonoBehaviour
{
    void Start()
    {
        Debug.Log("Enemy Behavior Initialized!");
    }
}

// PlayerBehavior.cs
using UnityEngine;

public class PlayerBehavior : MonoBehaviour
{
    void Start()
    {
        Debug.Log("Player Behavior Initialized!");
    }
}

(6) 测试建造者模式

创建一个 GameManager 脚本来测试角色的构建:

// GameManager.cs
using UnityEngine;

public class GameManager : MonoBehaviour
{
    void Start()
    {
        // 创建敌人角色
        ICharacterBuilder enemyBuilder = new EnemyBuilder();
        CharacterDirector enemyDirector = new CharacterDirector(enemyBuilder);
        Character enemy = enemyDirector.Construct();
        enemy.DisplayInfo(); // 输出角色信息
        enemy.Model.transform.position = new Vector3(0, 0, 0); // 设置位置

        // 创建玩家角色
        ICharacterBuilder playerBuilder = new PlayerBuilder();
        CharacterDirector playerDirector = new CharacterDirector(playerBuilder);
        Character player = playerDirector.Construct();
        player.DisplayInfo(); // 输出角色信息
        player.Model.transform.position = new Vector3(2, 0, 0); // 设置位置
    }
}

3. 运行结果

  1. 游戏启动后:
    • 一个敌人角色生成在 (0, 0, 0),是红色的胶囊体。
    • 一个玩家角色生成在 (2, 0, 0),是蓝色的球体。
  2. 控制台输出:

    复制

    Character Info: Model = EnemyModel, Material = Standard, Behavior = EnemyBehavior
    Enemy Behavior Initialized!
    Character Info: Model = PlayerModel, Material = Standard, Behavior = PlayerBehavior
    Player Behavior Initialized!
    

4. 扩展性

  • 如果需要新增角色类型(如 Boss 角色),只需:
    1. 创建新的建造者类(如 BossBuilder)。
    2. 定义对应的模型、材质和行为。

指挥者和客户端代码无需修改。


5. 总结

优点
  1. 分离复杂对象的构建过程与表示:建造者模式将构建过程封装在建造者中,客户端无需关心具体细节。
  2. 易于扩展:新增复杂对象时,只需添加新的建造者类。
适用场景
  • 创建复杂对象(如角色、场景、UI等)。
  • 需要分步骤创建对象,并允许不同的表示方法。

通过建造者模式,Unity项目中的角色、装备、关卡等复杂内容的构建变得更加清晰和可维护。

Logo

分享前沿Unity技术干货和开发经验,精彩的Unity活动和社区相关信息

更多推荐