当前位置: 首页 > news >正文

Unity 适配器模式(实例详解)

文章目录

    • 简介
    • 1. **Input Adapter 示例**
    • 2. **Component Adapter 示例**
    • 3. **网络数据解析适配器**
    • 4. **物理引擎适配**
    • 5. **跨平台服务适配**

简介

Unity中的适配器模式(Adapter Pattern)主要用于将一个类的接口转换为另一个接口,以便于原本不兼容的对象能够协同工作。在Unity中,适配器可以用于多种场景,例如让不同版本API、不同组件间的交互变得一致,或者对接外部库等。由于Unity使用的是C#语言,以下将提供五个简化的C#代码示例来说明适配器模式在Unity环境下的应用:

1. Input Adapter 示例

假设我们有一个老版本的输入系统,它直接处理键盘按键事件,而新的Unity Input System需要一个特定的接口。我们可以创建一个适配器来使老版输入系统与新接口兼容。

// 老版本输入系统的接口
public class LegacyInputSystem
{public bool IsKeyDown(KeyCode key) { /* ... */ }
}// 新的输入系统接口
public interface INewInput
{bool GetKey(KeyCode key);
}// 适配器类
public class LegacyInputToNewInputAdapter : INewInput
{private LegacyInputSystem legacyInput;public LegacyInputToNewInputAdapter(LegacyInputSystem input){this.legacyInput = input;}public bool GetKey(KeyCode key){return legacyInput.IsKeyDown(key);}
}

2. Component Adapter 示例

Unity内置的Rigidbody和CharacterController组件有不同的接口,但你希望在统一逻辑中处理两者。创建一个适配器可以让它们都实现同样的接口。

public interface IMover
{void Move(Vector3 direction, float speed);
}// Rigidbody Mover Adapter
public class RigidbodyMoverAdapter : MonoBehaviour, IMover
{private Rigidbody rb;void Start(){rb = GetComponent<Rigidbody>();}public void Move(Vector3 direction, float speed){rb.AddForce(direction * speed, ForceMode.VelocityChange);}
}// CharacterController Mover Adapter
public class CharacterControllerMoverAdapter : MonoBehaviour, IMover
{private CharacterController cc;void Start(){cc = GetComponent<CharacterController>();}public void Move(Vector3 direction, float speed){cc.Move(direction.normalized * speed * Time.deltaTime);}
}

3. 网络数据解析适配器

如果你正在使用一个第三方JSON解析库,但是Unity项目中已经有一些基于Unity JSONUtility进行数据序列化的代码,可以创建一个适配器以使得新库也能遵循现有接口。

// 第三方JSON解析器接口
public class ThirdPartyJsonParser
{public string SerializeObject(object obj); // 序列化方法public T DeserializeObject<T>(string json); // 反序列化方法
}// Unity JSONUtility适配器
public class UnityJsonAdapter
{public string ToJson(object obj){return JsonUtility.ToJson(obj);}public T FromJson<T>(string json){return JsonUtility.FromJson<T>(json);}
}// 适配器类内部对ThirdPartyJsonParser的封装
public class AdapterForThirdParty : ThirdPartyJsonParser
{public override string SerializeObject(object obj){return new UnityJsonAdapter().ToJson(obj);}public override T DeserializeObject<T>(string json){return new UnityJsonAdapter().FromJson<T>(json);}
}

4. 物理引擎适配

假设有一个自定义的物理计算库,但游戏中的其他部分是基于Unity的物理引擎 Rigidbody 的。创建一个适配器可以将自定义库的行为模拟成 Rigidbody 的行为。

public class CustomPhysicsEngine
{public Vector3 ApplyForce(Vector3 force);public Vector3 GetVelocity();
}public class CustomPhysicsToRigidbodyAdapter : MonoBehaviour
{private Rigidbody _rb;private CustomPhysicsEngine _customPhysics;void Start(){_rb = GetComponent<Rigidbody>();_customPhysics = new CustomPhysicsEngine();}void FixedUpdate(){var force = _customPhysics.ApplyForce(...);_rb.AddForce(force);if (_rb.velocity != _customPhysics.GetVelocity()){// 在这里同步或调整Rigidbody的状态_rb.velocity = _customPhysics.GetVelocity();}}
}

5. 跨平台服务适配

对于跨平台开发,某些服务在不同平台上可能有不同的实现。比如音频播放功能,可以创建适配器确保在所有平台上都能通过相同的接口调用。

public interface IAudioPlayer
{void PlaySound(AudioClip clip);void StopSound();
}public class MobileAudioPlayer : IAudioPlayer
{void PlaySound(AudioClip clip){// 移动设备上播放音频// ...}void StopSound(){// 在移动设备上停止音频// ...}
}public class DesktopAudioPlayer : IAudioPlayer
{void PlaySound(AudioClip clip){// PC上播放音频// ...}void StopSound(){// 在PC上停止音频// ...}
}
// 适配器类
public class PlatformSpecificAudioAdapter : IAudioPlayer
{private readonly IAudioPlayer _audioPlayer;public PlatformSpecificAudioAdapter(){#if UNITY_IOS || UNITY_ANDROID_audioPlayer = new MobileAudioPlayer();#else_audioPlayer = new DesktopAudioPlayer();#endif}public void PlaySound(AudioClip clip){_audioPlayer.PlaySound(clip);}public void StopSound(){_audioPlayer.StopSound();}
}

以上每个示例展示了如何通过适配器模式在Unity中解决接口不兼容的问题,并保持代码结构清晰、易于维护和扩展。

python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)
————————————————

​最后我们放松一下眼睛
在这里插入图片描述

相关文章:

Unity 适配器模式(实例详解)

文章目录 简介1. **Input Adapter 示例**2. **Component Adapter 示例**3. **网络数据解析适配器**4. **物理引擎适配**5. **跨平台服务适配** 简介 Unity中的适配器模式&#xff08;Adapter Pattern&#xff09;主要用于将一个类的接口转换为另一个接口&#xff0c;以便于原本…...

Spring boot项目java bean和xml互转

Spring boot项目实现java bean和xml互转 项目场景&#xff1a;互转方法使用jackson进行互转使用jaxws进行xml与bean的互转 搞定收工&#xff01; 项目场景&#xff1a; 工作中需要给下游第三方收费系统做数据挡板&#xff0c;由于下游系统使用的是soap webservice,里面涉及各种…...

数字证书和数字证书认证机构和数字根证书,CA,RCA

文章目录 一、 数字证书1、什么是数字证书2、数字证书干什么的3、风险 二、数字证书认证机构&#xff08;Certificate Authority&#xff0c;缩写为CA&#xff09;参考文章 一、 数字证书 维基百科 公开密钥认证&#xff08;英语&#xff1a;Public key certificate&#xff…...

java web mvc-08-Grails 入门介绍

拓展阅读 Spring Web MVC-00-重学 mvc mvc-01-Model-View-Controller 概览 web mvc-03-JFinal web mvc-04-Apache Wicket web mvc-05-JSF JavaServer Faces web mvc-06-play framework intro web mvc-07-Vaadin web mvc-08-Grails 开源 The jdbc pool for java.(java …...

深度学习技术栈 —— Pytorch之TensorDataset、DataLoader

深度学习技术栈 —— Pytorch之TensorDataset、DataLoader 前言一、TensorDataset、DataLoader的用法&#xff1f;二、从.csv文件-->tensor张量总结 前言 简单来说&#xff0c;TensorDataset与DataLoader这两个类的作用&#xff0c; 就是将数据读入并做整合&#xff0c;以便…...

远程git开发

两种本地与远程仓库同步 """ 1&#xff09;你作为项目仓库初始化人员&#xff1a;线上要创建空仓库 > 本地初始化好仓库 > 建立remote链接(remote add) > 提交本地仓库到远程(push)2&#xff09;你作为项目后期开发人员&#xff1a;远程项目仓库已经创…...

Codeforces Round 812 (Div. 2) ---- C. Build Permutation --- 题解

目录 C. Build Permutation 题目描述&#xff1a; ​编辑 思路解析&#xff1a; 代码实现&#xff1a; C. Build Permutation 题目描述&#xff1a; 思路解析&#xff1a; 先证明在任何情况下答案均存在。 假设我们所求的为 m m1 m2.....n 的排列&#xff0c;我们称不小于n…...

Matlab 将工作区变量保存到文件中(save)

语法 1、save(filename) 2、save(filename,variables) 3、save(filename,variables,fmt) 4、save(filename,variables,version) 5、save(filename,variables,version,-nocompression) 6、save(filename,variables,-append) 7、save(filename,variables,-append,-nocompression…...

源码实现简介

本系列所有代码在文章底部&#xff0c;每一章节代码可独立编译运行 随着科技的飞速发展&#xff0c;自动驾驶技术正逐渐成为现实。而在自动驾驶技术中&#xff0c;感知是至关重要的一个环节。通过感知&#xff0c;自动驾驶车辆能够识别和理解周围环境&#xff0c;进而做出相应…...

我每天如何使用 ChatGPT

我们都清楚互联网的运作方式——充斥着各种“爆款观点”&#xff0c;极端分裂的意见&#xff0c;恶搞和无知现象屡见不鲜。 最近&#xff0c;大家对于人工智能&#xff08;AI&#xff09;特别是大语言模型&#xff08;LLMs&#xff09;和生成式 AI&#xff08;GenAI&#xff0…...

MySQL修炼手册14:用户权限管理:安全保障与数据隔离

目录 写在开头1 用户与权限的关系1.1 用户的创建与删除1.1.1 创建新用户1.1.2 批量创建用户1.1.3 安全删除用户 1.2 授予与撤销权限1.2.1 授予权限1.2.2 批量授予权限1.2.3 撤销权限 2 角色的应用2.1 创建与管理角色2.1.1 创建角色2.1.2 管理角色 2.2 将权限赋予角色2.2.1 将权…...

动态规划解决马尔可夫决策过程

马尔可夫决策过程是强化学习中的基本问题模型之一&#xff0c;而解决马尔可夫决策过程的方法我们统称为强化学习算法。 动态规划&#xff08; dynamic programming, DP &#xff09;具体指的是在某些复杂问题中&#xff0c;将问题转化为若干个子问题&#xff0c;并在求解每个子…...

ubuntu1604安装及问题解决

虚拟机安装vmbox7 虚拟机操作&#xff1a; 安装增强功能 sudo mkdir /mnt/share sudo mount -t vboxsf sharefolder /mnt/share第一次使用sudo提示is not in the sudoers file. This incident will be reported 你的root需要设置好密码 sudo passwd root 输入如下指令&#x…...

Leetcode—24. 两两交换链表中的节点【中等】

2023每日刷题&#xff08;八十七&#xff09; Leetcode—24. 两两交换链表中的节点 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x),…...

USRP相关报错解决办法

文章目录 前言一、本地环境二、相关报错信息二、解决办法1、更换电脑操作系统2、升级最新版固件 前言 在进行 USRP 开发时遇到了一些报错&#xff0c;这里做个记录解决问题的方法。 一、本地环境 电脑操作系统&#xff1a;Windows11MATLAB 版本&#xff1a;MATLAB 2021aUSRP …...

【剑指offer】重建二叉树

&#x1f451;专栏内容&#xff1a;力扣刷题⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、题目描述1、题目2、示例 二、题目分析1、递归2、栈 一、题目描述 1、题目 剑指offer&#xff1a;重建二叉树 给定节…...

中仕教育:事业编招考全流程介绍

一、报名阶段 1. 了解查看招聘信息&#xff1a;查看各类事业编岗位的招聘信息&#xff0c;包括岗位职责、招聘条件、报名时间等。 2. 填写报名表&#xff1a;按照要求填写报名表&#xff0c;包括个人信息、教育背景、工作经历等内容。 3. 提交报名材料&#xff1a;将报名表及…...

149. 直线上最多的点数

149. 直线上最多的点数 class MaxPoints:"""149. 直线上最多的点数https://leetcode.cn/problems/max-points-on-a-line/description/?envTypestudy-plan-v2&envIdtop-interview-150"""def solution(self, points: List[List[int]]) ->…...

不合格机器人工程讲师再读《悉达多》-2024-

一次又一次失败的经历&#xff0c;让我对经典书籍的认同感越来越多&#xff0c;越来越觉得原来的自己是多么多么的无知和愚昧。 ----zhangrelay 唯物也好&#xff0c;唯心也罢&#xff0c;我们都要先热爱这个世界&#xff0c;然后才能在其中找到自己所热爱的事业。 ----zh…...

【STM32CubeMX串口通信详解】USART2 -- DMA发送 + DMA空闲中断 接收不定长数据

&#xff08; 本篇正在编写、更新状态中.....) 文章目录&#xff1a; 前言 前言 本篇&#xff0c;详细地用截图解释 CubeMX 对 USART2 的配置&#xff0c;HAL函数使用&#xff0c;和收发程序的编写。 收、发机制&#xff1a;DMA发送 DAM空闲中断接收。 DMA空…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...