当前位置: 首页 > 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空…...

Ollama搭配BGE-M3实战:手把手教你构建个人知识库问答系统(附完整代码)

Ollama与BGE-M3实战&#xff1a;从零构建智能知识库问答系统 你是否经常遇到这种情况——电脑里存了几百份技术文档、产品手册或会议纪要&#xff0c;急需查找某个具体问题的答案时&#xff0c;却不得不在成堆的文件中手动翻找&#xff1f;传统的关键词搜索往往返回大量无关结果…...

鸿蒙 ArkTS 高级样式复用:@Extend 装饰器完全解析(比 @Styles 更强大)

&#x1f525;前言&#xff1a;在上一篇文章《鸿蒙 ArkTS 样式复用&#xff1a;Styles 装饰器从入门到实战》中&#xff0c;我们学习了使用 Styles 实现基础样式复用。 但 Styles 不支持传参、不能使用组件专有属性&#xff0c;在复杂 UI 场景下能力有限。 &#x1f4cc; 本文…...

如何快速配置TranslucentTB:Windows任务栏美化终极教程

如何快速配置TranslucentTB&#xff1a;Windows任务栏美化终极教程 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 想要让Windows任务栏变…...

3步实现视频硬字幕精准提取:本地化多语言解决方案如何解决你的字幕难题

3步实现视频硬字幕精准提取&#xff1a;本地化多语言解决方案如何解决你的字幕难题 【免费下载链接】video-subtitle-extractor 视频硬字幕提取&#xff0c;生成srt文件。无需申请第三方API&#xff0c;本地实现文本识别。基于深度学习的视频字幕提取框架&#xff0c;包含字幕区…...

多模态Agent架构实战落地:从需求分析到生产部署

多模态Agent架构实战落地&#xff1a;从需求分析到生产部署 随着大语言模型技术的普及&#xff0c;单一文本交互的智能系统已无法满足复杂业务场景需求——电商平台需要同时理解用户的商品描述文本、实拍图片和售后语音诉求&#xff0c;教育场景需要处理手写作业、视频讲解和文…...

手把手教你用Qwen2.5-Omni-7B:一个模型搞定文本、图片、音频和视频(附Python代码示例)

实战Qwen2.5-Omni-7B&#xff1a;全模态AI开发指南 第一次听说一个模型能同时处理文本、图片、音频和视频时&#xff0c;我的反应和大多数开发者一样——既兴奋又怀疑。直到亲手用Python调用了Qwen2.5-Omni-7B的API&#xff0c;看着它准确描述视频内容、回答图片问题、甚至生成…...

LingBot-Depth效果实测:与传感器原生深度对比的绝对误差(mm)分布图

LingBot-Depth效果实测&#xff1a;与传感器原生深度对比的绝对误差&#xff08;mm&#xff09;分布图 1. 引言&#xff1a;当深度图遇上“脑补”大师 想象一下&#xff0c;你手里有一张用深度相机拍出来的照片&#xff0c;它告诉你每个像素离相机有多远。但问题是&#xff0…...

Cortex-M为何不能运行Linux?解析ARM架构与操作系统的兼容性

1. Cortex-M与Linux的兼容性解析作为一名在嵌入式领域摸爬滚打多年的工程师&#xff0c;我经常被问到这个问题&#xff1a;"为什么我的STM32&#xff08;基于Cortex-M内核&#xff09;不能跑Linux&#xff1f;"要回答这个问题&#xff0c;我们需要从处理器架构和操作…...

【卷积神经网络作业实现人脸的关键点定位功能】

下面是完成这道题目的代码&#xff1a;import os import cv2 import numpy as np import pandas as pd import torch import torch.nn as nn from torch.utils.data import Dataset,DataLoader from torchvision import transforms import matplotlib.pyplot as plt1. 数据集定…...

foobox-cn个性化定制:打造你的专属foobar2000音乐界面

foobox-cn个性化定制&#xff1a;打造你的专属foobar2000音乐界面 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn 当你每天打开foobar2000时&#xff0c;是否希望看到的不只是一个播放器&#xff0c;…...