引言

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

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

  1. Unity UGUI图文混排源码(三) -- 动态表情

    这里是根据图文混排源码(二)进一步修改的,其他链接也不贴了,就贴一个链接就好了,第一次看这文章的同学可以先去看看其他几篇文章 Unity UGUI图文混排源码(二):http://blog.csdn. ...

  2. Unity UGUI图文混排源码(二)

    Unity UGUI图文混排源码(一):http://blog.csdn.net/qq992817263/article/details/51112304 Unity UGUI图文混排源码(二):ht ...

  3. Unity UGUI图文混排源码(一)

    Unity UGUI图文混排源码(一):http://blog.csdn.net/qq992817263/article/details/51112304 Unity UGUI图文混排源码(二):ht ...

  4. Chrome V8 引擎源码剖析

    Chrome V8 引擎源码剖析 V8 https://github.com/v8/v8 array & sort https://github.com/v8/v8/search?l=Java ...

  5. ubuntu 14.04.5 编译Android 4.4.4 r1源码(最新)

    本文博客链接:http://blog.csdn.net/qq1084283172/article/details/54426189 吐槽:ubuntu系统真是让人又爱又恨,也有可能是VMware Wo ...

  6. C/C++ Capstone 引擎源码编译

    Capstone 是一个轻量级的多平台.多架构的反汇编框架.Capstone 旨在成为安全社区中二进制分析和反汇编的终极反汇编引擎.Capstone的编译非常简单只需要一步即可轻松得到对应的Lib库文 ...

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

    http://blog.csdn.net/janeky/article/details/17233199 项目介绍 这是一个简单的Unity项目,实现最基本的聊天室群聊功能.登录聊天室后,用户可以输入 ...

  8. Mustache.js前端模板引擎源码解读

    mustache是一个很轻的前端模板引擎,因为之前接手的项目用了这个模板引擎,自己就也继续用了一会觉得还不错,最近项目相对没那么忙,于是就抽了点时间看了一下这个的源码.源码很少,也就只有六百多行,所以 ...

  9. 转: 在Ogre中使用Havok物理引擎(源码)

    作者:CYM 众所周知Ogre则是评价很高的一款图形渲染引擎,Havok则是世界一流的物理引擎,今天花了点时间将两者结合在了一块,做了个Demo 由于国内对Havok的研究似乎很少,网上也找不到多少资 ...

随机推荐

  1. pipenv使用学习

    参考https://realpython.com/pipenv-guide/#package-distribution Pipenv: A Guide to the New Python Packag ...

  2. 由swap引出的局部变量,形参和指针的小问题

    1.第一种实现swap函数的方法是: swap(int a,int b) { Int c = a;a = b;b =c; } 这表面一看确实是实现了整数a,b的交换,当拿来用时发现,结果并不是我们想要 ...

  3. html css 浮层 侧边栏

    2019-7-1 16:02:25 星期一 实现的效果是点击, 然后从左侧滑出, 再点击, 就滑进去 <!DOCTYPE HTML> <html lang="en" ...

  4. [K8s]无yaml文件重启Pod

    在没有pod 的yaml文件时,强制重启某个pod kubectl get pod PODNAME -n NAMESPACE -o yaml | kubectl replace --force -f ...

  5. SQL Server:时间范围查询重叠

    常常碰到要校验数据范围是否存在重叠冲突的情况,典型的场景是房间预订. 假如房间A已经有9月1日-9月10日的预订记录,当其它客人再来预订时,系统必须判断,不能与这个日期范围产生重叠. 有四种情况会产生 ...

  6. LODOP常见问题连接(含常见小问答博文)

    问答大全 纸张打印机 注册 table表格 clodop测试地址 字体 超文本 行间距.字间距 clodop回调函数 条码 页眉页脚 SET……STYLEA 水平居中 简短排查 提示报错 慢进度条 套 ...

  7. 【tensorflow-v2.0】如何查看模型的输入输出流的属性

    操作过程: 1. 查看mobilenet的variables loaded = tf.saved_model.load('mobilenet') print('MobileNet has {} tra ...

  8. 【转帖】HBase基本概念与基本使用

    HBase基本概念与基本使用 https://www.cnblogs.com/swordfall/p/8737328.html 分类: HBase undefined 1. HBase简介 1.1 什 ...

  9. 池化技术之Java线程池

     https://blog.csdn.net/jcj_2012/article/details/84906657 作用 线程池,通过复用线程来提升性能; 背景 线程是一个操作系统概念.操作系统负责这个 ...

  10. TCP Socket 套接字 和 粘包问题

    一.Scoket 套接字 Scoket是应用层(应用程序)与TCP/IP协议通信的中间软件抽象层,它是一组接口.也可以理解为总共就三层:应用层,scoket抽象层,复杂的TCP/IP协议 基于TCP协 ...