U3d跨场景开发解决方案

2024-03-15 14:58
文章标签 解决方案 开发 场景 u3d

本文主要是介绍U3d跨场景开发解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

摘要

     需要说明的是,本人也不确定跨场景开发这个词是会出现怎样的歧义。简单的说,就是多人合作的升级,不再是多个人在一个Project目录下各负责某个模块,而是一部分人负责某一个工程。将工程分为不同的类型,以便于程序的扩展和维护。有些时候调整其中一个工程就可以实现变化,这样的划分的意义将凸显。设想有如下的场景:你有一个逻辑完善的程序框架,其中部分资源经常需要调整,或则是这部分资源调整就可以实现完全不同的关卡。而你只需要通过加载不同的配制信息,不改变任何逻辑就可以满足需求。此时,你应该会意识到,部分资源不应该放在逻辑程序中,而应该封闭起来,需要的时候加载出来。这样不仅维护了资源配制的安全性,还体现了程序的可扩展能力。

目录

    也许本文的解决方案不是最好的,但确实已经在项目开发中使用,在这里介绍给有相同需求的同仁,希望对其有所启发。下面是关键的几个点:

        1.好好利用unity3d自身的优势

        2.资源自动关联是本方案的核心

        3.共享内嵌同步版本

        4.资源发布及资源加载方案


一、好好利用unity3d自身的优势

    unity3d是一个基本脚本的引擎,其中一个脚本开发的好,可以用在多个对象上,只需要修改部分参数就可以实现不同的显示和逻辑等效果。正是因为这样,资源和代码的关系并不是传统游戏那个分离。有很多文章建议回到传统的开发方案上一,将资源和代码分离,用到的时候在加载资源。但这样明显是十分困难的,毕竟游戏引擎就应该让问题变得简单而不是让人烦恼。为此还是需要坚定对prefab的信念,提升使用prefab的能力。而prefab的加载中的三种方案只有一种可以满足跨工程,那就是AssetBundle。

二、资源自动关联是本方案的核心

    Assetbundle的打包后,可以利用WWW脚本加载出来,但脚本却不好处理。实际上逻辑需要改变的程序,可以加载lua脚本来实现,或直接使用反射来实现脚本动态。本文不做热更新任何说明,因为这个解决方案不涉及脚本的更新,且适用所有的平台。在一个工程中配制好之后凭什么可以在另一个有相同脚本的工程中自动进行关联?那就是GUID,每一个导入到unity3d 的Asset目录下的文件都会生成一个.meta文件,除非你设置了隐藏。这个.meta文件就记录了资源的关联信息。如果你希望在资源自动关联,那么请确保两个工程中的.meta文件是相同的。

三、共享内嵌同步版本

   预制体和脚本的关联,非和脚本的名字进行关联。都是和.meta中的GUID进行关联,你需要做的仅仅是将需要保存信息和配制的脚本放置到一个版本库中,在资源工程和逻辑工程中进行共享。那么.meta就自动可以同步了。值得注意的是unity的控制台有没有提示guid重复的黄色警告,如果有,就要小心.meta被重写和资源关联丢失的问题了。共享版本的最大问题当然不是这个,而是你的资源工程应该尽量删除不直接需要的库引用,而没有这些库或是代码,共享的代码必然要报错!此时,不要惊慌,因为在资源项目中并不需要执行这些代码。所以注释掉就好了,但注释也有讲究,不是//也不是/**/,而是利用宏定义,确保在你的逻辑工程中,这些代码并没有被注释。

四、资源发布及资源加载方案

   以上的三个点理解了就可以做你自己的跨场景开发了,但实际上使用不同工程的资源包还需要一个资源加载的工具,这个工具可以在unity AssetStore 上下载免费或付费的,但目前应该没有一个和本方案贴切的加载及发布工具。所以为实现这样的一套流程,本人也有常规的资源打包器和资源加载器上进行了一定的修改,可见github。主要的功能就是可以定义多个长期保存的发布规则,每个规则中需要打包的资源不尽相同。具体打包那些资源就看你的用户需要了。

五、后续

   1.动态添加资源包设想

         由于以上的方案中是直接在从资源路径加载,所以只需要修改配制就可以实现不同的关卡加载。如果你能把用户需要的资源制作成一个压缩包如zip,那么程序就可以实现从这个资源包中解压后更新到你的程序中。而你的逻辑工程没有进行任何改变,这样你的程序也不需要进行任何打包,用户只需要到你的商店购买相应的资源就可以进行其他效果的体验。

   2.如果需要选择性打包,可以参考这个工程:CrossProject



这篇关于U3d跨场景开发解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/812352

相关文章

jupyter代码块没有运行图标的解决方案

《jupyter代码块没有运行图标的解决方案》:本文主要介绍jupyter代码块没有运行图标的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录jupyter代码块没有运行图标的解决1.找到Jupyter notebook的系统配置文件2.这时候一般会搜索到

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

Linux samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An