使用 Automatic API Updater
升级到 Unity 2017.3

升级到 Unity 2018.1

本页面列出了从早期版本的 Unity 升级到 2018.1 版时可能对现有项目造成影响的更改


在禁用或销毁游戏对象时,从 MonoBehaviour 返回的协程将不再启动。

在以前的版本中,禁用或销毁游戏对象后,将停止其子 MonoBehaviours 上所有正在运行的协程。但是,在某些情况下,从此期间内调用的方法(例如,OnBecameInvisible())进行启动的协程在以前是允许启动的。这种情况导致了与组件顺序相关的行为,在某些情况下会导致崩溃。

在 Unity 2018.1 版中,在禁用或销毁游戏对象期间返回的协程将不再启动。


BuildPipeline API 现在返回 BuildReport 对象,而不是字符串

BuildPipeline API(例如 BuildPipeline.BuildPlayerBuildPipeline.BuildAssetBundles)以前返回字符串。如果构建成功,返回结果为空;如果构建失败,则包含错误消息。

在 2018.1 版中,这种返回结果已被新的 BuildReport 对象(其中包含关于构建过程的更丰富信息)所取代。

要检查构建是否成功,请检索报告对象的 summary 属性,并检查其 result 属性:如果构建成功,该属性将为 BuildResult.Succeeded。例如:

var report = BuildPipeline.BuildPlayer(...);

if (report.summary.result != BuildResult.Succeeded)
{
    throw new Exception("Build failed");
}

播放器退出通知已从消息更改为事件

以前,为了在 Unity 独立平台播放器退出时收到通知,需要在 MonoBehaviour 上实现 OnApplicationQuit 方法,而为了使播放器中止退出,需要调用 Application.CancelQuit

现在引入了两个新事件。这两个事件是 Application.wantsToQuitApplication.quitting。通过监听这些事件,即可在 Unity 独立平台播放器退出时获得通知。播放器意图退出时调用 Application.wantsToQuitwantsToQuit 的监听器必须返回 true 或 false。如果希望播放器继续退出,则返回 true;如果希望播放器中止退出,则返回 false。播放器已确定退出而无法中止时调用 Application.quitting 事件。

已弃用 Application.CancelQuit,请改用 Application.wantsToQuit

using UnityEngine;

public class PlayerQuitExample

{

    static bool WantsToQuit()

    {

        // 是否希望 Editor 退出?

        return true;

    }

    static void Quit()

    {

        Debug.Log("Quitting the Player");

    }

    [RuntimeInitializeOnLoadMethod]

    static void RunOnStart()

    {

        Application.wantsToQuit += WantsToQuit;

        Application.quit += Quit;

    }

}

在 .Net 平台上已弃用 AvatarBuilder.BuildHumanAvatar

此变化影响以下运行时平台:WSAPlayerX86、WSAPlayerX64 和 WSAPlayerARM。

目前没有替代项。


已弃用 TouchScreenKeyboard.wasCanceled 和 TouchScreenKeyboard.done

可查询一个新的 TouchScreenKeyboard.status 来涵盖已弃用状态和更多其他状态。


已从 Unity 安装程序中移除 MonoDevelop 5.9.6,并且在 Unity 中已不再提供其支持。

在 macOS 上,已将 MonoDevelop 5.9.6 替换为 Visual Studio for Mac(作为 macOS 安装程序中的捆绑 C# 脚本编辑器)。在 Windows 上,Visual Studio 2017 Community 现在是与 Unity 一起安装的唯一 C# 脚本编辑器。

安装在 Unity 可执行文件旁边的默认位置时,Unity 在偏好设置中不再将 MonoDevelop 视为“MonoDevelop (built-in)”外部脚本编辑器。未安装且在偏好设置中未选择 C# 代码编辑器时,Unity 使用系统默认应用程序来打开 C# (.cs) 脚本。


BuildPipeline 回调接口现在接受 BuildReport 对象

BuildPipeline 回调接口 IPreprocessBuildIPostprocessBuildIProcessScene 已更改,现在要求传入 BuildReport 对象。这取代了以前的构建路径/目标平台参数;如果要实现这些接口,需要更改代码。

构建路径和目标平台都是可以通过 BuildReport 对象进行访问的。构建路径现在是 report.summary.outputPath,而目标平台是 report.summary.platform


以后不再通过专用导入器来导入位于插件文件夹中的资源

以前使用专用导入器来导入位于插件文件夹中的资源(例如,目录中扩展名为 .bundle、.plugin 或 .folder 的资源)。比如,通过纹理导入器导入纹理,通过音频导入器导入 AudioClips 等等。现在使用默认导入器来导入所有这些资源,这意味着您将不能像以前那样引用这些资源,因为它们不再具有专门的类型(纹理、AudioClip 等)。插件文件夹包含在资源包中,因此除非使用插件访问方法,否则无法从外部访问其中的资源。

要继续使用这些资源,必须将它们移出插件文件夹。


粒子系统网格粒子错误地应用了轴心偏移值

用于将轴心偏移应用于网格的数学公式以前不正确,与用于公告牌粒子的方式不一致。为了实现正确缩放,轴心偏移应该乘以粒子大小,因此轴心偏移 1 等于粒子的一个完整宽度。

对于网格,该大小以前被平方,这意味着轴心大小基于平方后的粒子大小。因此,在包含各种大小的粒子的系统中,无法获得一致结果。

对于使用相同大小的粒子的系统,可以对公式进行逆向工程来确定需要将轴心偏移值调整多少才能补偿此行为变化:

旧公式:__offset = size * size * pivot__

新公式:__offset = size * pivot__

因此,如果所有粒子的大小相同:

newOffset = pivot / size

在粒子大小不同的系统中,需要对相关系统进行可视化重估。


GPU 实例化支持全局光照

从 2018.1 版开始,Unity 中的 GPU 实例化渲染支持全局光照 (GI)。每个 GPU 实例可支持来自不同光照探针、一个光照贴图(但为图集的不同区域)或一个光照探针代理体组件(为包含所有实例的空间体积进行烘焙)的 GI。标准着色器和表面着色器自动随附这些更改,但是您需要更新自定义着色器代码才能启用这些功能。


手柄绘制和大小函数默认值

UnityEditor.IMGUI.Controls 命名空间中的复杂手柄(例如 BoxBoundsHandle、CapsuleBoundsHandle、SphereBoundsHandle、ArcHandle 和 JointAngularLimitHandle)具有可以分配值的委托,从而改变其控制点的外观。以前,将 null 值分配给这些委托将回退到默认行为。现在,为它们分配 null 值不会导致任何行为,因此更容易禁用特定控制手柄。如果需要将控制手柄重置为其默认行为,现在每个类分别有默认方法的公共 API 点。


在 Unity Editor 中编译不安全的 C# 代码现在需要启用一个选项。

现在,编译“不安全”的 C# 代码需要在预定义程序集(例如 Assembly-CSharp.dll)的 Player Settings 中以及程序集定义文件程序集的 Inspector 中启用 Allow ‘unsafe’ code 选项。启用此选项会让 Unity 在编译脚本时将 /unsafe 选项传递给 C# 编译器。


“UnityPackageManager”目录重命名为“Packages”

在 2017.2 和 2017.3 版中,Unity Package Manager 引入了 UnityPackageManager 目录,用于存储名为 manifest.json 的文件。可通过脚本使用以 Packages 开头的虚拟相对路径来访问包内容。

在 2018.1 版中,__UnityPackageManager__ 目录已重命名为 Packages__,使之与打包资源的虚拟相对路径一致。应该将 manifest.json__ 文件自动移到新目录。

因此:

  • 如果项目使用 Perforce 或 Git 之类的版本控制系统 (VCS),可能需要更新其配置来跟踪 Packages 目录,而不是 UnityPackageManager 目录。

  • 如果项目因使用 Nuget(或任何外部包管理器)而需要使用 Packages 目录,则应该更改其配置以使用其他目录。之所以建议执行此操作,是为了消除 Unity Package Manager 在很小的概率下获取包而可能导致编译错误或导入错误等难以调试的问题。

  • 在迁移到新目录后,可以安全删除 UnityPackageManager 目录。



有关 2018.1 版新增功能的详细信息以及更详细的升级说明,请参阅 2018.1 发行说明

使用 Automatic API Updater
升级到 Unity 2017.3