在Unity开发中, 适配器模式(Adapter Pattern) 常用于解决”接口不兼容”的问题 ——— 当两个模块 (或组件) 因接口定义不同而无法直接协作时, 通过一个”适配器”将其中一个模块的接口转换为另一个模块期望的接口, 从而让它们能够协同工作.
举个具体场景: 输入系统配置
假设你的游戏需要支持两种输入方式:
- 旧系统: 基于 Unity 传统的
Input类(如Input.GetAxis(”Horizontal”)).
- 新系统: 基于 Unity 新的
Input System(通过 C# 实现回调获取输入)
玩家控制器(客户端) 希望统一的方式获取输入(比如调用
GetMoveDirection() ), 但这两个系统的接口完全不同. 此时就可以用适配器模式解决.适配器模式的核心角色
- 目标接口(Target): 客户端期望的统一接口(比如
IMoveInput).
- 被适配者(Adaptee): 现有接口不兼容的类(比如旧输入系统\ 新输入系统).
- 适配器(Adapter): 实现目标接口, 内部持有适配者的引用, 将目标接口的方法转换为被适配者的方法调用.
代码实现步骤
- 定义目标接口(Target)
先定义客户端(玩家控制器)期望的统一接口, 比如获取移动方向:
- 实现被适配者(Adaptee)
这是现有的\接口不兼容的类(旧输入系统和新输入系统):
- 实现适配器(Adapter)
适配器需要实现目标接口
IMoveInput , 并内部持有被适配者的引用, 将 GetMoveDirection() 转换为被适配者的方法调用:- 客户端使用(玩家控制器)
客户端只需要依赖目标接口
IMoveInput , 无需关心具体哪个输入系统, 实现解耦:- 在 Unity 中适配
在 Inspector 中给
PlayerController的 _moveInput 赋值:- 若用旧输入系统: 创建
OldInputSystem实例, 再创建OldInputAdapter并关联它, 最后将OldInputAdapter拖给PlayerController.
- 若用新输入系统: 创建
NewInputSystem实例(并在Input System中绑定OnMovePerformed事件), 在创建NewInputAdapter并关联它, 最后托给PlayerController.
适配器模式的好处
- 兼容性: 让原本接口不兼容的类可以一起工作(旧输入系统和新输入系统都能被玩家控制器调用).
- 解耦: 客户端(玩家控制器) 只依赖目标接口, 无需关心具体实现, 货期切换输入系统无需修改客户端代码.
- 复用性: 无需修改i下哪有适配者(旧/新输入系统), 直接通过适配器复用.
总结: 适配器模式就像”转接头” ——— 比如 USB-C 转 HDMI的 转接头, 让不同接口的设备能协同工作. 在 Unity中, 它常用于整合第三方插件\旧系统迁移\多平台适配场景.