汽车之家Unity前端通用架构升级实践

yizhihongxing

汽车之家Unity前端通用架构升级实践

背景介绍

随着之家3D虚拟化需求的增加,各产品线使用Unity引擎的项目也越来越多,新老项目共存,代码维护成本也随之增加。代码质量参差加之代码规范仍没有完全统一产生高昂学习成本进一步加重了项目维护负担。

为应对这些问题,我们决定借助主机厂数科产品线销冠神器VR版本大升级为契机,开发一套移动端通用Unity代码框架,旨在统一Unity项目开发流程和规范,使不同项目开发人员能够快速上手业务开发,实现不同项目之间代码组件化复用,降低学习成本,提高项目的健壮性和复用性。

 

1.Unity 架构调研

Unity通用架构核心想帮助Unity开发人员加速项目开发效率。该架构的设计基于大量的经验和最佳实践,旨在使项目开发更加高效和规范化。通过使用通用架构,开发人员可以轻松地构建高质量、健壮和可扩展的项目,同时降低学习成本和维护成本。该架构的模块化设计也允许不同的项目之间实现组件复用,从而进一步提高开发效率。无论是初学者还是经验丰富的开发人员,使用Unity通用架构都可以获得更好的开发体验。

 

1.1

Unity与其他技术栈差异

与其他平台相比,Unity的技术生态相对较为有限,缺少许多开源项目的支持。此外,Unity项目的类型繁多,从重度MMRPG项目到轻度虚拟仿真,这本身就是整理出一套通用的基础架构十分困难的原因之一。与此同时,大多数基础功能都需要收费,而大型公司也很少开源他们的源代码。因此,与其他平台相比,Unity想要整理出一套通用前端技术框架确实面临着很多挑战。

 

1.2

业界常用开源Unity框架

 下面分析一下市面上常见的Unity架构,并列举不适合我们的原因。

 

►UnityGameFramework

UnityGameFramework使用一套UnityFramework和一套Gameframework对Unity进行了一次封装。

在封装的基础上做了一些方便开发者使用的扩展,如ECS/UI等功能。

图片
图片

 

►QFramework

QFramework 是提供一套简单、强大、易上手、符合 SOLID 原则、支持领域驱动设计(DDD)、事件驱动、数据驱动、分层、MVC 、CQRS、模块化、易扩展的架构。

图片

1.3

场景适用性思考

 以上两个架构已足够优秀,但是要集成到我们的技术栈中还是有很多挑战:

 

►UnityGameFramework

  • 这套架构太“重”了,使用A模块必须依赖架构内的B模块甚至C/D/E模块,只想使用简单的UI功能可能要把整套架构都迁移进来。

  • 太“重”也引起了修改一个模块会牵连很多其他模块的问题。

  • 适合需求明确的中重度游戏,商业化项目。

     

►QFramework

  • 学习成本较高,需要理解很多设计原则才可以上手使用。

  • 它与UnityGameFramework相比又太“轻”了,源码少,可魔改的余地少。适合小而精的项目。

►其他

  • 其他架构都缺少线上足够项目实际验证与配套的开源生态,健壮性与扩展性无法确保。

 

1.4

架构关注点思考

好的架构应该注重以下几个方面:

 

生命周期

  • 良好的生命周期设计,可以提供简单而高效的生命周期管理机制使开发人员在合适的时机创建、修改和销毁对象。

  • 生命周期感兴趣的同学可以深入了解一下Unity的MonoBehavior设计。

分层设计

  • 分层设计可以使代码解耦,将参考后端多种架构设计理念,MVC、DDD、洋葱架构等,免代码耦合,为提高架构防腐度,降低续的化和重构提的频率。

     

学习成本

  • 考虑到员工技能水平的参差不齐,学习成本是设计架构时最需要考虑的因素之一。,果架构过于“重”,那么就需要了解很多底层/中间层逻辑才能使用,且出现问题后也不易于修改。

     

上线验证

  • 如果一套架构已经通过多个项目的上线验证,那么就不太需要担心架构中还有未解决的问题。开源架构都会列出自己的产品案例。

 

2.之家Unity架构设计

综合上述总结,在设计Unity通用架构时重点考虑了分层设计,好的分层边界能降低学习成本提高复用性。

 

2.1

分层设计

汽车之家Unity通用架构采用四层设计:逻辑层、中间层、基础层和数据层。

 

►逻辑层

  • 逻辑层处理不同项目的交互逻辑,调用中间层和基础层功能。在逻辑层中,可以按照项目需求进行设计,而不需要考虑复用性。

  • 具体模型和数据功能通过调用底基础层和数据层接口现。

 

►中间层

  • 中间层对逻辑层和基础层进行封装,使得逻辑层调用更加清晰,基础层有更好的抽象环境。

  • 中间层又分为业务层和适配器层。业务层主要针对逻辑层进行封装和特殊处理,而适配器层则对基础层进行二次封装,组合多个基础层能力以应对复杂功能。

 

►基础层

  • 基础层对基础功能进行抽象,使用统一的接口设计,支持所有Unity项目。这一层可以使用市面上普及的解决方案如TMP/DoTween等。

  • 基础层应对功能抽象,不关心具体需求,具有良好的健壮性和可扩展性。

 

►数据层

  • 数据层用于后台存储、数据和模型信息等。只要使用同样的后台服务和美术规范,新的Unity项目就不需要对数据层再做兼容。

  • 如有特殊需求,也可以在中间层对数据层进行处理,参考洋葱架构设计。

 

2.2

架构图

以下是汽车之家Unity通用架构的架构设计图与销冠神器使用通用架构后的架构图:

 

►Unity通用架构图

图片

 

►销冠神器架构图

图片

 

2.3

代码示例

 以原生端通信功能为例,说明分层和复用性设计在架构中的体现。

这里ativeMessage是一个可以与原生端进行通信的模块。该模块负责向iOS和Android平台发送和接收消息,用于处理一些原生交互的逻辑。

基础层的NativeMessage在Plugin文件夹中,只有核心的发送消息和接受消息的能力

图片

中间层的XGNativeMessage在Scripts/Manager文件夹中,继承基础层并添加业务相关的设置。

图片
图片

逻辑层在Module或Controller中对中间层的XGNativeMessage进行调用

图片

大致流程如下:

图片

优势总结:

这种设计可以确保基础层有100%的复用性,使其可以方便地将其迁移至其他项目中使用。此外,中间层的封装可以集中处理发送消息的逻辑,从而避免在逻辑层中编写大量代码。

采用分层设计的具有很方便的升级和扩展性。如果需要对其中某一层进行升级,可以直接修改对应层级的代码,而不会影响其他层的功能。这使得系统更加灵活和可维护。

分层设计和复用性是非常重要的架构设计原则。在NativeMessage模块的设计中,成功应用了这些原则,使得该模块具有高度的可复用性和可维护性。

 

3.架构收益

通用架构1.0上线后,我们量化了架构收益:

 

代码质量 升20%

底层和中间层按照功能解耦,可以提高代码质量,也降低单个迭代SP的bug率20%以上。

 

开发效率 升30%

  • 按照相同的框架发可规范,高开单人力研发需求交付效率30%以上同时,不同项目组之间可以共享同一套底层功能,从而互相帮助和提高生产力。

  • 代码规范和模块拆分的方式符合Unity行业的通用解决方案,这可以帮助Unity开发人员更快地理解和掌握项目的架构设计和开发规范。

 

各项性能指标提升20%

  • 通过架构升级,不仅解耦了代码,还带来了其他收益。例如,将GLB升级为AssetBundle,可以显著降低内存占用量,并减少CPU负载30%以上。

  • 功能模块化设计使得我们可以更好地统计启动时各个阶段所占用的时间,并针对下载/加载等阶段进行优化,从而使启动时间降低了50%。

  • 这些优化措施可以进一步提高应用程序的性能和用户体验,提高产品的竞争力。

 

跨项目代码复用度提升50%

  • 通用架构需要支持之家的所有Unity项目,所以需要考虑不同项目中的代码复用。代码复用性可以根据分层由低到高来考虑,最底层的代码复用性越高。

  • 逻辑层复用率0%,因为每个项目的交互逻辑不同,过多考虑复用会引起很多问题。这一层不需要考虑复用性的设计。

  • 中间层复用率60%,中间层对逻辑层和基础层进行抽象和二次封装,应该在开发过程中尽量考虑复用性。至少适配器层要能快速地复用到其他项目中。

  • 基础层复用率100%,基础层抽象基础功能,只考虑功能而不关心业务。

  • 数据层复用率100%,数据层由后端提供,使用相同的服务和美术规范。

 

4.总结

分层设计降低了上手成本,只要逻辑层足够清晰简单,那么初级程序员就可以很容易的去写一些业务相关的功能,有能力的程序员可以持续为架构输出健壮的中间层和底层能力。逻辑层只采用最简单的状态机设计,如果之后业务需求复杂也可以扩展成分层状态机来实现复杂的业务需求。

 

5.经验分享

架构设计应该注重分层设计与上手成本,当这两点设计较好时,像易用性,复用性,解耦等优点就会自然出现。

分层设计可以让业务代码不会侵入功能代码,而学上手本低也会带来易维护,提效等好处。

 

6.引用

分享一下本文所引用的架构链接:

UnityGameFramework:

https://github.com/EllanJiang/UnityGameFramework

QFramework:

https://github.com/liangxiegame/QFramework

 

本人技术水平有限,文笔水平也有待提高,欢迎任何建议和意见。

本文使用ChatGPT帮忙检查语法和拼写错误,并提供优化建议以提高文章的流畅性和可读性。

 

作者|胡春源

原文链接:https://www.cnblogs.com/88223100/p/Practice-of-Upgrading-Unity-Frontend-Universal-Architecture.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:汽车之家Unity前端通用架构升级实践 - Python技术站

(0)
上一篇 2023年5月8日
下一篇 2023年5月11日

相关文章

  • 预约直播|3月30日下周四,应用促活大揭秘,快速提升DAU

    【导读】 日常运营过程中,消息推送是App触达用户的常用手段,无论是新功能的通知,还是活动的提醒,都可以通过推送告知用户。千人千面的个性化推送,对于提升用户粘性、用户转化等指标都具有明显正向效果。越来越多的应用选择华为Push用户增长服务作为拉新、促活的首选渠道,他们选择的理由是什么?他们又是如何持续提升用户月活量级并有效促进后端转化的? 本期直播《高效促活…

    Android 2023年4月17日
    00
  • 关于移动开发平台,你想知道的这些事

    近年来,移动开发平台如雨后春笋般蓬勃发展。这诸多的移动开发平台常常令人面临选择恐惧。今天就来同大家一块盘点一下,看看这些移动开发平台都有什么特点与优势,希望为有需要的开发者提供一定的参考。   需要特别说明的是,这里提到的移动开发平台与 Flutter、React Native 等移动开发框架还有一定的区别,更多是指为开发者提供从开发、测试、发布和运营整个生…

    Android 2023年4月18日
    00
  • Jetpack Compose学习(11)——Navigation页面导航的使用

    原文:Jetpack Compose学习(11)——Navigation页面导航的使用 – Stars-One的杂货小窝 在Android原生的View开发中的,也是有Navigation,原生我之后可能再出篇教程,今天讲解的则是compose版本的Navigation组件的使用 本系列以往文章请查看此分类链接Jetpack compose学习 说明 在原生…

    Android 2023年4月18日
    00
  • 我“重新”理解的云计算

    缘起 重新理解云计算,这个「重新」重点是对我自己而言的。 有这样的感受是来源于几个触点: 第一个触点是阅读了两篇非常有见解的文章,分别是道哥的《我对计算的理解》和吴军的《中国算力的危与机》; 第二个触点是最近阅读了王坚院士的《在线》这本书; 第三个触点是阿里云内部的AEPC考试,对阿里云产品体系有了一个更加全面完整的了解。 这三个触点学习下来,发现自己对云计…

    云计算 2023年4月18日
    00
  • 乐固加固、360加固后安装不了问题。

    腾讯云应用安全已在加固过程中删除签名信息,加固后的安装包需要重新签名。同样近期360加固助手签名设置也需要购买高级加固服务。在进行加固后我们需要手动签名cmd 手动签名 apksigner 1、检查签名文件*.jks或者*.keystore keytool -list -v -keystore 签名文件路径 -storepass 密码 注意有些历史比较悠久的…

    Android 2023年4月18日
    00
  • 当我第一次通过Kotlin和Compose来实现一个Canvas时, 我收获了什么?

    当我第一次通过Kotlin和Compose来实现一个Canvas时, 我收获了什么? 自从2019年Google推荐Kotlin为Android开发的首选语言以来已经经历了将近四年的时间, Compose的1.0版本也发布了将近2年的时间, Kotlin+Compose在现阶段的Android开发过程中还远远达不到主流的程度. 我们是否应该开始尝试这个组合?…

    Android 2023年4月27日
    00
  • .NET Core部署到linux(CentOS)最全解决方案,入魔篇(使用Docker+Jenkins实现持续集成、自动化部署)

    通过前面三篇: .NET Core部署到linux(CentOS)最全解决方案,常规篇 .NET Core部署到linux(CentOS)最全解决方案,进阶篇(Supervisor+Nginx) .NET Core部署到linux(CentOS)最全解决方案,高阶篇(Docker+Nginx 或 Jexus) 通过前面三篇文章的介绍,我们已经对.net co…

    C# 2023年5月3日
    00
  • 免费广告效果监测服务,实现全链路营销效果跟踪

    广告主们都希望以低预算获得更高的广告投放收益,在投放广告后,想要了解高回报的渠道,往往需要收集并分析繁杂的数据,耗时耗力。通过广告监测,广告主可以准确的追溯用户渠道来源,看到不同流量的用户价值,分析广告投放效果,从而指导广告的出价和投放素材的优化,把预算花在刀刃上。 针对广告主们广告监测的需求,华为分析服务提供免费的广告监测能力,为有广告监测需求的广告主节省…

    Android 2023年4月17日
    00
合作推广
合作推广
分享本页
返回顶部