AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > Unity3D

【Unity C#编程】跑动游戏(4):平台与游戏事件

51自学网 2014-05-24 http://www.wanshiok.com

平台多样性

为了使东西更加活跃,我们来新增两种类型的平台。一个减慢Runner的速度,同时其他的东西加速。通过添加两个物理材料来完成这个,伴随着两个新的颜色,给每个平台随机选择使用。

复制Platform Regular PMat两次,分别叫做Platform Slowdown PMat和Platform Speedup PMat。然后复制Platform Regular Mat两次,以类似的方式命名。把摩擦系数(friction value)设置为0.15和0,颜色分别为(255, 255, 0)和(60, 130, 255)。

slowdown physic material speedup physic material
slowdown material speedup material
hierarchy

减速和加速平台

现在要修改 PlatformManager,这样它就能够分配这些材料。给这些材料添加两个队列,在循环平台的时候随机选择它们。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public Material[] materials;
public PhysicMaterial[] physicMaterials;
 
private void Recycle () {
Vector3 scale = new Vector3(
Random.Range(minSize.x, maxSize.x),
Random.Range(minSize.y, maxSize.y),
Random.Range(minSize.z, maxSize.z));
 
Vector3 position = nextPosition;
position.x += scale.x * 0.5f;
position.y += scale.y * 0.5f;
 
Transform o = objectQueue.Dequeue();
o.localScale = scale;
o.localPosition = position;
int materialIndex = Random.Range(0, materials.Length);
o.renderer.material = materials[materialIndex];
o.collider.material = physicMaterials[materialIndex];
objectQueue.Enqueue(o);
 
nextPosition += new Vector3(
Random.Range(minGap.x, maxGap.x) + scale.x,
Random.Range(minGap.y, maxGap.y),
Random.Range(minGap.z, maxGap.z));
 
if(nextPosition.y < minY){
nextPosition.y = minY + maxGap.y;
}
else if(nextPosition.y > maxY){
nextPosition.y = maxY - maxGap.y;
}
}
}

现在,重要的是把这些东西分配到阵列,要么拖拽,要么设置阵列的大小并使用点。确保两个阵列的排序方式一致。另外,如果想让其中一些平台类型比其他的,更加常见,只要多次包含它们就可以了。通过包含常用材料两次,其他的一次。这样,常用的出现概率是50%,其他的是25%。

settingsgame

多样的平台

游戏事件

现在,进入play模式就可以玩游戏了,但是这还没有结束。我们想要做到的是:在游戏开始前有一屏含有标题的画面,最后有一个游戏结束的通知,按下跳跃键就可以重新开始游戏。

处理这个问题,可以用三个事件要求对象发生动作。第一个,建立游戏,由Start方法来操控。另外两个,开始游戏和结束游戏,需要一个自定义方法。我们将穿件一个非常简单的事件管理器类来控制它们。

创建一个新文件夹命名为Managers, 在其中放入一个C#脚本,命名为GameEventManager。把GameEventManager作为静态类,在其中定义一个GameEvent委托类型。注意管理器不是MonoBehaviour,不需要附加到任何Unity对象上。

Game event manager(游戏事件管理器)

1
2
3
4
public static class GameEventManager {
 
public delegate void GameEvent();
}

接下来,用新的gameEvent类型来给管理器添加两个事件:GameStart 和 GameEnd。现在,其他脚本可以通过指定方法到它们来订阅这些事件,当触发事件时调用。

1
2
3
4
5
6
public static class GameEventManager {
 
public delegate void GameEvent();
 
public static event GameEvent GameStart, GameOver;
}

最后,需要包含一种方法来触发这些事件,给此添加两个方法。注意只有在订阅它的时候才调用一个事件,否则将会是null,调用将导致错误。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static class GameEventManager {
 
public delegate void GameEvent();
 
public static event GameEvent GameStart, GameOver;
 
public static void TriggerGameStart(){
if(GameStart != null){
GameStart();
}
}
 
public static void TriggerGameOver(){
if(GameOver != null){
GameOver();
}
}
}

GUI 和开始游戏

现在有了游戏开始事件,接下来创建一个GUI和管理器来使用它。

先给场景添加一些文字标签,为了有条理,我们将用一个container对象来给他们分组。创建一个新的空游戏对象,位置为(0, 0, 0),命名为GUI。为它创建三个空的子对象,并通过Component / Rendering / GUIText分别给它们一个GUIText组件。把它们的Anchor设置为middle center,这样文字就能居中了。

  • 把第一个对象命名为 Game Over Text, 把文字设置为 "GAME OVER", 字体大小40, 字体样式为bold。 位置设置成(0.5, 0.2, 0),这样它就在屏幕下方居中了。
  • 把第二个对象命名为Instructions Text,字体也是bold,但是大小为20。文字为 "press Jump (x or space) to play"。位置为 (0.5, 0.1, 0), 正好在GAME OVER 的下方。
  • 把第三个对象命名为Runner Text, 文字为"RUNNER", 字体为bold, 字体大小为 60。位置为(0.5, 0.5, 0), 正好在屏幕的中央。

在Managers文件夹中创建一个C#脚本,命名为GUIManager,给它一个GUIText变量,为我们刚刚创建的文本对象。创建爱你一个新的对象命名为GUI Manager,并指定脚本作为一个组件,把它作为Managers的子。然后指定文本对象到管理器的相应字段。

1
2
3
4
5
6
using UnityEngine;
 
public class GUIManager : MonoBehaviour {
 
public GUIText gameOverText, instructionsText, runnerText;
}
game over instructions title manager gui
GUI Text.

现在给刚刚新建的管理器添加一个Start函数,使用它禁用gameOverText,这样游戏结束的画面就会消失了。还要添加一个Update函数来检查是否按下了跳跃键,如果是,就出发开始游戏事件。

1
2
3
4
5
6
7
8
9
void Start () {
gameOverText.enabled = false;
}
 
void Update () {
if(Input.GetButtonDown("Jump")){
GameEventManager.TriggerGameStart();
}
}

现在应该包含一个方法来控制开始游戏事件了,将其命名为GameStart。使用这个方法来禁用所有的文本,同时也禁用管理其本身,这样就不会再调用Update函数。如果不这样做,每次跳跃的时候都将会有新游戏开始事件。

1
2
3
4
5
6
private void GameStart () {
gameOverText.enabled = false;
instructionsText.enabled = false;
runnerText.enabled = false;
enabled = false;
}

最后一步是告诉事件管理器,每当触发游戏开始事件的时候,它都该调用管理器对象的GameStart方法。通过在Start方法中将函数添加到事件来完成。

1
2
3
4
void Start () {
GameEventManager.GameStart += GameStart;
gameOverText.enabled = false;
}

原文:http://catlikecoding.com/unity/tutorials/runner/


建议使用电驴(eMule)下载分享的资源。

说明
:本教程来源互联网或网友分享或出版商宣传分享,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
 
上一篇:【Unity C#编程】跑动游戏(5):游戏结束等  下一篇:【Unity C#编程】跑动游戏(3):跳跃与碰撞