做教程远比自己开发游戏要花时间...继续写小恐龙的游戏教程
环境搭建在这里
从零开始入门创作游戏——Unity3d的环境搭建_默哀d的博客-CSDN博客
素材导入和基本页面介绍在这里
从零开始入门创作游戏——Unity编辑器的使用_默哀d的博客-CSDN博客
游戏对象的运动和交互逻辑脚本在这里
从零开始入门创作游戏——游戏对象的脚本编辑_默哀d的博客-CSDN博客
-
对象交互
上次在修改恐龙能无限跳的bug时就算是一种交互了,接下来是障碍物与恐龙交互的代码
需求:
1、仙人掌和之前的场景一样向左移动
2、恐龙碰到仙人掌就游戏结束
首先需求1很简单,将上次的物体移动脚本添加上去就可以了
然后添加碰撞体积,跟上次创建恐龙和地板的一样,那么测试游戏的时候就会出现仙人掌把小恐龙冲走的
那么接下来触发结束游戏的互动的话,就需要添加标签,将地板的碰撞和仙人掌的碰撞分开
选择一个游戏对象,然后在右边的【标签】——【添加标签】
点击这里的加号添加标签
添加【Cactus】标签再保存
然后重新选择仙人掌的游戏对象,将标签改成【Cactus】,这样就能根据tag来判断触发判断的对象是哪个了
然后在恐龙的脚本中增加一个判断,如果触碰到标签为【Cactus】时,就游戏终止
public class DinosaurScript : MonoBehaviour
{
Rigidbody2D rb;//控制物体下落的组件
public float jumpHeight;//跳的高度
bool isJumping;//判断是否正在跳
// Start is called before the first frame update
void Start()
{
rb = GetComponent<Rigidbody2D>();
isJumping = false;
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Space)&& isJumping == false)//只有满足按下空格同时能跳时才能跳起
{
rb.velocity = new Vector2(0, jumpHeight);
isJumping = true;//一旦跳起了就变成不能跳了
}
}
private void OnCollisionEnter2D(Collision2D collision)
{
isJumping = false;
if (collision.gameObject.tag == "Cactus")//如果接触的对象标签为Cactus时
{
Time.timeScale = 0;//这是unity的自带时间函数,等于0时游戏停止
}
}
}
然后进行测试游戏时,能控制小恐龙跳,直到恐龙碰到仙人掌就会停止动画
-
游戏UI的展示
当游戏结束的时候,需要出现提示和可以有一个可以重新开始的按钮
首先是创建Game Over 的text文件,Unity 中有2中Text格式,
一种是 右键——UI——文本 TextMeshPro
这种文本生成时会出现以下窗口,点击 Import TMP Essentials后会在资产根目录中增加这个文本的各种资产。但是这个格式的text不支持本次游戏的tff格式字体文件,所以使用另一种text
一种是 右键——UI——旧版——文本
选中这个text对象后,将字体文件拖动到右侧字体的位置
调整字体大小和文本框大小,如果字号过大而文本框过小,那么文本内容就可能不会展示出来
这里有个奇怪的地方,文本是 Canvas 的子对象(红色框),而Canvas 这个对象的范围是随着游戏屏幕大小变化的,文本就展示在这个范围内。但是其他的游戏对象(恐龙和背景对象)实际上是在非常小的范围内(黄色框)。
接下来再添加上游戏重试的按钮,游戏对象处右键——UI——旧版——按钮
就会生成个按钮对象和自对象按钮上的文本和EventSystem这个对象
我们不需要文本就先把文本子对象给删了,同时将按钮图案进行修改
将重开按钮的资产拖动到image的源图案中即可,然后和文本一样进行调整位置和大小(绿色框)
如果通过先创建图像对象,再在右侧创建button组件的话,是无法触发的,我也不知道为啥,还在研究中。而且如果是先创建图像对象,那么图像的大小就不再canvas坐标系中,而是默认图层的坐标系里。
需要注意一点,重试按钮和文本要放在同一个父对象中(左侧红框),这样才能对这个父对象进行操作时,按钮和文本就会同时出现和消失(右侧红框)
由于是结束的时候才会展示的,现在先将这个父对象进行隐藏。即去掉右边的√
接下来就要编写游戏结束的UI展示时机和重试按钮的重开游戏脚本
-
Gamemanager的脚本
传说每个游戏都会有Gamemanager这个脚本,里面记载了这款游戏中的所有游戏属性和游戏机制
我们在资产中创建一个叫Gamemanager的脚本,脚本图标就会自动变成齿轮
打开脚本后,添加游戏结束时游戏终止和UI展示的脚本
public class GameManager : MonoBehaviour
{
public GameObject GameOverScene;//创建名为GameOverScene的游戏对象
// 游戏结束时游戏终止和UI展示
public void GameOver()
{
Time.timeScale = 0;
GameOverScene.SetActive(true);//将GameOverScene这个游戏对象显示
}
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
同时,将恐龙的脚本进行修改,将原本判断游戏终止的脚本替换成使用Gamemanager的脚本中的gameover函数
public class DinosaurScript : MonoBehaviour
{
Rigidbody2D rb;//控制物体下落的组件
public float jumpHeight;//跳的高度
bool isJumping;//判断是否正在跳
public GameManager gm;//gamemanager组件
// Start is called before the first frame update
void Start()
{
rb = GetComponent<Rigidbody2D>();
isJumping = false;
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Space)&& isJumping == false)
{
rb.velocity = new Vector2(0, jumpHeight);
isJumping = true;
}
}
private void OnCollisionEnter2D(Collision2D collision)
{
isJumping = false;
if (collision.gameObject.tag == "Cactus")
{
//Time.timeScale = 0;
//改成使用gm的函数进行游戏终止的操作
gm.GameOver();
}
}
}
但是要引用GM这个函数,需要在游戏对象中先创建GM这个空对象,再将GM脚本拖动到GM对象中(红色箭头)
同时,将游戏结束的UI父对象拖到GameOverScene这个地方(绿色箭头)
然后,将GM对象拖动到恐龙对象中
这样测试游戏时,当恐龙触碰到仙人掌时,就会游戏停止同时结束UI展示出来
-
重开按钮的设置
接下来是编写重开按钮的脚本, 但是首先需要先重命名场景名字。首先点击场景,然后右键【打开场景资产】(左上框),然后在资产窗口中修改这个场景文件的名字(下面资产框),修改完后需要重新加载这个文件才行(中间确认窗口)
然后编写脚本,和GameOver方法一样,写在GM脚本中编写Restart方法,注意一下start函数中增加了一个参数,用于重置游戏运行速度为正常速度。
using UnityEngine.SceneManagement; //需要加上这个类
public class GameManager : MonoBehaviour
{
public GameObject GameOverScene;
// Start is called before the first frame update
void Start()
{
/*注意这里加了一个参数,游戏开始先重置游戏速度为1,不然游戏重新载入时会是静止的*/
Time.timeScale = 1;
}
// Update is called once per frame
void Update()
{
}
// 游戏结束时游戏终止和UI展示
public void GameOver()
{
Time.timeScale = 0;
GameOverScene.SetActive(true);
}
public void Restart()
{
SceneManager.LoadScene("lv1"); //unity自带的场景展示函数,读取指定场景名的场景
}
}
而重开图标,需要在button组件的【鼠标单机】中点击【+】号
再将GM对象拖动到这个组件中(红色箭头),然后在下拉框中选择GM脚本中的restart函数,这样这个Button在游戏运行时展示出来后,点击就会重新载入指定的场景
这样,游戏就算完成了!
以上为从油土鳖15分钟游戏教程视频中学到的大部分东西,接下来我自己研究一下怎么进一步改进游戏内容,例如增加生命值,仙人掌随机刷新,鸟随机飞等功能。