平台多样性
为了使东西更加活跃,我们来新增两种类型的平台。一个减慢Runner的速度,同时其他的东西加速。通过添加两个物理材料来完成这个,伴随着两个新的颜色,给每个平台随机选择使用。
复制Platform Regular PMat两次,分别叫做Platform Slowdown PMat和Platform Speedup PMat。然后复制Platform Regular Mat两次,以类似的方式命名。把摩擦系数(friction value)设置为0.15和0,颜色分别为(255, 255, 0)和(60, 130, 255)。
减速和加速平台
现在要修改 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%。
多样的平台
游戏事件
现在,进入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;
}
|
现在给刚刚新建的管理器添加一个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不保证资料的完整性。
|