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)
————————————————

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/246497.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

循环测试之旅——深度解析Pytest插件 pytest-repeat

在软件开发中,测试的重要性不言而喻。而为了提高测试的鲁棒性和可靠性,Pytest插件 pytest-repeat 应运而生。这个插件可以帮助你轻松实现测试用例的循环运行,以更全面地评估代码的稳定性。本文将深入介绍 pytest-repeat 插件的基本用法和实际案例,助你更好地利用循环测试,…

短视频矩阵系统软件/电脑pc企业版/手机端双开发~~源头

短视频矩阵系统软件开发的属性主要包含以下几个方面&#xff1a; 开发属性&#xff1a; 1. 功能属性&#xff1a;功能是短视频矩阵系统的核心属性&#xff0c;包括短视频的采集、编辑、发布、推广、互动等功能。此外&#xff0c;系统的个性化定制也是考虑的重要因素&#xff0…

云计算中的弹性是什么?

云弹性是指当客户需求增加或减少时&#xff0c;自动从数据中心配置和取消配置资源。这使得云资源(包括计算、存储和内存资源)能够根据需求变化快速重新分配。CPU/处理、内存、输入/输出带宽和存储容量等计算资源可以根据需要增加或减少&#xff0c;而不会影响系统性能。 它旨在…

如何在前端项目里接入Sentry监控系统并通过企业微信通知

能不能让用户录个屏过来呀&#xff1f; 用户使用的是什么机型的手机&#xff1f; 用户使用的什么浏览器呀&#xff1f; 用户的网络是什么情况&#xff1f; … … 线上出现问题时&#xff0c;技术部和业务部同学之间的对话诸如此类…业务同学也很栓Q呀&#xff0c;硬着头皮去问客…

预训练语言模型transformer

预训练语言模型的学习方法有三类&#xff1a;自编码&#xff08;auto-encode, AE)、自回归&#xff08;auto regressive, AR&#xff09;&#xff0c;Encoder-Decoder结构。 决定PTM模型表现的真正原因主要有以下几点&#xff1a; 更高质量、更多数量的预训练数据增加模型容量…

插槽(64-67)

文章目录 插槽1.插槽 - 默认插槽(组件内可以定制一处结构)2.插槽 - 后备内容&#xff08;默认值&#xff09;3.插槽 - 具名插槽(组件内可以定制多处结构)4.作用域插槽(插槽的一个传参语法) 插槽 插槽分类:默认插槽和具名插槽 1.插槽 - 默认插槽(组件内可以定制一处结构) 作用…

【CSS】字体效果展示

测试时使用了Google浏览器。 1.Courier New 2.monospace 3.Franklin Gothic Medium 4.Arial Narrow 5.Arial 6.sans-serif 7.Gill Sans MT 8.Calibri 9.Trebuchet MS 10.Lucida Sans 11.Lucida Grande 12.Lucida Sans Unicode 13.Geneva 14.Verdana 15.Segoe UI 16.Tahoma 17.…

AWS 专题学习 P11 (Machine Learning)

文章目录 专题总览机器学习服务1. Amazon Rekognition2. Amazon Rekognition - Content Moderation3. Amazon Transcribe4. Amazon Polly5. Amazon Polly - Lexicon & SSML6. Amazon TranscribeAmazon Translate7. Amazon Lex & Connect8. Amazon Comprehend9. Amazon …

大数据期望最大化(EM)算法:从理论到实战全解析

文章目录 大数据期望最大化&#xff08;EM&#xff09;算法&#xff1a;从理论到实战全解析一、引言概率模型与隐变量极大似然估计&#xff08;MLE&#xff09;Jensen不等式 二、基础数学原理条件概率与联合概率似然函数Kullback-Leibler散度贝叶斯推断 三、EM算法的核心思想期…

环形链表的检测与返回

环形链表 王赫辰/c语言 - Gitee.com 快慢指针的差距可以为除一以外的数吗&#xff1f;不可以如果差奇数则无法发现偶数环&#xff0c;是偶数无法发现奇数环&#xff0c;本题思路为指针相遇则为环&#xff0c;而以上两种情况会稳定差一&#xff0c;导致指针永不相遇 最终返回…

Discuz论坛搭建:Linux宝塔面板一键部署,固定地址畅享公网访问

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 安装基础环境二. 一键部署Discuz三. 安装cpolar工具四. 配置域名访问Discuz…

Android SharedPreferences源码分析

文章目录 Android SharedPreferences源码分析概述基本使用源码分析获取SP对象初始化和读取数据写入数据MemoryCommitResultcommitToMemory()commit()apply()enqueueDiskWrite()writeToFile() 主动等待写回任务结束 总结 Android SharedPreferences源码分析 概述 SharedPrefer…

Parallels Desktop 19 for Mac虚拟机 一键激活版

Parallels Desktop是一款功能强大的虚拟机软件&#xff0c;它允许用户在Mac电脑上同时运行Windows、Linux和其他操作系统。Parallels Desktop提供了直观易用的界面&#xff0c;使用户可以轻松创建、配置和管理虚拟机&#xff0c;该软件具有快速启动和关闭虚拟机的能力&#xff…

Servlet 与 MVC

主要内容 Servlet 重点 MVC 重点 Filter 重点 章节目标 掌握 Servlet 的作用 掌握 Servlet 的生命周期 掌握 JSP 的本质 掌握 MVC 的设计思想 掌握 Filter 的作用及使用场景 第一节 Servlet 1. Servlet 概念 Servlet 是在服务器上运行的能够对客户端请求进行处理&a…

从零开发短视频电商 Tesseract OCR识别增强

文章目录 概要图像预处理阶段默认反转图像重新缩放二值化噪音消除膨胀/腐蚀旋转/偏移校正边框缺少边框边框太大扫描边框去除 透明度/Alpha通道 引擎处理阶段语言模型配置提高识别速度词典、单词列表和模式表格识别 使用 Tesseract OCR 的 GUI 和其他项目 原文如下&#xff1a; …

【网络协议测试】畸形数据包——圣诞树攻击(DOS攻击)

简介 TCP所有标志位被设置为1的数据包被称为圣诞树数据包&#xff08;XMas Tree packet&#xff09;&#xff0c;之所以叫这个名是因为这些标志位就像圣诞树上灯一样全部被点亮。 标志位介绍 TCP报文格式&#xff1a; 控制标志&#xff08;Control Bits&#xff09;共6个bi…

安全基础~通用漏洞1

文章目录 知识补充Acess数据库注入MySQL数据库PostgreSQL-高权限读写注入MSSQL-sa高权限读写执行注入Oracle 注入Mongodb 注入sqlmap基础命令 知识补充 order by的意义&#xff1a; union 操作符用于合并两个或多个 select语句的结果集。 union 内部的每个 select 语句必须拥有…

MVC架构模式与三层架构

提示&#xff1a;博客中的图片来源于动力节点在B站的视频讲解。 MVC架构模式与三层架构 一、三层架构二、MVC&#xff08;model view controller&#xff09;1.MVC 架构的工作流程&#xff08;1&#xff09;JSP Servlet javabean实现MVC。&#xff08;2&#xff09;SSM&#…

防御保护---安全策略

文章目录 一.安全策略概述 概述&#xff1a; 安全策略的作用&#xff1a; 包过滤防火墙的安全风险 状态检测防火墙访问过程 安全策略与传统防火墙的区别 二.案例分析 基础配置&#xff1a;&#xff08;正常数通&#xff09; 安全策略配置 练习 一.安全策略概述 概述&#xff1…

数据挖掘笔记1

课程&#xff1a;清华大学-数据挖掘&#xff1a;理论与算法&#xff08;国家级精品课&#xff09;_哔哩哔哩_bilibili 一、Learning Resources 二、Data 数据是最底层的一种表现形式。数据具有连续性。从存储上来讲&#xff0c;数据分为逻辑上的和物理层的。大数据&#xff1…