赞
踩
在编辑器下,每次修改完代码后,就会自动开始编译,最终所有的代码将编译成DLL文件。DLL文件最终将编译在…/Library/ScriptAssemblies目录下,一共是4个DLL文件:
脚本分为运行时脚本和编辑时脚本两大类,只有运行时脚本会被编译进游戏包中。脚本的存放目录决定了它将编译在哪个DLL文件中。一般最后编译Editor目录下的脚本。
DLL的编译顺序为:Assembly-CSharp-firstpass.dll(f.cs)>Assembly-CSharp-Editor-firstpass.dll(ef.cs)
Assembly-CSharp.dll(ac.cs)>Assembly-CSharp-Editor.dll(e.cs)。其中先编译的脚本无法访问后编译的脚本。
游戏代码可以大致分为两类:框架代码和逻辑性代码。
框架代码一旦建立的较为完善后,就不需要一直修改,也不需要访问逻辑性代码了。
逻辑性代码的修改频率就要大得多。
使用我们可以把框架类代码放在Plugins目录下,这样如果修改非Plugins文件目录下的;逻辑性代码,就不会额外编译Plugins目录下的代码了。
如果代码量非常大的时候,上面这样的方法依旧会造成编译慢的问题,就可以把部分CS代码预先编译成DLL来加速编译。
.NET可以把C/C++编译进DLL,但是这会导致有些平台无法识别,此时如果编译DLL时只能编译C#代码,则需要爱macOS系统中打开终端,输入编译指令,DLL编译完成后直接拖到项目中去就可以了:
mac -r:/Applications/unity/unity.app/Contents/Managed/UnityEngine.dll
-target:library -out:test.dll *.cs
UnityEngine.dll 编译所依赖的DLL文件
-target:library 生成Library类型
-out:test.dll 最终生成DLl的保存目录
*.cs 表示当前目录下所以的C#代码,如果有多个目录多个文件,可以空格分开。
Unity编辑器只支持Windows、macOS和Linux这三个平台,代码大部分是由C#编写的并编译在UnityEditor.dll中,通过Mono实现跨平台。
其中,底层渲染方法并不是使用C#来调用的,Unity只是把C#的接口封装到了UnityEngine.dll中。至于更底层的内部实现,则是由这个DLL再去调用C++来完成的。
对于不同的平台,编译C++的方式是不同的,从而实现了跨平台。例如:Android品台需要编译成 .so,IOS需要编译在.a中。
现在的Unity还支持IL2CPP,它可以把DLL代码转成C++来执行,从而提高效率。
可以通过反编译UnityEngine,dll和UnityEditor.dll来查看这一过程的实现。
一般使用Debug来打印日志:
Debug.Log{“Log”}
Debug.Log{“LogError”}
Debug.Log{“LogWarning”}
在开发阶段,多打印可以了解程序行为。但是在发布后,要把日志关闭,不然会造成额外的开销。可以使用下面的代码,可以在初始化的地方设置条件编译,在非编译的模式下运行时,则关闭掉所有的日志和输出:
#if !UNITY_EDITOR
Debug.unityLogger.logEnabled=false;
#endif
此篇为《Unity3D 游戏开发第二版》的学习和总结
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。