本节书摘来异步社区《Unity 5.x游戏开发实战》一书中的第2章,第2.2节,作者: Alan Thorn 译者: 李华峰 责编: 胡俊英,更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.2 Unity中的C#脚本
为游戏定义逻辑、规则和行为的时候,往往需要使用到脚本。如果想将那些静态的、无生命的场景和对象转换成为可以进行交互的环境和对象,那么开发人员就需要编写代码。这些代码定义了这些物体在遇到了指定情况之后,应该做出什么样的反应。金币采集游戏也需要编写代码才能实现所有的功能。这个游戏需要实现3个主要的 功能:
- 能够感知玩家是否收集到金币;
- 在游戏进行中,能够及时了解到玩家收集的金币数量;
- 能确定游戏时间是否已经结束。
在Unity中并没有包含一个能实现上述功能的模块。所以必须自己来编写一些代码来实现这些功能。Unity中支持两种语言,即UnityScript语言(有时候称之为JavaScript语言)和C#语言。这两种语言功能都很强大,但是本书中主要采用的是C#语言。这是因为从发展的趋势来看,JavaScript的使用率将会逐渐下降。现在开始对这个主要功能进行编程。首先在项目(Project)面板的空白区域单击鼠标右键,然后在弹出的上下文菜单中依次选择“Create | C# Script”,就可以创建一个新的脚本文件。另外,也可以从应用程序菜单处依次选择“Assets | Create | C# Script”来创建一个新的脚本文件,如图2.11所示。
当创建了脚本之后,需要为脚本起一个描述性的名字。本书起的名字为“Coin.cs”。在Unity中,每一个脚本文件都对应一个与其同名的类。因此,“Coin.cs”文件对应的就是“Coin”类。这个“Coin”类将封装一个金币的所有行为,并最终会附加到场景中的金币上,如图2.12所示。
在对象检查(Inspector)面板中双击Coin.cs,就可以使用MonoDevelop打开这个文件。MonoDevelop是一款Unity自带的第三方IDE应用,它可以实现对游戏中的代码进行编写和修改。当一个文件在MonoDevelop中打开之后,它的内容就会如代码示例2.1所示的在MonoDevelop中显示出来。
代码示例2.1:
using UnityEngine;
using System.Collections;
public class Coin : MonoBehaviour
{
// Use this for initialization
void Start () {}
// Update is called once per frame
void Update () {}
}
注意 代码示例的下载
可以使用自己的账号从http://www.packtpub.com .处下载本书的代码示例。无论你在哪里购买的本书,都可以访问http://www.packtpub.com/support 并进行注册,书中的资源也可以通过电子邮件的形式发送给你。
可以按照如下步骤来下载这些文件:
- 使用电子邮箱地址在页面上注册,如果已经注 册过了,那么直接登录即可;
- 找到并使用鼠标单击位于页面顶端的“SUPPORT”;
- 单击“Code Downloads & Errata”;
- 在搜索search框中输入要下载资源的书的名字;
- 选择要下载资源的书;
- 在下拉菜单中选中购买本书的地点;
- 单击“Code Download”。
将这些文件下载了之后,要确定解压缩软件已经更新到了最新的版本:
- WinRAR / 7-Zip for Windows;
- Zipeg / iZip / UnRarX for Mac;
- 7-Zip / PeaZip for Linux。
默认情况下,所有新创建的类都派生自“MonoBehavior”类,这个类中定义了一些对所有组件都通用的函数。“Coin”类具有两个自动生成的函数,也就是Start()和Update()。这些函数都是由Unity自动调用的事件。当游戏对象(关联了这个游戏脚本)在场景中创建时,就会调用Start()函数。Update()函数会在每一帧被附加了游戏脚本的对象中调用一次。Start()函数主要用来实现代码的初始化,Update()函数主要用来实现那些随着事件推移的行为,例如运动和变化。现在,将新创建的脚本文件与场景中的金币对象进行管理,可以从项目(Project)面板处将“Coin.cs”文件拖曳到金币对象上。当完成以后,一个新的金币组件就被添加到了游戏对象上。这意味着这个脚本已经关联到了游戏对象上,如图2.13所示,一个关联了脚本的游戏对象。
当一个脚本与一个游戏对象关联到一起之后,这个脚本就作为这个游戏对象的一个组件而存在。一个脚本文件可以添加到多个游戏对象上,甚至可以被多次添加到同一个游戏对象上。每个组件都代表着一个单独而且不同的类的实例化。当一个脚本以这种方式添加进来之后,Unity会自动地调用它的函数,例如Start()和Update()。可以在Start()函数中加入一个Debug.Log语句来确认脚本是否能正常工作,这个语句在场景中的游戏对象被创建时在命令行窗口输出一个调试信息。查看如下所示的代码示例2.2。
代码示例2.2:
using UnityEngine;
using System.Collections;
public class Coin : MonoBehaviour
{
// start()是初始化函数
void Start () {
Debug.Log ("Object Created");
}
// Update在每一帧调用一次
void Update () {
}
}
如果按下工具栏上的“Play”键,或者按下键盘上的“Ctrl + P”组合键,来运行这个向游戏对象上添加了前面的那个脚本的游戏,就会在控制台窗口中看到一条内容为“Object Created”的信息,每当这个类进行实例化的时候,都会输出一次(见图2.14)。
现在已经为Coin类创建了最基本的脚本,并且已经将这个脚本成功附加到了金币对象上。接下来,继续编写一些函数,这些函数将会记录采集过的金币信息。