一、前言
嗨,大家好,我是新发。
我打算写一篇使用Unity制作像天天酷跑一样的游戏的教程,会按功能点分成多篇文章来讲,希望可以帮助一些想学Unity的同学。
注:我使用的Unity版本是2020.1.14f1c1。
文章目录:
第一篇:人物动画序列帧
第二篇:使用Animator控制跑酷角色的动画状态切换
第三篇:跑酷地面制作
第四篇:使用脚本控制跑酷角色
第五篇:游戏结束与重新开始
第六篇:金币创建与吃金币
第七篇:游戏界面的基础UI
本工程的Demo工程,我已上传到GitHub,感兴趣的同学可以自己下载下来学习。
https://github.com/linxinfa/UnityParkourGameDemo
本节我将讲下游戏结束与重新开始的实现,本节的效果:
二、制作边界碰撞体
创建两个空物体:BottomBorder
、LeftBorder
,添加BoxCollider2D
组件,调整大小和位置,作为边界碰撞体,如下:
添加一个Border
的Tag
。
两个边界碰撞器的Tag
设置为Border
。
三、制作游戏结束界面
导入UI素材,
制作成游戏结束界面预设:GameOverPanel
预设保存在Resources
文件夹中。
这样,主角碰撞到边界碰撞体的时候,我们就可以实例化这个界面出来了。
var canvas = GameObject.Find("Canvas");
var prefab = Resources.Load("GameOverPanel");
var panel = GameObject.Instantiate(prefab) as GameObject;
panel.transform.SetParent(canvas.transform, false);
四、游戏结束界面脚本
创建一个GameOverPanel.cs
脚本,挂到GameOverPanel
预设上,
代码如下:
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class GameOverPanel : MonoBehaviour
{
public Button restartBtn;
void Start()
{
restartBtn.onClick.AddListener(() =>
{
GameMgr.instance.state = GameState.Playing;
SceneManager.LoadScene(0);
});
}
}
五、游戏管理器
游戏有准备、进行中、结束三个状态,为了方便管理,我们做一个游戏管理器。
创建一个空物体,命名为GameMgr
。
创建GameMgr.cs
脚本,挂到这个物体上,代码如下:
using UnityEngine;
public class GameMgr : MonoBehaviour
{
private void Awake()
{
s_instance = this;
m_state = GameState.Playing;
}
public GameState state
{
get { return m_state; }
set
{
m_state = value;
if(GameState.End == value)
{
// 游戏结束
var canvas = GameObject.Find("Canvas");
var prefab = Resources.Load("GameOverPanel");
var panel = GameObject.Instantiate(prefab) as GameObject;
panel.transform.SetParent(canvas.transform, false);
}
}
}
private GameState m_state = GameState.Ready;
private static GameMgr s_instance;
public static GameMgr instance { get { return s_instance; } }
}
public enum GameState
{
Ready,
Playing,
End,
}
六、碰撞检测逻辑
给Player.cs
添加边界碰撞检测逻辑。
/// <summary>
/// 碰撞事件方法
/// </summary>
/// <param name="other"></param>
void OnCollisionEnter2D(Collision2D other)
{
switch (other.gameObject.tag)
{
case "Ground":
{
// 碰撞到地面
m_ani.SetBool("IsJumping1", false);
m_ani.SetBool("IsJumping2", false);
m_jumpCount = 0;
}
break;
case "Border":
{
// 游戏结束
GameMgr.instance.state = GameState.End;
}
break;
}
}
七、运行测试
运行Unity,效果如下:
下一节讲金币创建与吃金币的实现。
[点击进入下一节]