适用于资深程序员的Unity脚本编写教程
对于刚接触 Unity 的程序员
在Unity中,您可以使用脚本开发游戏或其他实时交互式内容的几乎每个部分。Unity 支持使用 C# 编写脚本,并且在 Unity中构建 C# 脚本的主要方式有两种:面向对象设计(这是传统且使用最广泛的方法)和面向数据的设计(现在可在 Unity 中针对特定用例通过我们新的高性能多线程 面向数据技术堆栈 (DOTS)实现)。
Unity支持C#,这是一种类似于Java或C++的行业标准语言。
与C++相比,C#更易于学习。此外,它是一种“托管语言”,也就是说它会自动进行内存管理:分配/释放内存、覆盖内存泄露等。
一般来说,如果您想早一点制作出一款游戏,那么C#比C++更好,您可以之后再学习更高级的编程技能。
虽然Unity的内置组件可能用途很广泛,但是您很快就会发现,必须超越组件可提供的功能才能实现自己的游戏逻辑。为此,您需要使用脚本实现自己的游戏逻辑和行为,然后将这些脚本作为组件添加到游戏对象。为了连接到Unity的内部架构,每个脚本将实现一个类,此类从称为MonoBehaviour的内置类派生而来。
利用脚本组件可以实现很多功能:触发游戏事件、检查碰撞、应用物理属性、响应用户输入等,不一而足。有关更多信息,请参阅Unity Scripting API。
传统的“游戏对象-组件”概念仍将继续有效,因为它易于被程序员和非程序员理解,并且易于构建直观的UI。当您将刚体组件添加到游戏对象时,该游戏对象会开始下落;将光源组件添加到游戏对象时,它将开始发光。依此类推。
但是,该组件系统是基于面向对象的框架编写的,随着硬件的不断发展,它给开发人员带来了一系列难题,例如缓存和内存的管理。
组件和游戏对象是“重型C++”对象。所有游戏对象都有一个名称。它们的组件是基于C++组件的C#包装器。这使得它们易于使用,但可能会降低性能,因为它们最终可能以非结构化方式存储。这种C#对象可能存储在内存中的任意位置。C++对象也可能存储在内存中的任意位置。它们可能不在同一块连续的内存空间中。每次将任何内容加载到CPU中进行处理时,都必须从多个位置获取所有内容。这可能导致操作缓慢且效率低下,因此需要通过多种方法进行优化。
为了解决上述性能问题,我们正在使用高性能、多线程的面向数据的技术堆栈(也称为DOTS)重新构建Unity的核心基础(当前处于“预览”阶段)。
使用DOTS,您的游戏可充分利用最新的多核处理器。它包含以下部分:
在DOTS中,新的组件系统是ECS;在该新系统中,您将使用实体进行使用游戏对象(在使用传统的面向对象的方式时)进行的操作。组件仍称为组件。它们的关键区别在于数据布局。您可以在博客文章“中阅读更多相关信息”关于 DOTS:实体组件系统
使用ECS不仅能让您在设计方面实现更好的游戏编程,还能让您占据利用Unity C#任务系统和Burst编译器的有利地位,助力您充分利用现代硬件。
DOTS的多线程系统支持您创建可在各种硬件上运行的游戏,构建元素更多和模拟更复杂的丰富的游戏世界。反过来,高性能的代码有助于优化玩家移动设备上的热控制和电池寿命。通过从面向对象的设计转向面向数据的设计,您可以更轻松地重用代码,其他人也能更轻松地理解和处理代码。
由于DOTS的某些技术仍处于“预览”阶段,我们建议开发人员使用它解决项目中的特定性能难题,而不要基于它构建整个项目。请查看本页面底部的“更多资源”部分,以获取指向DOTS关键资源的链接。
Unity中的调整和调试效率很高,因为在开发者开发时,所有游戏变量均显示在右侧,随时可以修改,不需要编写一行代码。您可以随时暂停游戏,也可以逐行调试代码,每次执行一个语句。
下面是一些很好的资源,可帮助您进一步了解如何在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:IL2CPP:这是一种通过Unity开发的脚本后端,在为某些平台构建项目时可用于替换Mono。如果选择使用IL2CPP构建项目,Unity在创建本机二进制文件(例如,.exe、apk、.xap)之前会根据您所选的平台将脚本和程序集内的IL代码转换为C++代码。
请注意,为iOS和WebGL构建项目时,IL2CPP是唯一可用的脚本后端。