一种基于Unity3D的App开发框架的制作方法

文档序号:20438712发布日期:2020-04-17 22:15阅读:528来源:国知局
一种基于Unity3D的App开发框架的制作方法

本发明涉及软件开发领域,尤其涉及一种基于unity3d的app开发框架。



背景技术:

一般unity3d开发,使用继承自monobehaviour的子类手动挂载到gameobject对象上,其中包含功能模块、数据持有、业务逻辑、交互逻辑、模型显示、刚体、物理等。

这种技术应用在小型项目,一定程度上提高了代码的复用性以及开发效率,但由于代码和美术资源的高度耦合,在大型项目迭代开发过程中,多人同时编辑同一个gameobject对象或者prefab对象容易导致git仓库冲突,在美术资源发生更改时,需要重新手动挂载脚本,影响开发效率;大量脚本继承自monobehaviour,降低软件整体的执行/编译效率。

注:

gameobject:unity3d引擎中定义的游戏对象类型;

monobehaviour:unity3d引擎中可挂载到gameobject上的组件;

prefab:unity3d引擎中预设的gameobject成为预制体,包含子游戏对象,组件及组件预设的数据;

git:一种开源的分布式版本控制系统。



技术实现要素:

为了解决上述问题,本发明提供了一种基于unity3d的app开发框架;

一种基于unity3d的app开发框架,由自定义的fw单例类使用多态方法注入多个自定义模块组成,在开发过程中仅需将所述fw单例类挂载至编辑器,无需将所述fw单例类中注入的多个自定义模块单独挂载到场景中,以减少app程序运行消耗以及挂载过程中的误操作;

所述多个自定义模块包括:快捷键模块mkey、界面模块mui、长连接网络模块mconn、命令模块mcmd、系统模块msystem和实体模块mentity;

所述快捷键模块mkey,用于按事件名称绑定键盘按键到事件回调函数,便于自定义键盘按键;

所述界面模块mui,用于绑定实现iui接口的界面类到界面预制体资源,加载界面类实例时,自动加载对应的界面预制体资源并完成初始化,无需将界面脚本挂载到界面预制体资源;

所述长连接网络模块mconn,用于管理实现iconn接口的长连接类,向指定服务器发送消息并接收服务器反馈的消息;

所述命令模块mcmd,用于按命令名注册命令类,并执行对应的命令;

所述系统模块msystem,用于注册或者移除系统,并提供各系统的功能api,实现icmd接口类的调用;其中,所述系统为实现isystem接口的类;

所述实体模块mentity,用于注入实体工厂类,以管理所有的实体对象,并通过工厂类组装或者卸载实体对象的实体组件;其中,所述实体工厂类为实现ientityfactory接口的类;所述实体组件为实现icomponent接口的类,持有不同功能需要的数据,并能广播数据变化的事件;

所述一种基于unity3d的app开发框架的使用原理,具体包括如下步骤:

s101:所述快捷键模块mkey捕获用户键盘输入,所述界面模块mui捕获鼠标输入或者长连接网络模块mconn接收的消息;

s102:unity3d根据所述键盘输入、鼠标输入或者网络模块mconn接收的消息,通过调用命令模块mcmd中注入的命令调用所述系统模块msystem中注入的对应系统;其中,所述命令为实现icmd接口的类;

s103:对应系统的系统api函数通过所述实体模块mentity获取需要的实体,改变相应实体和实体组件的相关功能数据;所述实体为实现ientity接口的类;

s104:所述实体或者实体组件广播该数据更改事件,所有注册该数据更改事件的监听者执行相应回调函数;所述监听者包括界面、演员和演员组件;

其中,所述演员为实现iactor接口的类,所述演员组件为实现iactorcomponent接口的类,所述界面为实现iui接口的类。

进一步地,所述fw单例类为自定义的类,用于通过模式注入unity3d内置的模块或者注入自定义模块,并管理所有的模块;所述模式为实现imode接口的类;

进一步地,所述imode接口,为初始化fw单例类内置模块的接口。

进一步地,所述icmd接口,为命令接口,用于实现该接口的类注入到所述mcmd模块中,实现调用相关系统的方法;

所述isystem接口,为系统接口,用于实现该接口的类注入到所述msystem模块中,实现改变实体entity或者实体组件component的相关数据;

所述ientity,为实体接口,内置entity类实现该接口,持有各实体的基础数据;所述基础数据包括实体的空间位置数据、方向数据和缩放数据;

所述icomponent接口,为实体组件接口,该接口持有各实体组件各功能的数据,用于派发事件以及改变事件;

所述iactor接口,为演员接口,内置actor类实现该接口,用于监听ientity数据变化;

所述iactorcomponent接口,为演员组件接口,用于实现演员的显示和交互逻辑;

所述iui接口,为界面接口,用于实现界面的交互逻辑及数据更新;

所述ientityfacory接口,为实体工厂接口,用于组装实体对象的实体组件;

所述iconn接口,为长连接接口,用于处理消息包的粘包和分包、编码和解码、加密和解密。

进一步地,所述自定义模块还包括:

对象池模块mpool:用于按类型或标签注册对象池,使对象实例可复用,减少系统垃圾回收消耗;

日志模块mlog:用于将日志分为5个等级,分别为:debug、info、warn、error和fatal;

计时器模块mtimer:用于传入计时时长,重复次数以及触发回调,简化传统基于unity3d引擎内置的time.detaltime计时。

进一步地,所述自定义模块还包括:

消息模块mnotice:用于注入指定消息名的回调函数,当派发消息时,将数据传入所有注册该消息的回调函数;

全局数据模块mdata:用于管理应用开发中的全局数据;

版本更新模块mver:用于校验本地资源和服务端资源版本,并对本地资源进行增量更新,无需重新下载整个程序。

进一步地,所述自定义模块还包括:

断点续传模块mresume:用于从服务器下载文件;;

场景模块mscene:用于管理unity3d中的场景文件的加载或者卸载,绑定场景组件到场景中的游戏对象;

音频模块maudio:用于封装unity3d的音频播放,设置音频监听对象,播放音源,设置音频混合器级设置快照;

语言本地化模块mi18n:用于通过配置文件中的本地化语言配置;

命令记录模块mrecorder:用于记录命令的执行顺序和时间,可以撤销或者重做命令,将命令序列化重现用户的操作;

进一步地,所述自定义模块还包括:

实体组件模块mcomponent:用于管理所有的实体组件,并使用对象池创建或者回收实体组件;

演员模块mactor:用于注入演员工厂类,管理三维显示对象,并通过工厂类组装或者卸载显示对象的演员组件actorcomponent;所述演员工厂类为实现iactorfactory接口的类;所述演员组件actorcomponent为实现iactorcomponent接口的类,包含美术资源模型的显示、用户交互处理、物理属性、注册实体组件的数据变化事件的更新显示;

演员组件模块mactorcomponent:用于管理所有演员组件。

进一步地,所述iactorfactory接口,为演员工厂接口,用于根据实体对象以及实体组将组装演员组件。

本发明提供的技术方案带来的有益效果是:本发明所提出的技术方案适用于严肃游戏类应用,该类型应用结合传统教育类和传统游戏类应用,既有教育类复杂的数据结构以及业务逻辑也有游戏类应用的丰富ui交互及三维图形显示,本申请所提出的技术方案解耦了用户界面、三维显示对象、业务逻辑、数据模型,同时提高了开发效率,具有良好的可扩展性,健壮性。

附图说明

下面将结合附图及实施例对本发明作进一步说明,附图中:

图1是本发明实施例中一种基于unity3d的app开发框架的结构图;

图2是本发明实施例中一种基于unity3d的app开发框架的总体使用原理流程图;

图3是本发明实施例中的具体操作示意图。

具体实施方式

为了对本发明的技术特征、目的和效果有更加清楚的理解,现对照附图详细说明本发明的具体实施方式。

本发明的实施例提供了一种基于unity3d的app开发框架;请参考图1,图1是本发明实施例中一种基于unity3d的app开发框架的结构图;

所述一种基于unity3d的app开发框架基于unity3d,由自定义的fw单例类使用多态方法注入多个自定义模块组成,在开发过程中仅需将所述fw单例类挂载至编辑器,无需将所述fw单例类中注入的多个自定义模块单独挂载到场景中,以减少程序运行消耗以及挂载过程中的误操作;

其特征在于:所述多个自定义模块包括:快捷键模块mkey、界面模块mui、长连接网络模块mconn、命令模块mcmd、系统模块msystem和实体模块mentity;

所述快捷键模块mkey,用于按事件名称绑定键盘按键到事件回调函数,便于应用中可以自定义键盘按键;

所述界面模块mui,用于绑定实现iui接口的界面类到界面预制体资源,加载界面类实例时,自动加载对应的界面预制体资源并完成初始化,无需将界面脚本挂载到界面预制体资源;

所述长连接网络模块mconn,用于管理实现iconn接口的长连接类,向指定服务器发送消息并接收服务器反馈的消息;

所述命令模块mcmd,用于按命令名注册命令类,并执行对应的命令;

所述系统模块msystem,用于注册或者移除系统,并提供各系统的功能api,便于实现icmd接口类的调用;其中,所述系统为实现isystem接口的类;

所述实体模块mentity,用于注入实体工厂类,以管理所有的实体对象,并通过工厂类组装或者卸载实体对象的实体组件;其中,所述实体工厂类为实现ientityfactory接口的类;所述实体组件为实现icomponent接口的类,持有不同功能需要的数据(例如:设备的型号、参数、重量、最大电压、电流和功率等),并能广播数据变化的事件;

请参考图2,图2是本发明实施例中一种基于unity3d的app开发框架的总体使用原理流程图,具体包括如下步骤:

s101:所述快捷键模块mkey捕获用户键盘输入,所述界面模块mui捕获鼠标输入或者长连接网络模块mconn接收的消息;

s102:unity3d根据所述键盘输入、鼠标输入或者网络模块mconn接收的消息,通过调用命令模块mcmd中注入的命令调用所述系统模块msystem中注入的对应系统;其中,所述命令为实现icmd接口的类;

s103:对应系统的系统api函数通过所述实体模块mentity获取需要的实体,改变相应实体和实体组件的相关功能数据;所述实体为实现ientity接口的类;

s104:所述实体或者实体组件广播该数据更改事件,所有注册该数据更改事件的监听者执行相应回调函数(显示逻辑);所述监听者包括界面、演员和演员组件;

上述命令无需关心更改该数据会影响哪些监听者,实际开发过程中界面及美术模型的更改或者调整(即演员组件),甚至重构相对比较频繁,原有开发模式每次更改都得手动大批量的在界面和其他美术资源上挂载功能代码,然后设置交互事件指向的业务逻辑;

其中,所述演员为实现iactor接口的类,所述演员组件为实现iactorcomponent接口的类,所述界面为实现iui接口的类。

对上述的各接口进行如下解释:

所述fw单例类为自定义的一个类,用于通过模式注入unity3d内置的模块或者注入自定义模块,并管理所有的模块;所述模式为实现imode接口的类;

所述imode接口,为初始化fw单例类内置模块的接口;

所述icmd接口,为命令接口,用于实现该接口的类注入到所述mcmd模块中,实现调用相关系统的方法;

所述isystem接口,为系统接口,用于实现该接口的类注入到所述msystem模块中,实现改变实体entity或者实体组件component的相关数据;

所述ientity,为实体接口,内置entity类实现该接口,持有实体的基础数据;所述基础数据为实体的空间位置、方向和缩放;

所述icomponent接口,为实体组件接口,该接口持有实体的分类数据,可派发事件改变事件;

所述iactor接口,为演员接口,内置actor类实现该接口,用于监听ientity数据变化,及更新基础显示;

所述iactorcomponent接口,为演员组件接口,用于实现演员的显示、交互逻辑等;

所述iui接口,为界面接口,用于实现界面的交互逻辑及数据更新;

所述ientityfacory接口,为实体工厂接口,用于组装实体对象的实体组件;

所述iactorfactory接口,为演员工厂接口,用于根据实体对象以及实体组将组装演员组件。

所述iconn接口,为长连接接口.用于处理消息包的粘包\分包,编码\解码,加密\解密等基础功能。

所述自定义模块还包括:

线程池模块mthread:基于c#线程池封装,该模块用于将比较耗时的业务逻辑(例如寻路算法,电流电压的仿真计算等),计算完成后,将结果返回到主线程,避免降低主线程的帧率;

主线程异步模块masync:将unity3d引擎中无法在子线程使用的类型的批量业务逻辑(例如gameobject,texture2d等类型),分摊到帧上计算,避免单帧运算量过大,导致降低主线程帧率;

对象池模块mpool:按类型或标签注册对象池,是对象实例可复用,减少系统垃圾回收消耗;

日志模块mlog:日志分为5个等级,分别为:debug、info、warn、error和fatal;可注入不同日志类(例如编辑器打印日志、保存文本日志和邮件日志);

计时器模块mtimer:传入计时时长,重复次数以及触发回调,简化传统基于time.detaltime计时;

短连接模块mhttp:简化unity的http请求相关的调用,并可模拟服务器响应,方便测试;

消息模块mnotice:注入指定消息名的回调函数,当派发消息时,将数据传入所有注册该消息的回调函数,利于代码的解耦;

全局数据模块mdata:管理应用开发中全局数据的管理;

资源模块masset:基于unity3d官方的addressables资源管理系统,加载资源,实例化资源等;

版本更新模块mver:校验本地资源和服务端资源版本,增量更新;

断点续传模块mresume:主要用于从服务器大更新时下载文件;其中,大更新需要更新的资源大于或者等于1g,在网络中断再次连接后能继续下载文件,不用重新下载,以节省服务器流量及用户的下载时间;

场景模块mscene:管理unity3d中的场景文件(.scene)加载\卸载,可绑定场景组件(scenecomponent)到场景中的游戏对象(gameobject),当场景加载完成后触发场景组件的初始化,不需要将代码手动挂载到场景,降低场景资源和代码的耦合;

音频模块maudio:封装unity3d的音频播放,可设置音频监听对象,播放音源,设置音频混合器级设置快照;

语言本地化模块mi18n:通过配置文件中的本地化语言配置,适用不同国家地区;

命令记录模块mrecorder:记录命令的执行顺序和时间,可以撤销/重做命令,将命令序列化重现用户的操作;

状态机模块mfsm:内置一个主状态机控制应用的主流程状态,也可自定义子状态机控制子流程状态;

实体组件模块mcomponent:管理所有的实体组件,并使用对象池创建\回收实体组件;

演员模块mactor:注入演员工厂类,管理三维显示对象,并通过工厂类组装\卸载显示对象的演员组件actorcomponent;所述演员工厂类为实现iactorfactory接口的类;所述演员组件actorcomponent为实现iactorcomponent接口的类,包含美术资源模型的显示、用户交互处理、物理属性、注册实体组件的数据变化事件的更新显示;

演员组件模块mactorcomponent:管理所有演员组件。

在本发明实施例中,以添加设备到背包和从设备背包中拖拽设备到三维场景渲染为例,对本发明所提出的技术方案做详细描述:

如图3所示,在设备添加到背包时,三维场景是不需要渲染该设备,但可以设置设备的相关参数,具体业务流程步骤如下:

1、用户在设备库界面点击添加设备按钮,设备库界面类使用mrecorder记录模块通过命令名获取添加设备实体的记录类relementadd(实现irecorder接口,genertateundo函数返回一个删除该设备实体的lambda表达式)实例执行记录;传入参数有命令名,设备id和设备类型:

vardata=newdata<string,string>{data0:“设备id”,data1:“设备类型”};

fw.recorder.record(“elementadd”,data);

程序初始化时,预先使用fw.recorder.bindrecorder<relementadd>()wheret:irecorder,new()方法,将relementadd类实例的generateundo方法绑定名到“elementadd”命令名,generateundo方法的签名为;actiongenerateundo(objectdata),即传入数据,返回一个用于撤销该命令的lambda表达式;所述irecorder接口,为命令记录接口,用于命令的撤销与重做,序列化或者反序列化;

将relementadd.generateundo返回的lambda表达式放入撤销堆栈,并将命令名和data放入重做堆栈;

2、使用mcmd命令模块通过命令名获取添加设备实体命令类cmdelementadd(实现icmd接口)实例并执行命令.传入命令名,设备id和设备类型

fw.cmd.execute(“elementadd”,data);

程序初始化时,预先使用fw.cmd.bindcmd<cmdelementadd>()wheret:icmd,new()方法,将cmdelementadd的execute方法绑定到“elementadd”命令名;

将命令数据转为需要的数据:

vardata=(data<string,string>)noticedata;

varelementid=data.data0;

varelementtype=data.data1;

cmdelementadd.execute执行systemelemententity系统api;

3、使用msystem系统模块获取systemelemententity设备实体系统(实现isystem接口)生成设备实体,并添加到实体列表;

fw.system.getsystem<systemelemententity>.addelement(elementid,elementtype);

varentity=fw.entity.spawnentity(elementid,“element”,elementtype);

idtoentity.add(elementid,entity);

4、mentity模块设置entity基础数据,并使用注入的entityfactory实体工厂(实现ientityfactory接口)组装设备实体:

varentity=fw.pool.spawn<entity>();

entity.id=elementid;

entity.type=elementtype;

factory.assembleentity(entity);

5、entityfactory实体工厂使用设备id和设备类型组装设备实体;

entity.addcomponent<celemeentterminals>();

6、systemelemententity设备实体系统(实现isystem接口)实体列表数据发生改变,派发事件到背包界面,设备背包界面更新显示;

7、鼠标拖拽背包设备到三维场景中,使用mrecorder记录模块通过命令名获取添加设备演员的记录类实例执行记录;传入命令名,设备id;代码类似1;

8、使用mcmd命令模块通过命令名获取添加设备演员命令实例并执行命令;传入命令名,设备id;代码类似2;

9、使用msystem系统模块获取systemelementactor设备演员系统(实现isystem接口)生成设备演员,并添加到演员列表;

fw.system.getsystem<systemelementactor>.addelementactor(elementid,oncomplete);

varentity=fw.entity.getentity(elementid);

fw.actor.spawnactor(entity,actor=>{

idtoactor.add(elementid,actor);

oncomplete(actor);

});

10、mactor模块使用注入的actorfactory演员工厂(实现iactorfactory接口)组装演员:

factory.spawnactor(entity,oncomplete);

11、actorfactory演员工厂加载资源模型并设置actor基础数据,使用设备id组装设备演员:

varpath=paths.getelementprefab(entity.type);

fw.asset.instantiateasync(path,go=>{

varactor=go.getcomp<actor>();

actor.initentity(entity);

actor.addactorcomponent<actorcomponentdrag>();

oncomplete(actor);

});

12、实体列表数据发生改变,派发事件到scenecomponentactor设备演员场景组件(实现iscenecomponent接口),该组件将演员显示到场景中;

13、当用户按下ctrl+z组合键时,mkey快捷键模块触发mrecorder记录模块的撤销堆栈弹出最后一个lambda表达式并执行:

fw.recorder.undo();

14、当最后一个命令是添加设备实体时,弹出的lambda表达式对应的根据设备的id删除设备实体;

当最后一个命令是添加设备演员时,弹出的lambda表达式对应的根据设备的id删除设备演员;

15、当用户按下ctrl+y组合键时,mkey快捷键模块触发mrecorder记录模块的重做堆栈弹出最后一个命令名和数据,并重新记录命令:

fw.recorder.redo();

16、当最后一个被撤销的命令是添加设备实体时,弹出的添加设备实体命令名,设备id,设备类型重新记录命令;

17、当最后一个被撤销的命令是添加设备演员时,弹出的添加设备演员命令名,设备id重新记录命令。

本发明的有益效果是:本发明所提出的技术方案适用于严肃游戏类应用,该类型应用结合传统教育类和传统游戏类应用,既有教育类复杂的数据结构以及业务逻辑也有游戏类应用的丰富ui交互及三维图形显示,本申请所提出的技术方案解耦了用户界面、三维显示对象、业务逻辑、数据模型,同时提高了开发效率,具有良好的可扩展性,健壮性。

以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1