先来认识 Unity。
作为游戏制作社区极为青睐的开发平台,Unity允许开发人员使用丰富的2D/3D图形和动画表现游戏内容。随着时间推移,Unity还吸纳了团队合作所必需的工具和实践。所以,尽管近期刚刚亮相的竞争平台“虚幻5”引擎带来了电影级别的视觉效果,但Unity凭借着自己丰富多元、易于管理的模块选项仍牢牢占据着可观的市场份额。
说起Unity,很多朋友可能首先想到的就是它在游戏设计和制作方面的强大能力。但除此之外,Unity在PC、Mac、移动和Web等流行计算平台上也能跟C#和.NET Standard完美融合,带来理想的跨机开发体验。再有,Unity也能轻松创建出具有高级视听演示和用户交互机制的应用程序,同时帮助开发者摆脱源代码控制、管道、集成测试或LTM发布之类的麻烦事。
之前说起游戏开发,很多程序员会觉得那是一片充满未知的陌生土地。没错,虽然都是在编写代码,但游戏开发和常规软件开发根本就不在一条战线上。但多年以来,这两条战线开始逐渐交汇,“游戏化”也成为软件开发中的新兴趋势、强调以优秀的UI与良好反馈延长用户的使用时间。至于风头正劲的元宇宙概念,无论大家看好还是唱衰,游戏开发平台都将成为开拓这片天地的重要工具。
在本文中,我们就具体聊聊关于Unity开发的那些事儿。虽然Unity不是款简单的工具,但也足以成为一种新的、行之有效的工作方式。下面,咱们就从实现基础说起。
01/ Unity开发:基础知识 /
Unity开发仍在动态发展,新版本中也经常出现一些跟老版本有所冲突的设计。但无论如何,Unity在处理添加/预览组件和工具包管理系统时,始终把一致性放在第一位。下面的演示也仅使用Unity内置工具包。
对于大多数刚刚接触Unity的开发者来说,需要克服的第一道障碍就是我们无法以纯编程方式完成所有操作。Unity也有前端和代码编辑器,大部分操作也确实可以通过代码实现,但对象之间的关系会由Unity自主把握。跟其他设计痕迹较强的平台一样,Unity也很坚持自己的“行事风格”。
那么,我们怎么才能在屏幕上跑起一个简单程序呢?准备工作如下:
· 某一版本的Unity。
· Visual Studio,熟练的C#开发知识。
· 稳定情绪,因为不知道哪一秒心态会崩。
Unity将GameObject 设定为基本单元,也就是一个个包含不同组件的容器。我们可以通过GameObject 层级结构建立起场景。
02/ 构建Unity程序 /
在本教程中,我们不会涉及太多复杂的内容。对于演示项目,我们的目标很简单:按下按钮,并在该按钮上显示文本。
这可以说是最简单的功能设计了。对于任何带有UI的开发平台,按下按钮就相当于响应“Hello World”。但以小见大,我们可以从中体会到Unity的设计规则。
这里先从Unity的一项偏好设置说起:
Unity跟Visual Studio直接关联。这很重要,能保证我们无需干预就创建出风格正确的C#解决方案。
总之,回到主事件。我们的Unity应用程序如下:
窗口面板当然可以重新排布,这里仅显示典型设置。左侧的层级面板显示出了我为演示场景构建的内容——整个过程非常简单,鼠标点击就能操作完成。这里可以看到一个Canvas GameObject(也就是名为Canvas的Unity对象),其中包含一个Button GameObject,里面又有一个Text GameObject。可以看到,该按钮已经显示在了屏幕中央位置。请注意,我们当前处于“Game”选项卡内,从右侧的Inspector面板可以看到当前按钮里已经包含有多个组件。
Canvas代表按钮所在的背景GameObject。Unity会对2D应用程序做出一些简化,但这里同样可以使用摄像机、或者设置按钮的图像和样式——但简单起见,这里我们不做任何调整。
下面来看Button的组件列表:
最下面的两条需要关注。首先,这里提到一个名为“ButtonHandler”的脚本,其映射到某个C#类。所以当我们要求Unity创建脚本时,它会首先在Visual Studio中创建适当的解决方案,之后再启动一个模板。我将此模板编写成如下形式:
这里没什么特别重要的。首先,ButtonHandler类负责扩展MonoBehavior——所以我们才要把它加到Unity代码中。还有一个名为SetText的方法,其中包含一条字符串参数。我们找到这个Text组件,然后设置文本内容。
请注意,我是在用组件层级来查找Text组件。该脚本本身会被视为Button GameObject中的一个组件。所以就相当于有一个名为“Text”的子GameObject,其中包含一个Text组件(Inspector也能证实这种关系)。因为我们的程序很简单、只有一个Text组件,所以查找起来非常轻松。
现在,我们再回顾一下之前提到的Button组件。它公布的就是我所订阅的OnClick事件。在选中Button对象本身时(直接拖入即可),Unity会询问我想调用哪个方法、使用什么参数。可以看到,这里我调用了SetText,随附的字符串为“The New Stack”。
在运行之前,让我们再回顾一下整个过程:
· Unity场景(Scene)就是我们的虚拟工作场所。
· GameObject是容纳组件的通用容器。
· 我们在Canvas上放置一个按钮,按钮中包含文本显示。
· 代码类扩展了MonoBehavior,让它可以处理Unity对象。代码本身属于脚本组件。
· 这里使用的是大家熟悉的监听器模式,以OnClick为触发器。
· 各GameObject的组织方式由Unity负责管理,而按钮被按下后的效果由代码负责响应。
下面我们运行程序,并单击按钮查看结果:
请注意,我们需要按下“play”按钮并观察Game视图选项卡。在这里单击按钮后,结果如上图所示。
接下来,我们就可以继续构建应用程序并生成可执行文件。但本文只为讲解Unity的基本使用操作,所以不再多做延伸。请大家关注Unity中内容和代码中内容之间的相互作用。我们可以用多种方式实现同样的功能效果,但都要用到这种相似的基本关系。
在下篇文章中,我们将演示新近发布的Unity UI模块,它在观感上跟HTML和CSS很像。当然,还有更多Unity乐趣等着去发掘,咱们下期见!