Unity桥接模式

在游戏开发中,经常会遇到这样的问题:

当系统中存在多个可独立变化的维度时,如果直接通过继承进行组合,随着功能扩展,类数量往往会迅速膨胀,代码也会变得难以维护。以武器系统为例,武器类型和攻击方式本质上是两个独立变化的方向,如果将二者强行绑定在一起,后期无论新增武器还是新增伤害类型,都会带来大量重复修改。

桥接模式正是为了解决这一类问题而出现的。它通过将抽象与实现解耦,使不同维度可以独立扩展,从而避免继承结构失控。下面我将结合 Unity 中一个简单的武器与攻击方式示例,说明桥接模式在实际项目中的应用思路。

1.创建攻击类型接口

这个接口主要定义了一个攻击类型的接口,实现了两种攻击方式,普通攻击和元素攻击。

cs 复制代码
using UnityEngine;

public interface IAttackType
{
    void Attack();
}

public class NormalAttack : IAttackType
{
    public void Attack()
    {
        Debug.Log("普通攻击");
    }
}

public class ElementAttack : IAttackType
{
    public void Attack()
    {
        Debug.Log("元素攻击");
    }
}

2.创建武器抽象类(抽象层)

这个接口起到了桥的作用,将武器和攻击类型连接了起来,只需要编写一次就能实现之后添加各种类型的伤害,比如现在是普通和元素,之后添加蒸发融化都可以,而且不需要改动原本的代码。

为什么 Weapon 是"桥"

Weapon 本身并不关心具体的攻击实现,它只负责维护对攻击类型接口的引用,并在合适的时机调用。武器和攻击方式因此可以独立扩展,二者之间通过 Weapon 这一抽象层进行桥接。

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//武器接口,链接武器和攻击类型的桥梁
public abstract class Weapon
{
    protected IAttackType attackType;
    //构造函数获取攻击类型
    protected Weapon(IAttackType attackType)
    {
        this.attackType = attackType;
    }

    public abstract void Use();
}
//刀剑类武器
public class Sword : Weapon
{
    //使用基类构造函数
    public Sword(IAttackType attackType) : base(attackType) { }

    public override void Use()
    {
        Debug.Log("挥动剑:");
        attackType.Attack();//调用攻击类型Attack()方法
    }
}
//弓箭类武器
public class Bow : Weapon
{
    //使用基类构造函数
    public Bow(IAttackType attackType) : base(attackType) { }

    public override void Use()
    {
        Debug.Log("射箭:");
        attackType.Attack();//调用攻击类型Attack()方法
    }
}

3.使用

当你要使用某种类型的武器和伤害的时候直接在New武器的时候把伤害类型传进去即可。

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    void Start()
    {
        Weapon sword1 = new Sword(new ElementAttack());//武器元素攻击
        Weapon sword2 = new Sword(new NormalAttack());// 武器普通攻击
        Weapon bow1 = new Bow(new NormalAttack());// 普通伤害弓箭
        Weapon bow2 = new Bow(new  ElementAttack());//  元素伤害弓箭

        sword1.Use();
        sword2.Use();
        bow1.Use();
        bow2.Use();
    }
}

4.运行效果

将玩家脚本加到场景中的空对象上,可以看到各个类型的武器和伤害都打印了出来。

5.总结

通过这个示例可以看出,桥接模式的核心价值并不在于代码本身有多复杂,而在于它对系统结构的约束方式。通过在抽象层中持有实现层的接口引用,武器类型和攻击方式这两个变化维度得以解耦,它们可以在互不影响的情况下独立扩展。当后续需要新增攻击类型(例如元素反应、特殊结算规则等)时,只需扩展攻击实现即可,无需修改已有的武器代码。

在实际项目中,这种设计方式尤其适合用于武器系统、技能系统、AI 行为、平台适配等存在多维度变化的场景。合理地使用桥接模式,可以让系统在功能不断演进的过程中,避免因继承层级过深而失控。

相关推荐
lingxiao1688814 分钟前
WebApi详解+Unity注入--中篇:.net core的WebAPI
unity·c#·.netcore
ServBay36 分钟前
C# 成为 2025 年的编程语言,7个C#技巧助力开发效率
后端·c#·.net
Aeside12 小时前
揭秘 Nginx 百万并发基石:Reactor 架构与 Epoll 底层原理
后端·设计模式
weixin_423995003 小时前
unity 处理图片:截图,下载,保存
java·unity·游戏引擎
帅气的你3 小时前
从零封装一个通用的 API 接口返回类:统一前后端交互格式
java·设计模式
阿里巴巴淘系技术团队官网博客4 小时前
GenAI输出内容控制的5种设计模式
设计模式
故事不长丨4 小时前
C#进制转换:从基础原理到实战应用
开发语言·c#·进制转换·16进制·2进制·10进制
liulilittle4 小时前
VEthernet 框架实现 tun2socks 的技术原理
网络·windows·c#·信息与通信·通信
云草桑5 小时前
.net AI API应用 客户发的信息提取对接上下游系统报价
ai·c#·.net·semantickernel·sk
沛沛老爹6 小时前
Skills高级设计模式(一):向导式工作流与模板生成
java·人工智能·设计模式·prompt·aigc·agent·web转型