Unity 2019.3

面向程序员的新功能和更新

了解Unity 2019.3为开发人员提供的新内容,包括对DOTS的重大更新、改进的版本控制、可配置的进入游戏模式、序列化改进、物理更新等。

更新内容

以下是针对程序员工具的主要更新的概述。有关完整详情,请参阅发行说明

DOTS游戏代码更新

使用新版本的DOTS包减少样板代码的编写量。使用简单的[GenerateAuthoringComponent]属性替换自定义创作组件,使用更简洁但一点也不慢的Entities.ForEach()(现在使用Burst编译器C#作业系统)替换那些冗长的IJobForEach和IJobForEachWithEntity构造。

要开始以新方式编写DOTS代码,请从Package Manager安装实体包(预览版)。

DOTS_game_code_update.cs (C#)
using System;
using System.Collections;
using System.Collections.Generic;
using Unity.Entities;
using Unity.Jobs;
using Unity.Sample.Core;
using Unity.Transforms;
using UnityEngine;
[GenerateAuthoringComponent]
struct Velocity : IComponentData
{
	public float value;
}
class ApplyVelocitySystem : JobComponentSystem
{
	protected override JobHandle OnUpdate(JobHandle inputDeps)
	{
		float deltaTime = Time.deltaTime;
		return Entities.ForEach((ref Translation translation, in Velocity velocity) =>
		{
			translation.Value += velocity.Value * deltaTime;
		}).Schedule(inputDeps);
	}
}
了解详情

序列化改进

新的SerializeReference属性让您能够将C#类序列化为引用而不是值类型。这意味着您可以让POCO(普通旧式C#对象)相互引用,从而简化表达和管理复杂数据结构(例如图和树)的代码。

此外,它还支持字段包含多态数据。例如,类型为List<IAnimal>的列表可以包含狗(class Dog : IAnimal{})和猫(class Cat : IAnimal{})。

现在,标记为序列化为引用的字段可以从根本上表达null值。以前,序列化null字段将始终使用该类型的默认构造函数对其进行反序列化。

以前,非Unity类型的序列化将忽略多态。在Unity 2019.3中,多态序列化允许您维护以前无法完成序列化过程的对象引用,并更正确地引用继承链。

Serialization_improvements.cs (C#)
using System;
using System.Collections.Generic;
using UnityEngine;

public interface IShape {}
[Serializable]
public class Cube : IShape
{
    public Vector3 size;
}
[ExecuteInEditMode]
public class BuildingBlocks : MonoBehaviour
{
    [SerializeReference]
    public List<IShape> inventory;
   void OnEnable()
    {
        if (inventory == null)
        {
            inventory = new List<IShape>()
            {
                new Cube() {size = new Vector3(1.0f, 1.0f, 1.0f)}
            };
            Debug.Log("Created list");
        }
        else
            Debug.Log("Read list");
    }
}
了解详情

通过可配置的进入游戏模式加快迭代速度

当前,在Editor中进入游戏模式时,Unity将执行两个操作:重置脚本状态(域重新加载)和重新加载场景。这需要一些时间,当您的项目变得更为复杂时,Unity Editor进入游戏模式的速度可能会变慢。因此,我们在Project Settings > Editor > Enter Play Mode options中引入了可配置的进入游戏模式(实验性功能)。

这些选项允许您在没有代码更改时从“进入游戏模式”进程禁用域和/或场景重新加载。根据我们的测试结果,更改这些设置可以节省50-90%的迭代时间(具体取决于您的项目)。

有关在禁用域重新加载后如何正确修改脚本的更多详细信息,请参阅文档中的如何配置游戏模式

如果您想在进入游戏模式前重置游戏状态,还可以通过API和回调来访问该功能。

目前,该功能处于实验阶段,我们期待在论坛上听到您的反馈。

了解详情

PhysX库从v3.4升级到v4.1

我们将PhysX库从v3.4升级到了v4.1。这包括新的Temporal Gauss-Seidel解算器,可使关节对过度拉伸有更强的抗性,并避免以前在模拟过程中看到的某些不稳定行为。要启用新的解算器,请转到Project Settings > Physics

我们还公开了新的粗筛阶段自动框修剪算法,该算法可自动计算世界边界和细分数量。这是对现有多框修剪算法的升级。

此外,桌面平台还提供了更快的网格中间阶段算法。它不需要构建资源密集型加速结构(R树),这对于运行时生成的内容很有用,因为它将减少MeshCollider的实例化时间。

此外,我们还添加了一个新的API,以允许对MeshCollider的网格延迟烘焙。您可以将计算密集型网格烘焙过程隐藏在加载屏幕或过渡场景(例如冒险游戏中的对话场景)中。该API是线程安全的,因此您可以从主线程(包括通过C#作业系统)调用该函数,以同时烘焙多个网格。

有关更多信息,请参阅NVIDIA的PhysX 4.1 SDK指南中的“从PhysX SDK 3.4迁移到4.0”。

了解详情

性能分析器改进:可配置的帧数

在2019.3之前,通过“Profiler”窗口调查性能时,您一次可以查看300帧的分析数据。有时,这无法给您足够的时间捕获您真正关心的帧。

可配置的帧数让您可以扩展该捕获窗口。现在,您可以在“Preferences”窗口中配置需要“Profiler”窗口显示的帧数(300-2000)。

了解详情

性能分析器改进:Player中的深度性能分析支持

通过此更新,您可以在“Build”窗口或BuildPlayer API中为所有Player启用深度性能分析支持。

构建具有深度性能分析支持的Player时,您可以记录进入和退出C#方法时的时间戳。但是,该C#检测可能会带来性能开销,因此我们添加了按Player将其关闭的选项。

了解详情

性能分析器改进:Player中的托管分配调用堆栈支持

托管分配跟踪和分析是Unity性能分析器的一项重要功能。
连续的托管分配会引发垃圾回收(GC)操作,导致多帧延迟,影响游戏的流畅度。在使用Unity开发游戏时,了解分配的发生时间以及它们在代码中的起源是必不可少的信息。

在2019.3中,我们在Player中引入了托管分配的调用堆栈。这让您可以在对Player进行性能分析时查看导致GC分配的C#函数。

可以使用“Call Stacks”开关启用该选项。

了解详情

版本控制改进

Unity 2019.3还包括对版本控制支持的大幅修改。

这包括许多UX和集成方面的改进以及针对Perforce集成的修复,例如在丢失Perforce连接后自动尝试重新连接。

现在,版本控制栏位于“Inspector”窗口顶部,让您能够执行其他操作(例如添加、锁定、解锁和提交),并且包含其他改进。

此外,在非签出资源的“Inspector”中,现在您可以通过单击右键来复制禁用的Inspector字段的值。

有关所有UI改进和修复的更多详细信息,请查看发行说明

查看发行说明

Addressables

该版本包括新的Addressable Asset System(即Addressables),它让您可以轻松地通过“地址”加载资源,同时通过简化内容包创建和部署来处理资源管理开销。简而言之,Addressables使您的团队能够有效地管理复杂的实时内容。

开始

网络代码

DOTS示例中使用的FPS网络代码是建立在DOTS之上的,可轻松创建具有类似架构的网络游戏。它包括客户端预测、授权服务器、插值和滞后补偿。

通过Tim Johansson的Unite演讲了解FPS网络代码。

了解详情

立即下载Unity 2019.3

立即使用所有上述功能以及更多。

我们使用 Cookie 来确保为您提供网站的最佳体验。有关更多信息,请访问我们的 Cookie 政策页面

明白了