从零开始入门创作游戏——对象交互与UI展示

做教程远比自己开发游戏要花时间...继续写小恐龙的游戏教程

环境搭建在这里

从零开始入门创作游戏——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分钟游戏教程视频中学到的大部分东西,接下来我自己研究一下怎么进一步改进游戏内容,例如增加生命值,仙人掌随机刷新,鸟随机飞等功能。

猜你喜欢

转载自blog.csdn.net/dwe147/article/details/126898794
今日推荐