编译 Unity 4.3.1 引擎源码

引言

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();
    ...
}
修改完这三处之后,重新编译即可。

其他

  • 尝试用vs2012编译,编译失败了
  • 用VS2010编译(未安装VS2010 SP1)报了其他与此不同的错误,安装VS2010后编译成功

Ref: https://blog.csdn.net/linshuhe1/article/details/90295325

原文地址:https://www.cnblogs.com/open-coder/p/12079125.html

时间: 2024-10-03 06:12:08

编译 Unity 4.3.1 引擎源码的相关文章

如何学习大型项目的源码?虚幻引擎源码学习思路分享

每一个人做事都有自己的风格与习惯.当你发现身边一个人很优秀的时候,你去看一下他的24小时是怎么度过的,然后再对比一下你的24小时,答案就很明了了.同理,如果你觉得学习源码很困难,不妨请教一下那些比较牛的"过来人",看一下别人学习源码模块的流程.当然具体来说,影响一个事物的纬度,细节,前提条件都很多,别人的方法照搬过来可能是行不通的,比如说别人能一天雷打不动地学10个小时,这个放到有些人身上几乎不可能.那如何学习大型项目的源码?下面我把自己学习虚幻引擎源码(C++)的思路和过程给分享给大

编译当天修改的所有C源码

#!/bin/sh #****************************************************************# # ScriptName: gccmodify.sh # Function: compile *.c which mtime is 0 (in 24 hours) in current dir #***************************************************************# for file i

artTemplate模板引擎源码拜读

最初接触的模板引擎还是基于node的ejs,当时觉得很神奇原来还可以这么玩,后来随着学习的深入,使用过jade,doT等,当然还有一些比较火的诸如juicer.underscore还没有深入接触,直到今年上半年由于项目需要就想着要不试试腾讯的artTemplate,感觉牛逼也吹的挺响的.开始了解后,觉得它比我之前使用过的jade.doT都好用,调试神马的也方便很多,采用预编译的方式也让性能非常优越. 其实看了源码后简单的总结出来就是这么一句话:就是先获取html中对应的id下得innerHTML

源码手工编译LNMP架构(内附源码包)

简介 LNMP指的是一个基于CentOS/Debian编写的Nginx.PHP.MySQL.phpMyAdmin.eAccelerator一键安装包.可以在VPS.独立主机上轻松的安装LNMP生产环境.LNMP代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构.Linux是一类Unix计算机操作系统的统称,是目前最流行的免费操作系统.代表版本有:debian.centos.ubuntu.fedora.gentoo等:Nginx是一个高性能的HTTP和反向代理服务器,也是

查看和调试Qt源码(动态编译的QT也可进入源码)good

简述 在调试程序的时候,有时需要调试进入 Qt 源码,这不仅有利于我们了解内部实现机制,而且对于解决一些隐蔽性问题很有帮助. 都知道 F11 是“单步进入”,可是在调试的过程中,按下 F11 却无法进入.有人说需要静态编译 Qt 才可以,其实不然,只需要简单的几个配置就可以搞定. 简述 Qt 版本及安装 配置 Qt Creator 源码调试 更多参考 版权所有:一去丶二三里,转载请注明出处:http://blog.csdn.net/liang19890820 Qt 版本及安装 Qt 针对 Win

反混淆、反编译unity3d动画插件DFTweenLite得到源码

我为什么要得到这个源码,因为有洁癖! 对于Itween性能差,LeanTween 和 HOTween的 免费, 个人还是比较喜欢 Daikon Forge 出品的东西, 因为有我个人很欣赏的 DFGUI 产品.确实很好用!!! DFTweenLite 是免费的, DFTweenPro是收费的. 功能上基本上不差啥.  免费没有源代码, Dll 还进行了混淆. 没有办法,上网找解决办法. 还真有: de4dot主要用来反混淆 用法:dll文件直接拖到de4dot.exe会生成另外一个  文件名+c

Unity手游之路<三> 基于Unity+Java的聊天室源码

http://blog.csdn.net/janeky/article/details/17233199 项目介绍 这是一个简单的Unity项目,实现最基本的聊天室群聊功能.登录聊天室后,用户可以输入信息进行发言,其他人可以收到消息.玩家还可以更改昵称.项目详细描述的前后端Socket通信,编码,解析二进制流的过程. 这个项目的主要目标有几个: 1.实现Unity的前后端通信进制          2.学习Protobuf的应用 最终的效果 前端            a.网络通信NetClie

Mustache.js前端模板引擎源码解读【二】

上一篇解读完解析器的代码,这一篇就来解读一下渲染器. 在之前的解读中,解读了parseTemplate如何将模板代码解析为树形结构的tokens数组,按照平时写mustache的习惯,用完parse后,就是直接用 xx.innerHTML = Mustache.render(template , obj),因为此前会先调用parse解析,解析的时候会将解析结果缓存起来,所以当调用render的时候,就会先读缓存,如果缓存里没有相关解析数据,再调用一下parse进行解析. Writer.proto

iOS网易云音乐首页源码、动画引擎源码等

iOS精选源码 自己维护的框架, 超级多功能 图片选择SDK:支持多选,相册选择,预览,网络图预览 一款可以简单实现长按拖拽重排的 UICellCollectionView Cell框... 动画引擎 FXAnimationEngine MJCIOS/MJCSegmentInterface(分段界面框架) TYCyclePagerView iOS上的一个无限循环轮播图组件 首页广告视图 SGAdvertScrollView SliderView-自定义分段标签滚动视图,集成使用简单 轻巧便捷的t