在Unity开发中, 适配器模式(Adapter Pattern) 常用于解决”接口不兼容”的问题 ——— 当两个模块 (或组件) 因接口定义不同而无法直接协作时, 通过一个”适配器”将其中一个模块的接口转换为另一个模块期望的接口, 从而让它们能够协同工作.
 

举个具体场景: 输入系统配置

假设你的游戏需要支持两种输入方式:
  • 旧系统: 基于 Unity 传统的 Input 类(如 Input.GetAxis(”Horizontal”) ).
  • 新系统: 基于 Unity 新的 Input System (通过 C# 实现回调获取输入)
 
玩家控制器(客户端) 希望统一的方式获取输入(比如调用 GetMoveDirection() ), 但这两个系统的接口完全不同. 此时就可以用适配器模式解决.
 

适配器模式的核心角色

  1. 目标接口(Target): 客户端期望的统一接口(比如 IMoveInput).
  1. 被适配者(Adaptee): 现有接口不兼容的类(比如旧输入系统\ 新输入系统).
  1. 适配器(Adapter): 实现目标接口, 内部持有适配者的引用, 将目标接口的方法转换为被适配者的方法调用.
 

代码实现步骤

 
  1. 定义目标接口(Target)
先定义客户端(玩家控制器)期望的统一接口, 比如获取移动方向:
 
  1. 实现被适配者(Adaptee)
这是现有的\接口不兼容的类(旧输入系统和新输入系统):
 
  1. 实现适配器(Adapter)
适配器需要实现目标接口 IMoveInput , 并内部持有被适配者的引用, 将 GetMoveDirection() 转换为被适配者的方法调用:
 
  1. 客户端使用(玩家控制器)
客户端只需要依赖目标接口 IMoveInput , 无需关心具体哪个输入系统, 实现解耦:
 
  1. 在 Unity 中适配
在 Inspector 中给 PlayerController_moveInput 赋值:
  • 若用旧输入系统: 创建 OldInputSystem 实例, 再创建 OldInputAdapter 并关联它, 最后将 OldInputAdapter 拖给 PlayerController .
  • 若用新输入系统: 创建 NewInputSystem 实例(并在 Input System 中绑定 OnMovePerformed 事件), 在创建 NewInputAdapter 并关联它, 最后托给 PlayerController .
 
适配器模式的好处
  1. 兼容性: 让原本接口不兼容的类可以一起工作(旧输入系统和新输入系统都能被玩家控制器调用).
  1. 解耦: 客户端(玩家控制器) 只依赖目标接口, 无需关心具体实现, 货期切换输入系统无需修改客户端代码.
  1. 复用性: 无需修改i下哪有适配者(旧/新输入系统), 直接通过适配器复用.
 
总结: 适配器模式就像”转接头” ——— 比如 USB-C 转 HDMI的 转接头, 让不同接口的设备能协同工作. 在 Unity中, 它常用于整合第三方插件\旧系统迁移\多平台适配场景.