适用于资深程序员的Unity脚本编写教程

对于刚接触Unity的程序员

在Unity中,您可以使用脚本开发游戏或其他实时交互式内容的几乎每个部分。Unity支持使用C#编写脚本。在Unity中,构建C#脚本的主要方式有两种:一是面向对象的设计,这是传统且使用最广泛的方法;二是面向数据的设计,适用于特定用例,现已在Unity中可用,通过我们新的高性能多线程面向数据的技术堆栈(DOTS)实现。

您是从C++背景转到Unity来的吗?

Unity支持C#,这是一种类似于Java或C++的行业标准语言。

与C++相比,C#更易于学习。此外,它是一种“托管语言”,也就是说它会自动进行内存管理:分配/释放内存、覆盖内存泄露等。

一般来说,如果您想早一点制作出一款游戏,那么C#比C++更好,您可以之后再学习更高级的编程技能。

Unity中的游戏对象和组件

使用Unity开发的所有游戏玩法和互动性都建立在三个构建基块之上:游戏对象、组件和变量。

游戏中的任何对象都是游戏对象:角色、光源、特效、道具等等。

组件
游戏对象本身并不能发挥作用。要让游戏对象真正发挥作用,还需要通过添加组件为其分配属性。

组件用于定义和控制相关联的游戏对象的行为。一个简单示例是创建光源,这会涉及将光源组件附加到游戏对象(请参阅下文)。或者,将刚体组件添加到对象以使其下落。

组件可以有任意数量的可编辑属性(也称为变量),这些属性均可通过Unity editor中的Inspector窗口和/或通过脚本进行调整。在上面的示例中,光源的部分属性是范围、颜色和强度。

Unity中的脚本组件

虽然Unity的内置组件可能用途很广泛,但是您很快就会发现,必须超越组件可提供的功能才能实现自己的游戏逻辑。为此,您需要使用脚本实现自己的游戏逻辑和行为,然后将这些脚本作为组件添加到游戏对象。为了连接到Unity的内部架构,每个脚本将实现一个类,此类从称为MonoBehaviour的内置类派生而来。

利用脚本组件可以实现很多功能:触发游戏事件、检查碰撞、应用物理属性、响应用户输入等,不一而足。有关更多信息,请参阅Unity Scripting API

Unity Megacity Demo built on DOTS

使用DOTS进行面向数据的设计的好处

传统的“游戏对象-组件”概念仍将继续有效,因为它易于被程序员和非程序员理解,并且易于构建直观的UI。当您将刚体组件添加到游戏对象时,该游戏对象会开始下落;将光源组件添加到游戏对象时,它将开始发光。依此类推。 

但是,该组件系统是基于面向对象的框架编写的,随着硬件的不断发展,它给开发人员带来了一系列难题,例如缓存和内存的管理。

组件和游戏对象是“重型C++”对象。所有游戏对象都有一个名称。它们的组件是基于C++组件的C#包装器。这使得它们易于使用,但可能会降低性能,因为它们最终可能以非结构化方式存储。这种C#对象可能存储在内存中的任意位置。C++对象也可能存储在内存中的任意位置。它们可能不在同一块连续的内存空间中。每次将任何内容加载到CPU中进行处理时,都必须从多个位置获取所有内容。这可能导致操作缓慢且效率低下,因此需要通过多种方法进行优化。

为了解决上述性能问题,我们正在使用高性能、多线程的面向数据的技术堆栈(也称为DOTS)重新构建Unity的核心基础(当前处于“预览”阶段)。

使用DOTS,您的游戏可充分利用最新的多核处理器。它包含以下部分:

在DOTS中,新的组件系统是ECS;在该新系统中,您将使用实体进行使用游戏对象(在使用传统的面向对象的方式时)进行的操作。组件仍称为组件。它们的关键区别在于数据布局。有关更多信息,请参阅博客文章“关于DOTS:实体组件系统”。

Unity Megacity Demo built on DOTS

充分利用现代硬件

使用ECS不仅能让您在设计方面实现更好的游戏编程,还能让您占据利用Unity C#任务系统和Burst编译器的有利地位,助力您充分利用现代硬件。

DOTS的多线程系统支持您创建可在各种硬件上运行的游戏,构建元素更多和模拟更复杂的丰富的游戏世界。反过来,高性能的代码有助于优化玩家移动设备上的热控制和电池寿命。通过从面向对象的设计转向面向数据的设计,您可以更轻松地重用代码,其他人也能更轻松地理解和处理代码。

由于DOTS的某些技术仍处于“预览”阶段,我们建议开发人员使用它解决项目中的特定性能难题,而不要基于它构建整个项目。请查看本页面底部的“更多资源”部分,以获取指向DOTS关键资源的链接。

The Unity Profiler for optimizing performance

Unity中的调试

Unity中的调整和调试效率很高,因为在开发者开发时,所有游戏变量均显示在右侧,随时可以修改,不需要编写一行代码。您可以随时暂停游戏,也可以逐行调试代码,每次执行一个语句。

下面是一些很好的资源,可帮助您进一步了解如何在Unity中进行优化:

性能分析器 

Profile Analyzer

内存性能分析器 

了解Unity中的优化

优化图形性能

一般最佳实践(包括有关优化Unity UI系统的丰富技巧)

Unity中的脚本后端

.NET:Unity已经对脚本使用了本身支持C#的标准Mono运行时的实现方案。Unity当前附带适用于Mac的Visual Studio,而不是macOS上的MonoDevelop-Unity。在Windows上,Unity附带Visual Studio。

Unity中的.NET 4.6脚本运行时支持许多令人振奋的C#新功能和C# 6.0及以后版本中的调试功能。C#新功能还会带来非常好的C# IDE体验。

IL2CPP:这是一种通过Unity开发的脚本后端,在为某些平台构建项目时可用于替换Mono。如果选择使用IL2CPP构建项目,Unity在创建本机二进制文件(例如,.exe、apk、.xap)之前会根据您所选的平台将脚本和程序集内的IL代码转换为C++代码。

请注意,为iOS和WebGL构建项目时,IL2CPP是唯一可用的脚本后端。

通过扩展编辑器自定义Unity

作为一名工程师,您在Unity中可以获得很大的灵活性,因为就像标准编辑器中的Inspector、Scene和任何其他内置窗口一样,您可以使用自己的自定义窗口扩展编辑器。您还可以将自己的工具添加到Unity,从而为您团队的独特工作流程和需求提供支持,最终提高效率。

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

明白了