本页面列出了从 Unity 2017 LTS 升级到 Unity 2018 LTS 时可能对现有项目造成影响的更改。
在 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 目录。
flex-grow
、flex-shrink
和 flex-basis
的参数。flex-shrink 和 flex-basis 参数是可选参数。如果省略,flex-basis 默认为 0,flex-shrink 默认为 1。flex: N
等同于 flex N 0 auto
。现在遵循 CSS 标准,等同于 flex: N 1 0
。为了保留旧语义,您应该在 USS 文件中将所有 flex: N
指令替换为 flex: N 0 auto
。物理行为已改变,一些项目的行为可能会不同于新版本。特别是以下情况:
Unity 2018.3 包含一些粒子错误修复,这可能会影响在以前版本中创建的项目。
在 2018.3 版之前,Unity Editor 在编译项目中的 C# 文件时使用 Mono C# 编译器 (mcs)。从 2018.3 版开始,以新脚本运行时 (.NET 4.x Equivalent) 为目标的项目使用 Roslyn C# 编译器 (csc)。切换到 Roslyn 后可能会发现行为差异:
csc.rsp
。请参阅 PlatformDependentCompilation。在 Editor 中无法再编译 UnityScript (.js) 和 Boo (.boo) 脚本文件。
有关更多信息,请参阅发表于 2017 年 8 月的这篇博客文章;并可使用 unityscript2csharp 工具将 UnityScript 转换为 C#。
Animator 根运动播放功能已稍作更改,旨在纠正在 Animation 窗口中创作根运动动画 (Root Motion Animations) 时出现的某些不一致之处。
情况 | 生成根运动 | Animator.applyRootMotion | 2018.2 | 2018.3 和 2018.4 (LTS) |
---|---|---|---|---|
A | 是 | 是 | 在根变换 (Root Transform) 上累计应用根运动。 | 与 2018.2 相同 |
B | 否 | 否 | 应用 AnimationClip 中编写的位置 (Position)、旋转 (Rotation) 和缩放 (Scale) 曲线。 | 与 2018.2 相同 |
C* | 是 | 否 | 无根变换运动 | 应用 AnimationClip 中编写的位置 (Position)、旋转 (Rotation) 和缩放 (Scale)。 |
D* | 否 | 是 | 无根变换运动 | 在根 (Root) 上累计应用根运动。 |
对于情况 C 和 D,要在 2018.3 中获得相同的结果,您需要实现 OnAnimatorMove,然后在不想应用根运动的情况下放弃 Animator.deltaPosition
和 Animator.deltaRotation
。
如果项目使用 applyRootMotion
使根变换上的位置 (Position)、旋转 (Rotation) 和缩放动画 (Scale Animation) 进行“静音”,则需要手动覆盖根变换 (Root Transform) 属性。
UIElements.ContextualMenu
菜单操作回调现在接受 ContextualMenu.MenuAction
参数而不是 EventBase
参数。
ContextualMenu.InsertSeparator
接受一个额外的 string
参数。
此功能在 Unity 5.1 中已弃用,现已删除。在 Unity 2018.2 版的项目中不能再使用此功能。
请参阅多玩家和联网部分以了解与 Unity 网络功能相关的更多信息。
具有实际透明度时,Photoshop 会调整像素颜色以将像素颜色与哑光(背景)颜色混合。在我们的如何准备 Alpha 通道文档中介绍了正确准备 Alpha 通道的过程。
可以忽略此文档中介绍的扩张,重要的是文档中指出,您会希望拥有包含单独 Alpha 通道/遮罩的“不透明”图像(而不是拥有透明度)。Unity 以前会调整颜色来“移除”哑光,但从 2018.2 版开始已经停止了此功能。如果您的 PSD 具有透明度,则可能会开始看到边缘的白色。要解决此问题,请参阅上面的手册链接,并创建一个实际的 Alpha 通道(而不是透明度)。
在以前的版本中,禁用或销毁游戏对象后,将停止其子 MonoBehaviours 上所有正在运行的协程。但是,在某些情况下,从此期间内调用的方法(例如,OnBecameInvisible()
)进行启动的协程在以前是允许启动的。这种情况导致了与组件顺序相关的行为,在某些情况下会导致崩溃。
在 Unity 2018.1 版中,在禁用或销毁游戏对象期间返回的协程将不再启动。
BuildPipeline API(例如 BuildPipeline.BuildPlayer
和 BuildPipeline.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.wantsToQuit
和 Application.quitting
。通过监听这些事件,即可在 Unity 独立平台播放器退出时获得通知。播放器意图退出时调用 Application.wantsToQuit
。wantsToQuit
的监听器必须返回 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;
}
}
此变化影响以下运行时平台:WSAPlayerX86、WSAPlayerX64 和 WSAPlayerARM。
目前没有替代项。
可查询一个新的 TouchScreenKeyboard.status 来涵盖已弃用状态和更多其他状态。
在 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 回调接口 IPreprocessBuild
、IPostprocessBuild
和 IProcessScene
已更改,现在要求传入 BuildReport
对象。这取代了以前的构建路径/目标平台参数;如果要实现这些接口,需要更改代码。
构建路径和目标平台都是可以通过 BuildReport
对象进行访问的。构建路径现在是 report.summary.outputPath
,而目标平台是 report.summary.platform
。
以前使用专用导入器来导入位于插件文件夹中的资源(例如,目录中扩展名为 .bundle、.plugin 或 .folder 的资源)。比如,通过纹理导入器导入纹理,通过音频导入器导入 AudioClips 等等。现在使用默认导入器来导入所有这些资源,这意味着您将不能像以前那样引用这些资源,因为它们不再具有专门的类型(纹理、AudioClip 等)。插件文件夹包含在资源包中,因此除非使用插件访问方法,否则无法从外部访问其中的资源。
要继续使用这些资源,必须将它们移出插件文件夹。
用于将轴心偏移应用于网格的数学公式以前不正确,与用于公告牌粒子的方式不一致。为了实现正确缩放,轴心偏移应该乘以粒子大小,因此轴心偏移 1 等于粒子的一个完整宽度。
对于网格,该大小以前被平方,这意味着轴心大小基于平方后的粒子大小。因此,在包含各种大小的粒子的系统中,无法获得一致结果。
对于使用相同大小的粒子的系统,可以对公式进行逆向工程来确定需要将轴心偏移值调整多少才能补偿此行为变化:
旧公式:__offset = size * size * pivot__
新公式:__offset = size * pivot__
因此,如果所有粒子的大小相同:
newOffset = pivot / size
在粒子大小不同的系统中,需要对相关系统进行可视化重估。
从 2018.1 版开始,Unity 中的 GPU 实例化渲染支持全局光照 (GI)。每个 GPU 实例可支持来自不同光照探针、一个光照贴图(但为图集的不同区域)或一个光照探针代理体组件(为包含所有实例的空间体积进行烘焙)的 GI。标准着色器和表面着色器自动随附这些更改,但是您需要更新自定义着色器代码才能启用这些功能。
UnityEditor.IMGUI.Controls 命名空间中的复杂手柄(例如 BoxBoundsHandle、CapsuleBoundsHandle、SphereBoundsHandle、ArcHandle 和 JointAngularLimitHandle)具有可以分配值的委托,从而改变其控制点的外观。以前,将 null 值分配给这些委托将回退到默认行为。现在,为它们分配 null 值不会导致任何行为,因此更容易禁用特定控制手柄。如果需要将控制手柄重置为其默认行为,现在每个类分别有默认方法的公共 API 点。
现在,编译“不安全”的 C# 代码需要在预定义程序集(例如 Assembly-CSharp.dll)的 Player Settings 中以及程序集定义文件程序集的 Inspector 中启用 Allow ‘unsafe’ code 选项。启用此选项会让 Unity 在编译脚本时将 /unsafe 选项传递给 C# 编译器。