前言
最近在研究Unity3D的结构和原理。关于Unity3D怎么用之类的教程在网上一找一大堆,想看教程之类的就不用看这篇文章了。我想做的是从使用Unity3D所看到的表象(表),摸透其设计原则和组织结构(里)。到现在以来做了不少工作了,现在理一下思路,将所分析到的东西和大家分享一下。这是第一篇,主要说明一下Unity3D所使用的第三方工具
一、环境
Unity4.6.0f3(这里提一下,4.6版本的最主要的新特色是新GUI系统,这部分Unity已开源)
Win7 64bit系统(我想其他系统应该是差不多的)
二、安装目录结构
首先,列出Unity4.6的安装目录层次和一些值得注意的文件(像一些临时文件、log就不列出了),并做上标注。现在我还一点都不明白的就不标注了,存疑的我也会标注好,如果大家有知道的或者我哪里说错了,请一定在评论中指出!
Editor[编辑器]
│ │ beast32.dll[Autodesk Beast] │ │ beast64.dll[Autodesk Beast] │ │ cairo.dll[Cairo绘图库] │ │ CFLite.dll[Webkit的第三方扩展,OpenCFLite是一种便携式版本的苹果公司的开源CoreFoundation框架] │ │ comerr32.dll[?Common error handler for mit kerberos v5 / gss distribution,Kerberos 5协议的免费实现的常见错误处理库] │ │ FreeImage.dll[FreeImage图像处理库] │ │ gssapi32.dll[Generic Security Service API,访问安全服务的API,Kerberos 5协议相关] │ │ iconv.dll[GNU 字符编码转换库] │ │ JavaScriptCore.dll[?JS处理库,应该是WebKit的一部分] │ │ k5sprt32.dll[Kerberos 5协议相关] │ │ krb5_32.dll[Kerberos 5协议库] │ │ libcurl.dll[客户端URL传输库,可实现很多网络层协议] │ │ libeay32.dll[OpenSSL相关库] │ │ libiconv2.dll[GNU 字符编码转换库] │ │ libintl3.dll[GNU library for native language support] │ │ libmp3lame.dll[LAME MP3编码库] │ │ libpq.dll[PostgreSQL访问库] │ │ libxml2.dll[XML解析库] │ │ libxslt.dll[提供XSLT支持,是libxml2的扩展] │ │ mono.pdb[pdb文件?这不是VS编译时生成的的符号文件吗?] │ │ msvcm80.dll[VC运行库] │ │ msvcp80.dll[VC运行库] │ │ msvcr71.dll[VC运行库] │ │ msvcr80.dll[VC运行库] │ │ pthreadVC2.dll[pthread多线程库] │ │ sqlite3.dll[SQLite3库] │ │ ssleay32.dll[OpenSSL相关库] │ │ umbraoptimizer32.dll[艺术渲染中间件Umbra的优化组件] │ │ umbraoptimizer64.dll[艺术渲染中间件Umbra的优化组件] │ │ Uninstall.exe[卸载程序] │ │ Unity.exe[主程序] │ │ Unity.pdb[安装目录里带着163M的调试用的文件是什么鬼?] │ │ UnityBugReporter.exe[错误报告程序] │ │ UnityWebPlayer.exe[Unity WebPlayer的安装程序] │ │ WebKit.dll[WebKit库] │ │ zlib1.dll[zlib库] │ ├─CFLite.resources[WebKit的一个第三房库CFLite的相关资源]
Data[数据]
│ │ ├─BuildTargetTools[生成目标所用的工具] │ │ │ └─AndroidPlayer[?] │ │ ├─CGIncludes[CG shader的包含文件,Surface Shader的生成会用到] │ │ │ AutoLight.cginc[光照相关] │ │ │ HLSLSupport.cginc[HLSL相关,包含大量的宏定义] │ │ │ Lighting.cginc[光照相关] │ │ │ TerrainEngine.cginc[地形相关] │ │ │ Tessellation.cginc[曲面细分相关] │ │ │ UnityCG.cginc[一些常用函数(CG版本)] │ │ │ UnityCG.glslinc[一些常用函数(GLSL版本)] │ │ │ UnityShaderVariables.cginc[一些Unity内部Constant定义、宏定义] │ │ ├─Documentation[文档] │ │ ├─Managed[?托管的,存放C#编译的dll] │ │ ├─Mono[Mono的运行库] │ │ ├─MonoBleedingEdge[?最新的Mono库,这些库有可能不稳定而导致问题] │ │ ├─PackageManager[?包管理器,但具体管理的是什么包就不清楚了] │ │ ├─PlaybackEngines[?引擎文件,可能是构建各个平台上的程序时所用的一些适配用的组件] │ │ │ ├─androidplayer[安卓] │ │ │ ├─blackberryplayer[黑莓] │ │ │ ├─flashsupport[Flash] │ │ │ ├─iossupport[IOS] │ │ │ ├─linuxstandalonesupport[Linux] │ │ │ ├─macstandalonesupport[mac] │ │ │ ├─metrosupport[Metro] │ │ │ ├─WebPlayer[?网页游戏] │ │ │ ├─windowsstandalonesupport[Windows] │ │ │ └─wp8support[Windows Phone 8] │ │ ├─Resources[资源] │ │ │ ├─Layouts[Unity编辑器的UI Layout] │ │ │ ├─ScriptTemplates[Sctipt的模板,比如Surface shader、C#脚本,新建shader或脚本中的默认内容] │ │ │ └─WebPlayerTemplates[?]
Tools[工具]
│ │ │ │ 7z.dll[7Zip] │ │ │ │ 7z.exe[7Zip] │ │ │ │ astcenc.exe[ARM ASTC纹理图像压缩/解压缩工具] │ │ │ │ auto_quitter.exe[?] │ │ │ │ binary2text.exe[?] │ │ │ │ cg.dll[CG核心运行库] │ │ │ │ convert.exe[ImageMagick,一种图像处理软件,可用于格式转换] │ │ │ │ D3Dcompiler_46.dll[HLSL编译库] │ │ │ │ D3Dcompiler_47-x64.dll[HLSL编译库] │ │ │ │ D3Dcompiler_47.dll[HLSL编译库] │ │ │ │ diff.exe[文件比较工具,2个文件间] │ │ │ │ diff3.exe[文件比较工具,3个文件间] │ │ │ │ etcpack.exe[压缩/解压缩ETC格式的图像的工具] │ │ │ │ etcpack2.exe[压缩/解压缩ETC1/ETC2格式的图像的工具] │ │ │ │ FBXMaxExport.ms[3DSMAX的MaxScript脚本,用于从MAX文件导出FBX文件] │ │ │ │ FBXMayaExport.mel[Maya的MEL脚本,用于从MB文件导出FBX文件] │ │ │ │ FBXMayaExport5.mel[Maya的MEL脚本,用于从MB文件导出FBX文件] │ │ │ │ FBXMayaMain.mel[Maya的MEL脚本,主程序(看内容是对导出插件的版本进行了选择)] │ │ │ │ GeometryToolbox.dll[?] │ │ │ │ ImportFBX.dll[?] │ │ │ │ ImportFBX.exp[?] │ │ │ │ ImportFBX.lib[?] │ │ │ │ lzma.exe[LZMA压缩/解压缩工具] │ │ │ │ ModoToUnity.py[将MODO的lxo文件导出为FBX文件或DAE文件的工具] │ │ │ │ Mono.Cecil.dll[Mono的Cecil库] │ │ │ │ monolinker.exe[Mono CIL Linker] │ │ │ │ PVRTexTool.exe[PVR格式纹理处理工具] │ │ │ │ QuicktimeTools.exe[QuickTime视频处理工具] │ │ │ │ ShaderFixor.exe[?] │ │ │ │ umbraoptimizer32.dll[艺术渲染中间件Umbra的优化组件] │ │ │ │ umbraoptimizer64.dll[艺术渲染中间件Umbra的优化组件] │ │ │ │ umbraprocess32.exe[?] │ │ │ │ umbraprocess64.exe[?] │ │ │ │ Unity-BlenderToFBX.py[将Blender的文件导出为FBX文件或DAE文件的工具] │ │ │ │ UnityShaderCompiler.exe[?估计是Surface Shader的编译器] │ │ │ │ UnusedBytecodeStripper.exe[?] │ │ │ │ Unwrap.dll[?好像是用来做UV展开的一个库] │ │ │ ├─Beast[Autodesk的光照仿真中间件] │ │ │ ├─SocketPolicyServer[?] │ │ │ ├─UNITY-C4DToFBXConverter[将Cinema 4D的C4D文件转换为FBX的工具] │ │ │ └─VersionControl[版本控制] │ │ └─UnityExtensions[Unity的扩展] │ │ └─Unity │ │ └─GUISystem │ │ └─4.6.0[新的GUI系统]
其它文件夹
│ ├─JavaScriptCore.resources │ ├─Standard Packages[一些标准示例] │ ├─Temp[临时文件夹,一些转换FBX时产生的中间文件就在这里面,当然用完即删] │ └─WebKit.resources[WebKit的相关资源] └─MonoDevelop[MonoDevelop IDE]
三、分析
可以看得出来,Unity用了超多的第三方工具!下面就列举下看看。
就按照出现的顺序来说吧。
1. Autodesk Beast
文件:beast32.dll/beast64.dll/thebeast.exe/thebeast-64.exe等
它是什么?
参考: http://gameware.autodesk.com/beast?lang=cn
Autodesk® Beast™ 是一组用于制作游戏中的逼真光照 (Realistic Lighting) 的工具。利用 Beast,开发者可以模拟自然光照效果:实时游戏环境中的色彩反弹 (Color Bounce)、柔和阴影、高动态范围光照 (High Dynamic Range Lighting) 和移动对象光照。Beast 有助于制作者提高游戏的视觉质量,创造更加引人注目的游戏体验。
应用
光照图的生成
2. Cairo
文件:cairo.dll
它是什么?
参考: http://cairographics.org/
Cairo提供了跨平台2D绘图的支持
应用
2D绘图,也可能是其他库的依赖项
3. Webkit
文件:WebKit.resources、JavaScriptCore.dll、WebKit.dll、JavaScriptCore.resources等
它是什么?
参考: http://www.webkit.org/
WebKit是一个开源的浏览器引擎
应用
与浏览器相关的功能,可能应用于内置的Asset Store、Web player等,也可能是其他库的依赖项
4. Kerberos 5协议
文件:comerr32.dll、k5sprt32.dll、krb5_32.dll、gssapi32.dll等
它是什么?
参考: http://zh.wikipedia.org/zh/Kerberos
Kerberos协议是一种计算机网络授权协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证。
应用
可能用于网络认证中,比如游戏登录等(个人猜测,不确定),也可能是其他库的依赖项
5. FreeImage
文件:FreeImage.dll
它是什么?
参考: http://freeimage.sourceforge.net/
FreeImage是一款免费的、开源的、跨平台的,支持很多种图像类型的图像处理库。
应用
可能用于图像资源导入,图像格式转换,图像处理(如缩放、修改)中,也可能是其他库的依赖项
6. gettext(iconv / libiconv2 / libintl3)
文件:iconv.dll、libiconv2.dll、libintl3.dll
它们是什么?
参考: http://gettext.sourceforge.net/ http://www.gnu.org/software/libiconv/ http://www.gnu.org/software/libiconv/
iconv提供了在多种国际编码格式之间进行文本内码的转换的功能;libiconv是iconv的实现;libintl3提供了本地化语言支持
应用
可能用于文本的编码转换、本地语言支持(比如说一个游戏的不同语言版本)
6. cURL
文件:libcurl.dll
它是什么?
参考: http://curl.haxx.se/libcurl/
libcurl是一个免费易用的客户端URL传输库。
应用
基本和应用层网络相关的一切都可以用libcurl来实现(个人猜测),如FTP、HTTP、SMTP等协议
7. OpenSSL
文件:libeay32.dll、ssleay32.dll
它是什么?
参考: http://www.openssl.org/
OpenSSL是套开放源代码的软件函数库包,实现了SSL与TLS协议。
应用
可能是网络相关的如Webkit的依赖项
8. LAME
文件:libmp3lame.dll
它是什么?
参考: http://lame.sourceforge.net/
LAME是一个高质量MP3编码器(LGPL)
应用
可能用于MP3音频文件的生成,如将录音输出为MP3文件,也可能是其他库的依赖项
9. PostgreSQL
文件:libpq.dll
它是什么?
参考: http://www.postgresql.org/docs/9.4/static/libpq.html
libpq是PostgreSQL的C应用程序接口。libpq是一套允许客户程序向PostgreSQL服务器服务进程发送查询并且获得查询返回的库函数。
应用
用于访问PostgreSQL数据库
10. XML
文件:libxml2.dll、libxslt.dll
它是什么?
参考: http://xmlsoft.org/
libxml是一个用来解析XML文档的函数库;libxslt提供XSLT支持。
应用
用于读取、导入XML数据,也可能是其他库的依赖项
11. Pthreads
文件:pthreadVC2.dll
它是什么?
参考: http://zh.wikipedia.org/zh/POSIX%E7%BA%BF%E7%A8%8B
libxml是一个用实现了POSIX线程标准的库
应用
可能是Unity自身的一些功能采用了多线程时会用到,也可能是其他库的依赖项
12. SQLite3
文件:sqlite3.dll
它是什么?
参考: http://sqlite.org/
SQLite是一个独立的、无服务器的、无需配置的transactional SQL数据库引擎。
应用
可能是Unity自身的一些功能采用了SQLLite时会用到,或者某些游戏机制使用了SQLLite作为数据存储的手段,也可能是其他库的依赖项
13. Umbra
文件:umbraoptimizer32.dll、umbraoptimizer64.dll
它是什么?
参考: http://umbra3d.com/ http://www.cnblogs.com/umbra/archive/2012/07/31/2617456.html
Umbra 3提供了一种自动化遮挡裁剪系统。
应用
游戏中的遮挡裁剪
14. zlib
文件:zlib1.dll
它是什么?
参考: http://www.zlib.net/
zlib是提供数据压缩用的库。
应用
可能是FreeImage的依赖项,也可能用于其他需要数据压缩功能的程序或库中。
15. 7Zip
文件:7z.dll、7z.exe、lzma.exe
它是什么?
参考: http://www.zlib.net/
7-Zip是一款拥有极高压缩比的开源压缩软件。lzma.exe是其LZMA压缩、解压缩算法的实现。
应用
用于解压缩7z压缩文件,或者压缩文件为为7z压缩文件,可能在导入7z格式的文件时使用
16. ARM ASTC纹理
文件:astcenc.exe
它是什么?
参考: http://community.arm.com/thread/3981
astcenc是用于ARM ASTC纹理图像的压缩/解压缩工具。
应用
用于压缩/解压缩ARM ASTC纹理图像,可能用于移动设备的纹理转换过程
17. CG
文件:cg.dll
它是什么?
参考: https://developer.nvidia.com/cg-toolkit
Cg语言(C for Graphics)是为GPU编程设计的高级着色器语言,由NVIDIA公司开发。cg.dll是CG的运行库。
应用
用于CG语言的支持,这个比较老了,现在一般都用HLSL或者GLSL了
18. ImageMagick
文件:convert.exe
它是什么?
参考: http://www.imagemagick.org/script/convert.php
ImageMagick是一个用于查看、编辑位图文件以及进行图像格式转换的开放源代码软件套装。convert.exe是其组件,用于转换图像文件格式。
应用
用于处理图像,如格式转换、缩放等
20. HLSL
文件:D3Dcompiler_46.dll、D3Dcompiler_47-x64.dll、D3Dcompiler_47.dll
它是什么?
参考: https://msdn.microsoft.com/en-us/library/windows/desktop/dd607340.aspx
D3Dcompiler是Direct3D的一个组件,用于编译HLSL。
应用
用于编译HLSL
21. diff diff3
文件:diff.exe、diff3.exe
它是什么?
参考: http://en.wikipedia.org/wiki/Diff_utility http://en.wikipedia.org/wiki/Diff3
文件比较工具
应用
用于比较文件,可能用于检测某Asset文件是否变化,比如脚本文件是否变化,从而决定是否重新编译它
22. ETC/ETC1/ETC2纹理
文件:etcpack.exe、etcpack2.exe
它是什么?
参考: https://bitbucket.org/wolfpld/etcpak/wiki/Home http://en.wikipedia.org/wiki/Ericsson_Texture_Compression
etcpack是压缩/解压缩ETC格式的图像的工具;etcpack2是压缩/解压缩ETC1/ETC2格式的图像的工具。
应用
用于压缩/解压缩ETC/ETC1/ETC2纹理图像,可能用于移动设备的纹理转换过程
23. Maxscript脚本 MEL脚本
文件:FBXMaxExport.ms FBXMayaExport.mel FBXMayaExport5.mel FBXMayaMain.mel
它是什么?
参考: MAXScript MEL
FBXMaxExport.ms用于从MAX文件导出FBX文件;FBXMayaExport.mel FBXMayaExport5.mel FBXMayaMain.mel用于从MB文件导出FBX文件。
应用
用于MAX文件、MB文件导入Unity的过程(即转换为FBX的过程)
24. Python脚本
文件:ModoToUnity.py Unity-BlenderToFBX.py
它是什么?
参考: http://en.wikipedia.org/wiki/Diff_utility
ModoToUnity.py用于将MODO的lxo文件导出为FBX文件或DAE文件的脚本。MODO是一个3D建模软件;Unity-BlenderToFBX.py是将Blender的文件导出为FBX文件或DAE文件的脚本
应用
用于将MODO的lxo文件、Blender的3D文件导入Unity(即转换为FBX的过程)
25. QuickTime
文件:QuicktimeTools.exe
它是什么?
参考: https://developer.apple.com/quicktime/
视频处理工具
应用
用于处理视频文件,如压缩、转码等
26. UNITY-C4DToFBXConverter
文件:UNITY-C4DToFBXConverter下的cdl、cdl64文件
它是什么?
参考: http://en.wikipedia.org/wiki/Diff_utility
用于将Cinema 4D的C4D文件转换为FBX的工具
应用
用于将Cinema 4D的C4D文件转换为FBX的工具(这个应该是Unity自己写的)
四、总结
现在对上面的各类工具做一下分类和小结。
- 图形图像 - 3D模型导入(FBX): Maxscript脚本(3DSMax) / MEL脚本(Maya) / Python脚本(Modo/Blender)
- 图形图像 - 图像处理: FreeImage、ARM ASTC纹理、ImageMagick、ETCx纹理
- 图形图像 - 渲染: Autodesk Beast、Umbra、CG、HLSL
- 图形图像 - 2D绘图: Cairo
- 音频: LAME
- 视频: QuickTime
- 文本: gettext(iconv / libiconv2 / libintl3)、XML(libxml2)、diff / diff3
- 网络: Webkit、Kerberos 5协议、cURL(libcurl)、OpenSSL
- 数据库: PostgreSQL(libpq)、SQLite3
- 多线程:Pthreads
- 数据压缩:zlib、7Zip
这里只是从文件层面分析和列举了Unity4所使用的第三方工具。可以看出来,数量很多,类别很多,这也说明了游戏引擎或者说游戏开发工具的复杂性。
出处
本文转载自:https://zwcloud.net/ 作者:zwcloud