一、导入素材
二、搭建场景
三、生成随机水果
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;//dotween动画
public class FruitSpawn : MonoBehaviour
{
//定义一个生成水果的数组;
public GameObject[] FruitPrefabs;
//定义分数
public int totalScore;
//分数文本框
public Text scoreText;
//时间文本框
public Text timeText;
//剩余时间
private float remainTime;
//倒计时间
private float countTime=90f;
//开始时间;
private float startTime;
//游戏重置UI
public GameObject reStartUI;
//游戏重新开始UI位置;
public Transform ReStartUIpos;
//判断游戏是否结束标志位;
public bool isGameOver;
//单例模式 公开的 静态的 为了别的类可以直接调用它 并且节省内存
public static FruitSpawn instance;
private void Awake()
{
instance = this;
}
void Start () {
//分数开始归零
// totalScore = 0;
//获取当前时间;
// startTime = Time.time;
//调用开始的方法
Init();
}
void Update () {
}
//物理时间相关
private void FixedUpdate()
{
//判断游戏是否结束 是的话即返回;
if (isGameOver)
{
return;
}
//剩余时间=倒计时间-已经过去的时间 已经过去时间=当前时间减去开始时间
remainTime = countTime - (Time.time-startTime);
//显示时间
timeText.text = Formate(remainTime);
//判断时间小于等于0;游戏结束;
if (remainTime<=0)
{
GameOver();
}
}
//格式化时间
private string Formate(float time) {
string timeStr;
int timeFormate = (int)time;
//三目运算符
timeStr = time > 10 ? "00:" + timeFormate.ToString() : "00:0" + timeFormate.ToString();
return timeStr;
}
/// <summary>
/// 开始生成水果
/// </summary>
private void StartSpawnFruit() {
//开启协程方法
StartCoroutine(SpawnFruit());
}
//开启协程 隔时间段生成水果;
IEnumerator SpawnFruit() {
//生成水果
while (true)
{
//随机生成水果
GameObject Fruit = Instantiate(FruitPrefabs[Random.Range(0,FruitPrefabs.Length-1)]);
//给水果随机位置
Fruit.transform.position=transform.position+transform.right*(Random.Range(-1.0f,1.0f));
//获取水果刚体组件;
Rigidbody rigi= Fruit.GetComponent<Rigidbody>();
//给一个向上的速度;
rigi.velocity = new Vector3(0,5f,0);
//给水果添加随机角速度 有翻滚效果;
rigi.angularVelocity = new Vector3(0, 0, Random.Range(-5.0f, 5.0f));
//重力生效
rigi.useGravity = true;
//每隔3秒就生成水果
yield return new WaitForSeconds(3f);
}
}
//定义一个公开的加分方法 被切割时调用
public void AddScore(int score) {
totalScore += score;
scoreText.text = totalScore.ToString();
}
//游戏结束方法
private void GameOver() {
//判断游戏未结束;
if (!isGameOver)
{
//实例化结束UI;
GameObject Restart = Instantiate(reStartUI);
//确定位置
Restart.transform.position = ReStartUIpos.position;
//动画效果 设置初始值为0;
Restart.transform.localScale = Vector3.zero;
//实现动画关键语句
Restart.transform.DOScale(Vector3.one*20,0.5f);
//游戏结束
isGameOver = true;
//关闭所有协程 不能实例化水果
StopAllCoroutines();
}
}
//游戏重新开始
public void ReStartGames() {
//重新开始的时候延迟调用
Invoke ("Init",2f);
}
//初始化游戏
private void Init() {
//分数开始归零
totalScore = 0;
//获取当前时间;
startTime = Time.time;
//开始界面初始化
StartSpawnFruit();
//分数初始化 归零
scoreText.text = "0";
//时间初始化
timeText.text = "00:00";
//标志位也初始化
isGameOver = false;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Fruit : MonoBehaviour {
void Start () {
}
//提高性能,销毁水果
void Update () {
//判断水果Y位置小于-10时,销毁;
if (this.transform.position.y<-10.0f)
{
Destroy(this.gameObject);
}
}
}
四、给玩家添加武器
五、添加武器特效
六、核心机制-切
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SwrodCutter : MonoBehaviour {
//定义一个公开的持有引用 被切割后的材质 切面 材质
public Material capMaterial;
void Start () {
}
// Update is called once per frame
void Update () {
}
//刀与水果发生碰撞后处理的函数
public void OnCollisionEnter(Collision coll) {
//获取被到碰撞后的物体
GameObject victim = coll.collider.gameObject;
//切面处理
GameObject[] pieces = BLINDED_AM_ME.MeshCut.Cut(victim, transform.position, transform.right, capMaterial);//参数1:切割对象 参数2:发生碰撞的位置 参数3:切割方向 水平方向坐标 参数4:被切割后显示的材质;
//去掉水果碰撞体,避免重复切割;
// pieces[1].GetComponent<MeshCollider>().enabled = false;
//添加刚体 有下落的效果
if (!pieces[1].GetComponent<Rigidbody>())
pieces[1].AddComponent<Rigidbody>();
//一秒过后 销毁对象
Destroy(pieces[1], 1);
//判断特定UI重新开始游戏
if (victim.tag == "GameOverUI")
{
//游戏重新开始 调用单利模式 重新开始方法;
FruitSpawn.instance.ReStartGames();
//获取刚体
Rigidbody rigi = GetComponent<Rigidbody>();
//使用重力
rigi.useGravity = true;
//一秒后销毁
Destroy(pieces[0], 1);
}
else {//切的不是游戏结束界面
//被切割后 加分 调用单例
FruitSpawn.instance.AddScore(10);
}
}
}
七、UI搭建
八、处理分数和时间
九、制作重置UI
十、游戏重新开始