编译 Unity 4.3.1 引擎
Posted 河乐不为
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编译 Unity 4.3.1 引擎相关的知识,希望对你有一定的参考价值。
引言
从 2014 年参加实习便开始使用 Unity 3D 开发游戏,当时 Unity 还是完全闭源的,但那时候有些公司财大气粗的会直接跟 Unity 官方购买了引擎源码,似乎后来 Unity 就不卖给中国的企业了。Unity 官方从 Unity 2017.1 版本开始,开源了引擎和编辑器的C#源码(源码地址:UnityCsReference),但核心的 C/C++ 部分源码并未开源。
编译环境
网上主要的源码有两个版本 Unity 4.3.1f1 和 Unity 4.7.1f1 ,但其实基本都是 4.3.1 的版本,这里以 Unity 4.3 为例进行源码编译,但编译之前需要安装一些工具软件:
-
Visual Studio 2010
(不能使用高版本的 VS 进行源码编译,不然会报错) -
Visual Studio 2010 SP1
-
Perl
(下载安装 ActivePerl 即可)
源码包
Unity4.7.1f1_source_3eo9sdfl01d_final.zip
网上有很多种方式可以获得源码包,而且这些包基本都是 Unity 4.3.1f1 的版本,只是包名改成 4.7 来骗下载量的吧~
编译步骤
-
将源码包放在磁盘根目录下,路径太深似乎容易出现解压依赖库时报错,例如这里我的存放目录为
F:\\Unity4.7.1f1_source
; -
进入工程目录,双击
jamCreateWorkspace.bat
脚本,执行完毕后在 Projects 目录下会多出一个JamGenerated
目录;(假如没有此脚本,也可以使用在当前目录下使用命令行执行perl build.pl --prepare
来生成); -
然后使用 VS 打开
Projects/JameGenerated/_workspace.vs2010_/AllTarget.sln
,在解决方案资源管理器中选中 Editor 解决方案,右键生成
; -
构建完成后,构建结果在
build/WindowsEditor
目录下,双击Unity.exe
启动编辑器即可启动编辑器。
编译时报错解决
-
依赖库没自动解压:
在
External
目录下有很多依赖库,有些是以压缩包的形式存在的,但编译的时候可能出现压缩包无法自动解压缩的情况,要么手动解压缩这些包,要么就使用自动化工具批量解压缩,显然后者要靠谱一些,可以避免遗漏。其实这些压缩包都是以
builds
命名的,后缀名为.zip
、.7z
或这.tar.gz
三种,这里我直接用 QQ 群友写的一个 python 脚本实现解压操作。但是需要安装7z.exe
并将其配置到系统环境变量中(确保可以在任何目录下通过命令行调用),具体代码如下(例如取名为unzipExtenalBuilds.py
):# -*- encoding: utf-8 -*- import os def unzip(): for path, dirs, files in os.walk(r"External"): dir = os.path.join(path, "builds") if os.path.isdir(dir): continue for ext in [".7z", ".tar.gz", ".zip"]: fname = dir + ext if os.path.exists(fname): cmd = "7z.exe x " + fname + " -o" + dir print(cmd) os.system(cmd) if __name__ == "__main__": unzip()
将此脚本放在工程根目录下,在命令行执行:
$ python unzipExtenalBuilds.py
解压完成后,再重头走一遍上面的编译步骤。
-
中文系统导致的问题:
当如当前的系统是中文系统,然后在编译时出现很多如下报错:
C2220 警告被视为错误 - 没有生成 "obj" 文件 C4819 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 ...
解决方案:
修改
Projects/Jam/Editor.jam
中第 360 行,插入/wd4819
,如下:local vsflags = /WX /wd4251 ; //修改前 local vsflags = /WX /wd4251 /wd4819 ; //修改后
-
未安装 VS 2010 SP1 补丁
编译时出现如下报错:
C3861 "_xgetbv" :找不到标识符
这是因为没有安装 Visual Studio 2010 SP1 ,在编译
CPUInfo.cpp
时因找不到_xgetbv
方法而导致报错。解决方案:
下载安装
VS10sp1-KB983509.exe
补丁,重新编译即可。
启动时报错
启动编译好的编辑器,弹出提示框:
Error loading page
SSL peer certificate or SSH remote key was not OK
这是因为许可管理导致的,因为在 Unity 启动时会联网校验许可信息。
解决方案:
-
方案1:
可以用常用的方法进行破解,例如从
Unity
官网通过上传Unity_v4.3.1f1.alf
再下载一个Unity_v4.x.ulf
导入编辑器来激活,然后修改LicenseManager.cpp
的 1709 行获取失效时间的代码:std::string stopString = GetDate("StopDate", doc); // 修改前 std::string stopString = "2112-01-27T08:00:00"; // 修改后
-
方案2:
既然是要研究源码,最好是从源头上解决,打开
Editor/Src/LicenseInfo.cpp
,修改两个地方:UInt64 LicenseInfo::GetRawFlags () // 插入内容 start if (m_Tokens == 0) m_Tokens = 12345678; // 插入内容 end return m_Tokens; void LicenseInfo::InitializeProtection() ... int state = m_LicenseManager->Initialize(); // 插入一行代码代码 state = kLicenseStatus_Valid;
打开
Editor/Src/Application.cpp
,修改方法:void Application::TickTimer() // 屏蔽一下两行代码 //if (m_IsInitialized) // LicenseInfo::Get()->Tick(); ...
修改完这三处之后,重新编译即可。
其他
由于 2015 年就已经拿到源码,只是一直都没时间去倒腾,最近想着抽空看一部分底层的源码,后续可能会更新一些相关的笔记。
参考
以上是关于编译 Unity 4.3.1 引擎的主要内容,如果未能解决你的问题,请参考以下文章