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

汽车之家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日

相关文章

  • 集成华为运动健康服务干货总览

    在接入华为运动健康服务的过程中你是否遇到过权限申请有困难、功能不会用的情况? 本期超强精华帖,一帖汇总集成华为运动健康服务你可能需要的各类干货,还不赶紧收藏起来!开发有困难,随时可查阅~ 如果你有感兴趣或想进一步了解的内容,欢迎进行留言,或查看华为运动健康文档获取更多详情! 权限申请篇 在申请运动健康服务的权限的过程中,你是否遇到这些疑惑:申请审核时长是多久…

    Android 2023年4月17日
    00
  • .NET Core部署到linux(CentOS)最全解决方案,常规篇

    本文为大家介绍使用 .NET Core部署到Linux服务器的方法,通过本文你将了解到Linux在虚拟机下的安装、Xshell,Xftp的使用方法、git在linux下的交互使用以及.net core在linux下的发布与运行全过程,本文皆在总结了一些经验与笔记在部署过程中遇到的一些问题,同时分享给大家,供大家参考,欢迎讨论交流。 1、Linux操作系统、X…

    C# 2023年4月28日
    00
  • 鲸鸿动能广告接入如何高效变现流量?

    广告是App开发者最常用的流量变现方法之一,当App拥有一定数量用户时,开发者就需要考虑如何进行流量变现,帮助App实现商业可持续增长。 鲸鸿动能流量变现服务是广告服务依托华为终端强大的平台与数据能力为开发者提供的App流量变现服务,开发者通过该服务可以在自己的App中获取并向用户展示精美的、高价值的广告内容,并从中获得广告收益。开发者集成鲸鸿动能服务进行广…

    Android 2023年5月11日
    00
  • Android 监听短信数据库过滤获取短信内容上传至服务器

    前言 Android 监听短信的方式有两种 1、监听短信数据库,数据库发生改变时回调。 2、监听短信广播 其中第二种方式由于国内各厂家的定制Android 可能导致无响应 目前测试 魅族 无法监听到短信广播 本文介绍第一种方式监听短信 一、创建Service前台服务 package com.iwhalecloud.demo.SMS; import andro…

    Android 2023年4月18日
    00
  • 【FAQ】关于华为推送服务因营销消息频次管控导致服务通讯类消息下发失败的解决方案

    一. 问题描述 使用华为推送服务下发IM消息时,下发消息请求成功且code码为80000000,但是手机总是收不到消息; 在华为推送自助分析(Beta)平台查看发现,消息发送触发了频控。 二. 问题原因及背景 2023年1月05日起,华为推送服务对咨询营销类消息做了单个设备每日推送数量上限管理,具体数量上限可以查看如下文档:不同应用类别的推送数量上限要求。 …

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

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

    Android 2023年4月18日
    00
  • 【原创】日语假名注音JpTextView

    支持日语假名注音的JpTextView 支持自动换行 支持自动宽高 支持一次标记或者总是标记 网上找了一下,发现没有类似的轮子,就自己造了一个源码:https://github.com/toukomine/JpTextView 1.引入依赖 代码已上传 mavenCentral仓库,在项目根目录的build.gradle的repositories节点加入以下…

    Android 2023年4月18日
    00
  • Viu联合华为HMS生态,共创影音娱乐新体验

    华为HMS生态携手流媒体平台Viu,为海外消费者打造精品移动娱乐应用体验,并助力提升流量变现能力。Viu在中东非、东南亚等16个国家及地区提供广告合作和付费会员服务,支持优质视频内容高清点播和直播。自2019年起,Viu在中东非区域与华为HMS生态开展一系列紧密合作,并在2022年实现47%的用户增长。 本次,华为邀请Viu中东非区域首席业务官Rohit D…

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