信息化的GUI
只要还有助力,Runner就可以在飞行过程中助力自身。实际上,有效的助力是非常有用的,我们在GUI上给它添加一个显示,显示经过的距离。
使用GUIText 组件创建一个新的对象,作为GUI的子。位置为(0.01, 0.99, 0),把Anchor设置为upper left,字体大小是20,normal字体,命名为Boosts Text。
创建另一个对象,命名为Distance Text。位置设置成(0.5, 0.99, 0),字体大小30,bold字体。Anchor为upper center。
给这两个对象在GUIManager 中添加两个变量,并指定它们。
1
|
public GUIText boostsText, distanceText, gameOverText, instructionsText, runnerText;
|
Boosts和distance.
给GUIManager添加两个静态方法, 可以让Runner用来通知GUI,移动距离的改变和boost计算。由于在那些方法中管理器要用非静态变量,我们添加一个静态变量,引用它自身。那样静态代码可以获得具有GUI文本元素的组件实例。
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
private static GUIManager instance;
void Start () {
instance = this ;
GameEventManager.GameStart += GameStart;
GameEventManager.GameOver += GameOver;
gameOverText.enabled = false ;
}
public static void SetBoosts(int boosts){
instance.boostsText.text = boosts.ToString();
}
public static void SetDistance(float distance){
instance.distanceText.text = distance.ToString( "f0" );
}
现在要做的就是让 Runner 在boost的距离或数量改变时调用那些方法。
void Update () {
if (Input.GetButtonDown( "Jump" )){
if (touchingPlatform){
rigidbody.AddForce(jumpVelocity, ForceMode.VelocityChange);
touchingPlatform = false ;
}
else if (boosts > 0){
rigidbody.AddForce(boostVelocity, ForceMode.VelocityChange);
boosts -= 1;
GUIManager.SetBoosts(boosts);
}
}
distanceTraveled = transform.localPosition.x;
GUIManager.SetDistance(distanceTraveled);
if (transform.localPosition.y < gameOverY){
GameEventManager.TriggerGameOver();
}
}
private void GameStart () {
boosts = 0;
GUIManager.SetBoosts(boosts);
distanceTraveled = 0f;
GUIManager.SetDistance(distanceTraveled);
transform.localPosition = startPosition;
renderer.enabled = true ;
rigidbody.isKinematic = false ;
enabled = true ;
}
public static void AddBoost(){
boosts += 1;
GUIManager.SetBoosts(boosts);
}
|
完整的 GUI.
粒子特效
到现在为止,我们已经建立了一个功能性的游戏,但是感觉有点空。添加一些灰尘例子来填充空余的空间,加强深度感和速度感。
创 建一个新的粒子系统(GameObject / Create Other / Particle System) ,命名为 Dust Emitter。把它作为Runner的子,位置是(25, 0, 0),并且重置它的rotation,这样,它就会永远停在相机视图的右侧。
设 置Start Lifetime为常量数值6至10之间的随机值。把Start SpeedI设置成0,这样就能得到不同生命周期的静止粒子。把Simulation Space设置为world,这样粒子就不会随着Runner移动。为了增加种类,把Start Size设置为0.2到0.8之间的随机值。
把shape改为box,dimension为(1, 30, 10),这样就有了一个较大的生产区域,把Emission的Rate改为20。
激活 Velocity Over Lifetime, 设置其使用世界空间,使用两个常量之间的随机范围,向量(-1, -1, 0) 和 (-4, 1, 0)。这样粒子就有了一些独立的移动。
最后激活 Color over Lifetime,改为gradient,这样它就有100%的0透明值。这个给粒子添加一些衰减效果。
接下来,复制这个粒子系统,保持它为Runner的子,重置其位置,并命名为Trail Emitter。用这个作为Runner身后的冷凝追踪效果。
把Shape 改为Mesh 并将其设置成cube (通过点击小圆点), 停用 Velocity over Lifetime。
将Start Lifetime 减少到1和2之间,Start Size在0.2和0.4之间,让痕迹保持微妙简短。
Particle systems(粒子系统)
由于我们只想在游戏过程中生成粒子,所以创建为它们创建一个管理器。在Managers文件夹添加一个新的C#脚本,命名为ParticleSystemManager。再给Managers创建一个子对象,起个合适的名字,然后给它指定管理器脚本。
ParticleSystemManager所要做的是在适当的时间打开/关闭粒子系统。用数组变量particleSystems来持有所有需要管理的发射器的引用。在这种情况下,这就是我们刚刚建立的两个粒子发射器,但是管理器可以处理任何你想创建的发射器。
通过拖拽两个粒子发射器到Particle Systems字段来指定它们。
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
|
using UnityEngine;
public class ParticleSystemManager : MonoBehaviour {
public ParticleSystem[] particleSystems;
void Start () {
GameEventManager.GameStart += GameStart;
GameEventManager.GameOver += GameOver;
GameOver();
}
private void GameStart () {
for (int i = 0; i < particleSystems.Length; i++){
particleSystems[i].Clear();
particleSystems[i].enableEmission = true ;
}
}
private void GameOver () {
for (int i = 0; i < particleSystems.Length; i++){
particleSystems[i].enableEmission = false ;
}
}
}
|
粒子实现的效果
到此游戏就完成了!游戏中可以跑动、跳跃、留下痕迹、收集能量,显示得分,还有滚动的背景。这是一个很好地原型,多加修饰和改进,你就可以把它转换成完整的游戏。
Downloads
原文:http://catlikecoding.com/unity/tutorials/runner/
建议使用电驴(eMule)下载分享的资源。
说明:本教程来源互联网或网友分享或出版商宣传分享,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
|