高手问答第 314 期 —— 聊聊 Unity 与原生桥接

小白兔爱吃大灰狼 发布于 03/19 15:58
阅读 3K+
收藏 1

武汉源创会回归,4月20聊聊大模型”

Unity技术作为一项跨平台开发引擎,在游戏领域表现出色的同时,也在横跨混合现实、虚拟社交等多个领域大放异彩。其技术地位不断凸显,成为开发者追逐的热门技能之一。

对于初次进行Unity桥接的Android和iOS开发者来说,他们可能会面临原生层面的诸多挑战。如何保证通信接口的一致性、处理应用内多个Unity视图的渲染、以及建立高效的调试流程等问题,成为他们面对和解决的关键挑战。掌握这些关键技能和知识将为他们顺利进行Unity桥接开发提供重要支持。

OSCHINA 本期高手问答 (3 月 20 日 - 3 月 26 日) 我们请来了单好强老师和大家一起聊聊Android、iOS开发者在Unity桥接开发过程中有哪些关键技能。

可讨论的问题包括但不限于:

  • Unity在混合项目中的接入编译面临哪些挑战?
  • Unity与Android、iOS桥接的通信中遇到的挑战有哪些?
  • Unity在原生实现多个视图实例中遇到的挑战有哪些?
  • Unity与原生调试时,在提高调试效率上面临的挑战有哪些?

其他关于 Unity与原生桥接的更多内容,也欢迎积极提问。

嘉宾介绍

单好强,荔枝集团业务架构客户端负责人,在跨平台技术领域拥有丰富的研究和实践经验。他负责搭建跨端技术的基础设施和业务支持系统,致力于推动跨平台技术的应用和发展。

为了鼓励踊跃提问,荔枝集团会在问答结束后从提问者中抽取 5 名幸运会员赠予赛嘉电动牙刷(型号:SG-659)。

 

OSChina 高手问答一贯的风格,不欢迎任何与主题无关的讨论和喷子。

下面欢迎大家就 “Unity与原生桥接 相关问题向单好强老师提问,直接回帖提问既可。

加载中
0
小白兔爱吃大灰狼
小白兔爱吃大灰狼

高手问答第 314 期 —— 聊聊 Unity 与原生桥接 

@ggzone @开源中国胖纸 @clearsky1991 @apple-12345  @hi懒喵

恭喜以上5位网友分别获得  电动牙刷 一个。

请于2024年4月02日23点前登陆账号, 私信  @小白兔爱吃大灰狼   告知快递信息(格式:姓名+电话+地址),过期视为自动放弃哦~

0
拔个萝卜
拔个萝卜

@ethan_shan 老师请问在实现桥接时,如何确保应用的安全性?有哪些安全措施或策略需要特别注意?

ethan_shan
ethan_shan
Unity与原生通信通常是在同一个进程内进行的,因为它们在同一个应用程序中运行。在这种情况下,使用Unity官方提供的桥接机制通常是安全的,因为它们经过了官方的设计和测试,以确保安全性和稳定性。 此外,为了确保Unity与原生之间的通信稳定和高效,通信接口的一致性非常重要。基于接口定义语言(IDL)生成多端代码通信的实现是一个非常好的做法,可以帮助确保通信接口在各个端之间的一致性,并提高开发效率。
0
兰若寺
兰若寺

@ethan_shan  你好,请问,Unity与原生调试时候,代码更新后,热部署问题怎样可以达到最大效率?

ethan_shan
ethan_shan
推荐使用YooAsset这种成熟的系统,在Unity项目中集成YooAsset提供的SDK。客户端代码中调用YooAsset提供的接口,用于检查最新的资源版本、下载更新的资源包等。在后台管理系统中管理资源和版本,包括上传新版本的资源、配置资源更新策略等。YooAsset可以提供工具或接口,用于打包项目资源并上传到后台服务器。每次有新版本的资源更新时,打包资源并上传到后台。
0
南方Go
南方Go

@ethan_shan   1.Unity 在混合项目中的接入编译面临哪些挑战 ,你怎么看java,spring 和Unity  项目的结合,混编??

2.Java后端工程师想从事 游戏相关行业,应该怎么切入,需要学习Unity 开发吗?有推荐吗?

3. Unity 与 Android、iOS 桥接的通信中遇到的挑战有哪些? 例如和平精英中的,百人,这个游戏通讯怎么做到事务一致性?会出现脏读和幻读的情况吗?

4.如果是大一的小白需要学习Unity 开发有什么建议??

ethan_shan
ethan_shan
项目混编需要搭建一套自动化构建流程,导出工程并编译成客户端产物进行集成,同时建立一套通信流程,能够进行高效的调试。 另外在混编项目中,由于Unity引擎只有一个主视图实例,在项目多处用到Unity页面嵌入的情况,就需要使用纹理共享的方案。Unity把渲染页面的纹理写入到内存并发送给客户端纹理ID,客户端通过纹理ID实时渲染出页面视图。
ethan_shan
ethan_shan
学习Unity开发路径,建议以线上课程为主,官方资料和社区问答为辅,并找一些开源项目来练手。
0
开源中国胖纸
开源中国胖纸

@ethan_shan 请问老师,在Unity和原生代码之间进行数据传输时,如何最大程度地减少性能开销?

ethan_shan
ethan_shan
在可能的情况下,使用异步通信可以提高通信的效率,避免因为等待数据传输而造成的性能瓶颈。尽量避免频繁地进行数据传输,可以通过缓存数据或使用数据预加载等方式来减少数据传输的次数,从而降低性能开销。
ethan_shan
ethan_shan
Unity和原生可以通过插件和底层API调用通信,或者使用FFI进行调用。使用二进制格式减少数据大小和传输时间。尽量只传输必要的数据,避免传输大量无用的数据。使用简单的数据结构和数据类型,避免嵌套过深或包含大量字段的复杂数据结构。尽量将多个数据项打包成一个批次进行传输,而不是逐个传输,可以减少通信的开销。
0
ggzone
ggzone

@ethan_shan 您好,Unity 与原生桥接时调试、分析方面有没有系统性的资料能推荐一下

ethan_shan
ethan_shan
Unity与原生桥接调试首先要建立一套自动化构建的流程。过程可以大致分为以下几个步骤,每个步骤都可能涉及到不同的问题和挑战: Unity导出原生工程、处理Unity原生工程、Unity原生工程编译成产物并接入主工程、实现Unity与原生工程的通信。相关步骤的资料可在官方文档上查看。
0
e
ericyan1

@ethan_shan

单老师,您好,

1.请问 Unity对浏览器是否至支持 呢 ?
2.国产鸿蒙系统 未来是否有可能支持Unity呢?

ethan_shan
ethan_shan
Unity 支持在浏览器中运行,通过 Unity 的 WebGL 构建目标实现。 将 Unity 项目转换为可在支持 WebGL 的现代 Web 浏览器中运行的 JavaScript 应用程序。 至于鸿蒙系统的支持,根据官方的产品介绍,发布的团结引擎创世版,新增OpenHarmony目标平台。可以通过团结引擎轻松构建出能有运行在OpenHarmony操作系统的游戏。
0
ethan_shan
ethan_shan

引用来自“拔个萝卜”的评论

@ethan_shan 老师请问在实现桥接时,如何确保应用的安全性?有哪些安全措施或策略需要特别注意?

Unity与原生通信通常是在同一个进程内进行的,因为它们在同一个应用程序中运行。在这种情况下,使用Unity官方提供的桥接机制通常是安全的,因为它们经过了官方的设计和测试,以确保安全性和稳定性。

Unity提供了多种原生通信的方式,包括使用插件、调用原生库或使用Unity的底层API等。这些方法都有官方文档和指导,遵循官方推荐的实践通常可以确保通信的安全性。参考Unity官方文档 - iOS插件 Unity官方文档 - Android插件 Unity官方文档 - 原生插件

然而,即使是在同一个进程内通信,仍然需要注意一些安全方面的问题,比如数据验证、异常处理等。此外,如果涉及到敏感信息或权限较高的操作,仍然需要谨慎处理,确保不会有安全漏洞被利用。

此外,为了确保Unity与原生之间的通信稳定和高效,通信接口的一致性非常重要。基于接口定义语言(IDL)生成多端代码通信的实现是一个非常好的做法,可以帮助确保通信接口在各个端之间的一致性,并提高开发效率。

  1. 定义通信接口:首先,在一个中立的地方,定义Unity与原生之间的通信接口,包括发送和回调的方法、通信类型、数据结构等。这个接口可以使用IDL来描述,以确保统一和规范。

  2. 生成多端代码:根据通信接口的IDL定义,编写一个IDL解析器或代码生成器,可以将IDL文件解析成对应的代码,并生成多端的通信代码,包括Unity端和原生端的代码。对于Unity端,生成C#代码;对于原生端,生成相应平台的原生代码(如Android的Java代码或iOS的Objective-C代码)。

  3. 序列化和反序列化:在生成的代码中,确保数据结构的序列化和反序列化方式一致,可以使用统一的序列化库或协议(如JSON、Protobuf等),以确保数据在不同端之间的传输和解析正确。

  4. 接口匹配和类型匹配:生成的代码中,确保发送和回调的方法名称和参数类型与接口定义一致,以及通信类型的匹配(如同步调用或异步回调)。这样可以保证在Unity与原生之间的通信过程中,方法调用和数据传递的正确性和一致性。

  5. 生成工具和流程集成:将IDL解析器或代码生成器集成到开发工具链中,使得在更新通信接口时可以自动地生成对应的多端通信代码,提高开发效率和代码质量。

通过这样的实现,可以确保Unity与原生之间的通信接口在多端之间的一致性,减少了手动编写和维护通信代码的工作量,同时提高了通信代码的可靠性和稳定性。

 
 
 
 
0
ethan_shan
ethan_shan

引用来自“ggzone”的评论

@ethan_shan 您好,Unity 与原生桥接时调试、分析方面有没有系统性的资料能推荐一下

Unity与原生桥接调试首先要建立一套自动化构建的流程。过程可以大致分为以下几个步骤,每个步骤都可能涉及到不同的问题和挑战:
1、Unity导出原生工程:
https://docs.unity3d.com/cn/2022.3/Manual/PublishingBuilds.html
在这一步骤中,Unity项目通常会导出为原生工程,以便在原生开发环境中进行进一步的处理和集成。
这可能涉及到针对不同平台的适配和配置,确保导出的原生工程能够在对应的开发环境中顺利编译和运行。

2、处理Unity原生工程:
在这一步骤中,可以编写脚本对工程修改包名,添加桥接文件,修改工程配置,处理工程编译选项等。
通过编写脚本或手动操作对工程进行一些修改和配置,以满足后续编译产物的需求。

3、Unity原生工程编译成产物并接入主工程:
将Unity导出的原生工程编译成相应平台的产物,如Android的AAR文件或iOS的Framework文件,并在私有的Maven或CocoaPods仓库中发布,将其集成到主工程中。

4、实现Unity与原生工程的通信:
在集成完成后,需要实现Unity与原生工程之间的通信。这可能涉及到不同的通信方式,如使用插件、调用原生库、使用底层API等。

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部