简介
经过上一次的学习,我又想改进一下这款 Roll a ball 游戏,首先这款游戏只有胜利没有失败,所以我想定义一个条件来控制它的输赢,因此我想到了如下的方案:
使我们的玩家控制 Player 在规定时间内达到一定的分数就胜利,反之则失败
任务目标
这里只是大概的目标内容,还有一些细节会在后面完成的时候体现出来。
- 完成 PickUp 的随机刷新出现,每隔3秒刷新一个
- 做一个倒计时器用于显示游戏剩余时间
- 控制分数和时间,若玩家在规定时间内达到分数则显示 You Win!字样,Player 禁止移动;若失败,则小球爆炸并显示 Game Over! 字样。
环境搭建
主体还是 Roll a ball 的内容,其中有一些小改动,我们在此完成一下。
删除场景中的所有 PickUp
因为我们要完成的是随机刷新 PickUp 物体,所以我们不需要在场景中添加 PickUp 物体,到时候会用到一个新的知识来完成我们的随机显示 PickUp 物体的操作。
添加倒计时文本
因为我们需要让玩家知道游戏的剩余时间,所以我们需要添加一个用来显示时间的文本,位置我选择在了中间顶部的位置,其他设置随意。
细节修改
因为最终我们显示的文本不再是只有胜利,所以将我们之前创建的 WinText 改名为 ResultText。
遗漏补充
在官方的案例中,PickUp 是有一个黄色的材质,而我在之前做的项目中忘记添加了,所以我现在添加了一个黄色材质球给我们的 PickUp。
以上就是我们的环境搭建相关的操作,下面就要开始我们的脚本编写,来实现游戏的运行了。
游戏运行
修改以及准备
我将 PlayerController 中除了将 Player 运动的脚本其余的都删除了。
脚本文件名:PlayerController
代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour {
public float speed;
private float moveHorizontal;
private float moveVertical;
private Vector3 movement;
private void FixedUpdate()
{
moveHorizontal = Input.GetAxis("Horizontal");
moveVertical = Input.GetAxis("Vertical");
movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
GetComponent<Rigidbody>().AddForce(movement * speed * Time.deltaTime);
}
}
我将剩下的代码贴在上方了,有不清楚的或者项目删除了的可以直接复制过去。
创建 GameController 脚本
还是在我们的 Player 物体上添加脚本取名为 GameController ,我定义它用来控制整个游戏的运行脚本,其实我们游戏的改变主要就是体现在此脚本的编写,所以当我们完成此脚本的编写也就意味着我们游戏的完成,废话不多说了下面我们就来完成它。
删除补回
因为我们将原来 PlayerController 脚本中除了控制小球运动的代码都删除了,所以需要先补充一下 Planyer 与 PickUp 的碰撞以及分数控制的相关代码,此时只是补回后面还会有更改。
脚本文件名:GameController
代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class GameController : MonoBehaviour {
public Text countText;
private int count;
private void Awake()
{
count = 0;
}
private void Start()
{
SetCount();
}
private void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "PickUp")
{
Destroy(other.gameObject);
count++;
SetCount();
}
}
void SetCount()
{
countText.text = "Count:" + count;
}
}
目标一:刷新 PickUp 物体
在此我们要完成的是让我们的 PickUp 物体在地面上的随机位置每3秒刷新一个。
这其中我们会用到几个新的知识,有需要的话最好还是去网上找找资料了解一下或者翻阅官网的API。
- Clone 克隆物体
- Randam 随机类
脚本文件名:GameController
代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class GameController : MonoBehaviour {
public Text countText;
//用于添加 PickUp 物体,之后克隆要用
public GameObject pickUp;
private int count;
//定义一个三维向量的值用于存储克隆物体的位置
private Vector3 newPickUpPt;
//定义一个需要等待克隆物体的时间,根据目标应该赋值为3
private float fireRate;
//定义一个下一次克隆物体的时间
private float nextFire;
private void Awake()
{
count = 0;
//给 fireRate 赋值,控制克隆物体的间隔时间
fireRate = 3f;
}
private void Start()
{
SetCount();
}
private void Update()
{
//判断游戏时间是否大于我们需要的它克隆的时间
if (Time.time > nextFire)
{
//计算下一次克隆时的时间
nextFire = Time.time + fireRate;
//给我们的 PickUp 随机一个位置
newPickUpPt = new Ve