Unity工程无代码化

目的

Unity默认是将代码放入工程,这样容易带来一些问题。
1. 代码和资源混合,职能之间容易互相误改。
2. 当代码量膨胀到一定程度后,代码的编译时间长到无法忍受。新版的unity支持通过asmdef来将代码分成多个dll工程,有所缓解。

所以,我们可以将代码全部挪到Unity工程之外,将代码编译成dll,然后把dll以managed plugin的方式放入unity工程。

 

实现

那么,我们怎么组织代码工程呢。先看下unity的vs tool自动生成的工程格式。

 

 

Assembly-Csharp: Scripts下的代码

Assembly-Csharp-Editor: Editor下的代码

Assembly-Csharp-firstpass: Plugins\Scripts下的代码 (一般还有个Csharp-firstpass-editor的工程,此工程下为Plugins/Editor的代码)

Unity.2D.Spritexx:这个是笔者导入的Sprite2D的package,由于此package为unity内置,实际存放目录在Unity安装目录的 Data/Resources/PackageManager/Builtin下。非内置的在Library/PackagesCache目录下。

 

查看工程settings

首先需要打开查看权限,visual studio-option-tools for unity-general,将Access to project properties改成True。

 

 

  

 

具体的compilation symbols很长,这里就不贴出来了。

此时,我们直接将此工程拷贝到项目外面,然后批量修改csproj里的文件路径,右键build,将dll放入原工程,触发unity编译后,会出现很多重复定义的报错,没关系,这是因为dll和工程内的代码重复了。

直接删吗?不急,先备份下工程。

删除代码,报错消失。点play,所有功能消失,一大堆script missing的warning。

原有脚本的meta都被删除了,难怪。没办法,用文本全局替换下guid。

原始脚本的meta 类似这样

 

 

而dll内的脚本meta 类似这样

 

 

其中fileID为dll的guid,而guid为dll内class的id(class名字不变的情况下,此ID不会变)

批量替换后,点play,一切恢复正常。(此批量替换过程,理论上完全可以自动化)

至此,工作是否已经完成?

没有。

 

这时候打包,会提示dll reference了 UnityEditor.dll,怎么办呢? 查看project 的编译宏,果然有各种UNITY_EDITOR的宏。

看来需要在打包的时候,单独重新编译dll。

好在visual studio支持命令行打包dll,即msbuild。本地编译runtime的dll,命令行如下

Msbuild xx.csproj /t:Rebuild /p:DefineConstants=a;b;c;…

此处的defienConstants即为编译宏,覆盖了csproj里定义的define。依次将csharp和csharp-plugin编译。(Editor dll暂时忽略)

 

再次打包,成功。

 

但是此时 点击编辑器的play,你会发现有些功能发生异常(取决于代码),有些定义找不到了。原因是Editor的dll和Play的dll不兼容了(编译宏不一样)。所以为了编辑器运行正常,又得编译一遍play的dll。

 

此过程到此,感觉流程已经走通了。然而在发布到项目组正式开发流程之前,还有一些问题需要解决。

 

问题

  • 代码调试问题

vs调试 managed dll时,需要mdb文件。所以我们在编译dll时,需要手动生成mdb。可以从google上下载一个pdb2mdb,在post build时,自动生成mdb,并将mdb和dll拷贝到unity工程。(隔壁项目组说将pdb和dll放入工程,unity会自动生成mdb,但尝试了n次均失败,遂放弃unity自带的mdb功能)。

 

  • 编译宏问题

unity编译代码的宏,来自于几个地方:

a. Build setting defines

b. asmdef内的定义

c. unity内部的define(根据buildplayer传入的platform和buildoption来决定)

如果仅靠visual tools生成的工程里的define,显然不太实际。vs tools本身不负责编译dll,工程里的define仅仅为了方便代码编辑和代码自动补全。这部分可以查看 vs tools的源码(已经做成package了),vs tools是根据unity编译出的dll,去自动更新vs工程。而无代码化后的流程 其实是反过来了。

不过,通过查看 visual studio code editor源码,找到unity一个内部的接口

 

通过此接口,可以获取各个target和option的编译宏

 

  • 引用依赖问题

Vs tools是将所有可能依赖的dll全部加到reference列表中,多的reference倒是无所谓,最终编译都只会包含真正需要引用的dll。但是ref dll的路径 需要处理下,默认为全路径,但每个人机器上unity安装目录都不一样,所以需要通用化。有两个方法:

a. 将dll拷贝到工程同级目录,将ref hintpath改成相对路径(不过,在unity升级后,此目录也需要升级,不适合unity需要频繁升级的项目)

b. 添加环境变量UNITY_PATH,修改csproj,示例如下

 

csproj的Condition可以很好的解决不同环境下的一致性问题

 

  • Include scripts问题

由于涉及到多人协作,我们的csproj没有采取正则include,而是显式的include了每个代码文件,这样产生了两个问题

a. 所有人都需要提交csproj,而csproj默认是将新加的代码添加至末尾,所以在多人同时新加文件时,很容易产生冲突,而且不能自动resolve,需要手动合并。

b. 若引入了第三方的package,升级变得繁琐,要逐个检查是否需要include

 

为了解决这个问题,综合各个方面,决定使用终极方案,即根据代码文件/asmdef以及自定义的一些规范,自动生成csproj,这个过程跟vs tools类似。实现后,开发不再需要提交csproj文件,并且会自动检测代码文件的新增或删除,并自动修改,这样你的visual studio会自动提示reload(是不是跟原始的工作流程很像了?)。这个自动生成的过程,可以参考visual studio editor package代码,此处就不再做详细展开。

 

  • Burst compile问题

Unity2019提供了burst功能,这个burst过程是在打包阶段发生的,它会自动扫描unity自动生成的dll(即Csharpt-xxx系列)内的代码,然后进行burst。但是此时我们的代码都在plugins下的dll里,所以扫描不到。此时需要修改burst package相关的代码,具体如何修改就不贴了,很简单。

 

总结

踩了不少坑,也对unity的编译环节有所了解。切换过来后,感觉是一种新的体验,有兴趣的可以试试。

转载于:https://www.cnblogs.com/kumbayaco/p/11334885.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549740.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

曾国藩传 读后感

转载于:https://www.cnblogs.com/eat-too-much/p/11335113.html

hdu 1102 pku 2421 解题报告

这题很简单,我差不多15分钟就写好代码了,运行结果也是正确的。可提交就是RE,百思不得其解,调了两个小时的时候,我才忽然发现我存边的时候数组开小了,我当时也想到肯定是数组问题,但是我却忽律了…

深入C#学习系列一:序列化(Serialize)、反序列化(Deserialize)

深入C#学习系列一:序列化(Serialize)、反序列化(Deserialize) 序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制。其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方。.NET框架提供了两…

分别用 数组和链表处理约瑟夫环问题

#include <stdio.h> #include <stdlib.h> int main() { int k0,n0,s0,m0; //k为1,2,3报数时的计数变量,m为退出人数 int num [100]; int *pnum; int i; printf("Enter the number of person and the key:"); scanf("%d%d",&n,…

QT_环境搭建

QT_环境搭建 Qt软件安装&#xff1a;https://www.jianshu.com/p/65bc892829a0 Qt软件下载&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/qt/5.13/5.13.0/ 转载于:https://www.cnblogs.com/panda-w/p/11338742.html

十一月·飘·立冬

十一月的南粤叶依然青翠在枝头与秋风和舞落叶遍地的诗意画面在博客生活逝如流年 渐走渐淡回忆飘然而来又飘然而去秋的最后一天放下回忆 飘去天涯飘不要说也不要问目光交错的一瞬注定了今生缘分此情可以见真心春风急 秋风也狠乱乱纷纷 是红尘浮浮沉沉 似幻似真金枝玉叶的结…

OCP-052考试题库汇总(27)-CUUG内部解答版

Which two of these must be available READ/WRITE to keep a database open? A)all copies of the control file. B)the password file. C)all members of the current redo log group. D)spfile. E)TEMP tablespace F)SYSAUX tablespace Answer: AC 转载于:https://www.cnbl…

07/11/10 资料整理

脉码调制PMC T1 E1 T2 T32007-10-31 10:39什么是T1? 北美的24路脉码调制PCM简称T1&#xff0c;速率是1.544Mbit/s 我国采用的是欧洲的T1标准。北美使用的T1系统共有24个话路&#xff0c;每个话路采样脉冲用7bit编码&#xff0c;然后再加上1位信令码元&#xff0c;因此一个话路…

printf \r \n

简介 \r 回到这一行的开始处 \n 换下一行 参考链接 csdn 转载于:https://www.cnblogs.com/eat-too-much/p/11339935.html

真正的累

真正的累&#xff0c;是从骨头里泛出来的一丝丝的酸软&#xff0c;先是在后背盘旋&#xff0c;不痒也不痛&#xff0c;就是不舒服。然后身上热烘烘的&#xff0c;就着这热气&#xff0c;那些酸软就从后背发散开来。眼睛也会有点酸&#xff0c;闭上眼睛就会很舒服。你不得不挺直…

OCP-052考试题库汇总(28)-CUUG内部解答版

Archivelog mode is enabled for your database and DB_CREATE_FILE_DEST is set to ‘/u01/oracle/db01’. The parameters, DB_CREATE_ONLINE_LOG_DEST_n and DB_RECOVERY_FILE_DEST, and not specified. Which four are stored in the location specified by DB_CREATE_FILE…

Centos 系统安装NetCore SDK命令以及一系列操作(1)

17年买的jesse老师的课程&#xff0c;虽然说NetCore出来很久了&#xff0c;自己打入行的时候就奔它去的&#xff0c;但。。。。废话不说了&#xff0c;还是自己做了再说吧&#xff0c; 首先需要一个Centos系统来让我们开始玩&#xff0c;下载地址&#xff1a;https://www.cento…

如何高效地判断奇数和偶数

在我们日常的编程当中&#xff0c;常常会遇到判断某个整数属于奇数还是偶数的情况。 大家一般的处理做法是用这个整数和2取模。然后判断是等于1还是等于0。 这里&#xff0c;我要为大家介绍一种快速有效的判断做法&#xff0c;利用2进制进行判断。 大家都知道&#xff0c;奇数的…

百万分之一的新闻

昨天看到一则新闻&#xff0c;堪称罕见的新闻&#xff0c;百万分之一的新闻。 讲的是南京发生一件奇闻&#xff0c;一名女子生下一对双胞胎&#xff0c;竟然是同母异父的双胞胎。医学专家说这种概率是百万分之一。 新闻链接如下&#xff1a;http://bbs.people.com.cn/postDetai…

Windows Azure Traffic Manager (6) 使用Traffic Manager,实现本地应用+云端应用的高可用...

《Windows Azure Platform 系列文章目录》 注意&#xff1a;本文介绍的是使用国内由世纪互联运维的Azure China服务。 以前的Traffic Manager&#xff0c;背后的Service Endpoint必须是Azure数据中心的Cloud Service。 现在最新的Traffic Manager&#xff0c;Endpoint不仅仅支持…

Windows Azure Cloud Service (17) Role Endpoint

《Windows Azure Platform 系列文章目录》 在Windows Azure平台中&#xff0c;用户最多可以对以个Role指定5个Endpoint。而一个Hosted Service最多允许包含5个Role,所以说在一个Hosted Service中用户最多能定义25个Endpoint。 而对于每一个Endpoint&#xff0c;使用者需要设定如…

java打印一年中所有日期

public class Main { public static void main(String args[]) { //请注意月份是从0-11,天数是1&#xff0c; 2013-1-1 至 2013-12-31Calendar start Calendar.getInstance();start.set(2013, 0, 1); //2013-1-1 开始Calendar end Calendar.getInstance();end.set(20…

sentry + vue实现错误日志监控

起因 项目采用vue全家桶开发&#xff0c;现在拟嵌入sentry&#xff0c;实现对于线上网站进行错误日志记录。其实上传日志很简单&#xff0c;基本配置就可以了&#xff0c;但是上传配套的sourcemap则颇为费劲。这里记录一下使用心得。 实施步骤 上传日志 sentry使用文档&…

OSPF单域实验报告

1.1 实验任务<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />(1) 配置Loopback地址作为路由器的ID。(2) 配置OSPF的进程并在相应的接口上启用。(3) OSPF起来后&#xff0c;更新计时器。1.2 实验环境和网络拓扑<?xm…

常用唤醒APP的方式

参考常用唤醒APP的方式