如何使用Unity制作2.5D游戏系列教程(二)
在游戏中添加音效
光有视觉效果还不够,我们还需要一些音效!
一款游戏怎么能够缺少背景音乐?!这时候我们需要提到另外一个人——Kevin Macleod,他是一名伟大的作曲家,在CC license发布了许多电影音乐和游戏音乐。所以如果你想使用他的作品,就必须明确标示出处。
将《The Cannery》下载到你的唱片中,并将“The Cannery.mp3”拖到“项目”面板中的“音频”文件夹中。
我们同样也希望能够循环播放音乐,而这时候我们需要将音乐附加到何种对象上?
让我们将其附加到摄像机上!摄像机也是一种游戏对象,也能够带有其它附加组件。
从“项目”面板中将“The Cannery”拖到“等级”面板中的“主摄像机”中。在“等级”中选择“主摄像机”并在“检查器”中找到音源带,在“循环”的选择框中打勾并将音量设置为“0.20”。
这个步骤非常简单,现在你可以边看游戏场景并享受背景音乐了。
使用Unity创造图形用户界面(GUI)
让我们开始研究GUI。Unity能够给你提供一些标准标签和按钮,但是这些却不是该工具的最大优势。不过我们将使用标签去呈现当前的分数变化;而首先我们将执行分数逻辑。
切换到MonoDevelop。打开PlayerClass.cs并添加一个新属性:
public static int score = 0;
又出现了一个新的属性——“静态”。当我们加载了一个类并且不管是否会出现类实体该属性都将保持不变时,我们便创造出静态属性。除此之外,我们还能够从其它类中获得这一属性——这也是我们为何始终将在静态属性中计分的原因。
接下来添加以下函数以观察分数的更新(也许现在做来并没有意义,但是还是照做吧)——观察我们是如何通过类名称获得分数属性:
public void updateScoreBy(int deltaScore) {
PlayerClass.score += deltaScore;
}
在PlayerClass中再添加以下函数,从而让分数计算能够呈现在屏幕上: void OnGUI() {
GUIStyle style = new GUIStyle();
style.fontSize = 20;
GUI.Label(new Rect(10,10,100,20), “Score:”+PlayerClass.score, style );
}
我们将在GUI图层的每一帧中调用“OnGUI”这一事件处理程序。所以你可以在此画上你在GUI中所需要的一切内容。 GUIStyle便是一种模拟CSS的类,所以你也可以在此使用CSS中的字号,左边距宽等功能,否则你仅仅只能局限于字体大小的设置中。GUI.Label() 是由3个参数构成的函数:标签界限的矩形,绘画线以及文本类型。 这时候我们的任务便是在玩家击中或遗漏时更新分数!打开BombClass.cs并进行如下修改:
/add a new property
public PlayerClass player;
//replace the existing OnTriggerMethod with
void OnTriggerEnter(Collider obj) {
if (obj.gameObject.name == “Shark”) {
//reset shark
obj.gameObject.transform.rotation = Quaternion.identity;
obj.gameObject.transform.position = new Vector3(20f, -3f, 8f);
player.updateScoreBy(+1);
Destroy(gameObject);
Instantiate(explosionPrefab, transform.position, Quaternion.identity);
}
if (obj.gameObject.name == “ClownFish”) {
//reset fish
obj.gameObject.transform.rotation = Quaternion.identity;
obj.gameObject.transform.position = new Vector3(-20f, -1f, 8f);
player.updateScoreBy(-1);
Destroy(gameObject);
Instantiate(explosionPrefab, transform.position, Quaternion.identity);
}
}
虽然这与我们之前所做的相类似,但是我们拥有一个新的属性,即“玩家”,并且当我们要更新分数时我们将会调用player.updateScoreBy()函数。
同时为了让游戏更加有趣,游戏玩家在击中鲨鱼时能够获得分数,但是如果击中的是小丑鱼就会因此被扣分。如此游戏变得更加复杂了!
最后,我们需要根据炸弹设置玩家属性。不过因为炸弹是动态的,所以我们不能再像以前那样进行设置。但是幸运的是炸弹是由玩家所创造的,所他在创造炸弹的同时也明确了玩家属性。
让我们打开PlayerClass.cs并在“bombObject.transform.position = this.gameObject.transform.position”下面添加以下代码:
BombClass bomb = (BombClass)bombObject.GetComponent(“BombClass”);
bomb.player = this;
这里再次出现了一个新属性。bombObject是一种GameObject,所以我们在此调用“GetComponent”函数,如此我们便能够访问所有游戏对象中的附加组件(我们将结果归为BombClass),最后我们便获得附加于游戏对象中的C#分类的参考内容。这样我们便设置了“玩家”属性(以PlayerClass函数为例)。
这时候我们便能够在游戏场景中看到分数计算。
>>相关产品