栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > 其他

Unity游戏积分/计分UI系统制作方法

其他 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Unity游戏积分/计分UI系统制作方法

Unity游戏积分/计分UI系统制作方法

本篇博客将讲解游戏开发中常见的积分/计分系统的制作,看过论坛有很多这种帖子,但基本都是从一个大型系统里进行讲解,今天我把这个方法独立挖出来做个小案例,来分析这个系统的实现原理,为游戏开发提供更多开发思路。
如果有朋友还想学习如何在【游戏进行时】,【游戏结束时】等不同游戏状态来显示不同的积分/计分UI效果可以参考我之前写的UI控制方法,在不同的游戏状态下调用切换UI的方法就能实现:
Unity控制多组UI的显示与隐藏

(一)先搭建一个UI用来显示积分,这里以0为初值,显示得分数字的Text命名为ScoreTable。可以换一下字体来加强显示效果,默认字体太丑了

(二)搭建一个简单的场景,设置得分逻辑:蓝色方块为玩家Player,红色方块为得分物体ScoreObj,把ScoreObj拉大一点,使Player穿过ScoreObj一次,游戏分数就+1,没错,要用到触发器Trigger的碰撞检测。

(三)给Player添加碰撞体和Rigidbody,给ScoreObj添加碰撞体,有些版本的unity会自动添加碰撞体,碰撞体大小可以适当修改(记得在ScoreObj碰撞体组件处勾选Is Trigger)。

(四)创建脚本PlayerControl,开始编写玩家代码,我们可以直接套用传统的WASD移动代码来控制Player,注意,这里会定义一个Player得分的事件,并将这个事件发送给控制UI的脚本的接收器,这就是积分/计分系统的实现核心(接收器和处理器的定义详细见下一步的UI脚本),如果你不理解C#的事件是什么,可以论坛搜索或去我的博客主页查询。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerControl : MonoBehaviour
{
    public delegate void PlayerScore(int temp);//定义委托
    public event PlayerScore GetScore;//定义得分事件,用于发出得分的消息
    void Start()
    {
        
    }
    void Update()//在Update()中添加Player的移动控制
    {
        if (Input.GetKey(KeyCode.W))
        {
            this.transform.Translate(Vector3.forward * Time.deltaTime * 2f);//对象可以朝着世界坐标向前移动
        }
        if (Input.GetKey(KeyCode.A))
        {
            this.transform.Translate(Vector3.left * Time.deltaTime * 2f);//对象可以朝着世界坐标向前移动
        }
        if (Input.GetKey(KeyCode.S))
        {
            this.transform.Translate(Vector3.back* Time.deltaTime * 2f);//对象可以朝着世界坐标向前移动
        }
        if (Input.GetKey(KeyCode.D))
        {
            this.transform.Translate(Vector3.right * Time.deltaTime * 2f);//对象可以朝着世界坐标向前移动
        }
    }
    public void OnTriggerExit(Collider other)//设置触发器碰撞事件,一旦Player穿过了ScoreObj,就发送得分事件
    {
        if (other.gameObject.name.Equals("ScoreObj"))//检查Player碰撞的物体是不是ScoreObj
        {
            if (GetScore != null)//检查事件是否为空,即有没有接收器订阅它
            {
                GetScore(1);//发送得分事件消息,为接收器提供参数1,实现+1分的效果
            }
        }
    }
}

(五)现在创建新的脚本UIScore并开始编写,该脚本将用于接受Player得分的事件并进行相应处理(改变UI的积分值)。其实大部分时候这个脚本都命名为GameManager,用于管理游戏全局逻辑,这里只演示计分效果,我们可以简化一下命名。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;//引入unity的UI编辑库

public class UIScore : MonoBehaviour
{
    public PlayerControl player;//定义PlayerControl类
    public int score;//定义积分变量
    public Text ScoreUI;//定义要修改的Text
    void Start()
    {
        player.GetScore += Player_GetScore;//调用PlayerControl类,订阅Player的得分事件,start函数已经作为了我们的消息接收器
    }

    private void Player_GetScore(int score)//定义消息处理器来处理消息,给属性赋值,改变积分值
    {
        Score += score;
    }
    void Update()
    {
        
    }
    public int Score//定义积分属性,使用属性来进行控制,使每次积分被改变时就调用一次文本显示的修改
    {
        get
        {
            return score;
        }
        set
        {
            score = value;
            ScoreUI.text = score.ToString();//让UI显示的分数等于score的值,这里有String类型的转换
        }
    }

}

(六)现在逻辑和代码都设置完毕了,将脚本PlayerControl拖拽给Player,再创建一个空物体并命名ScoreManager,将脚本UIScore拖拽给ScoreManager,将ScoreTable拖进UIScore脚本为其定义的组件位置,将Player拖进UIScore脚本为其定义的类位置,具体如下图。

(七)运行!查看得分效果!

(八)总结:积分/计分系统的实现就是依靠接收player得分的事件通知,然后做出相应的处理,这个事件何时发送以及它的发送者则由游戏逻辑决定。积分/计分系统可以更加复杂也可以使用其他方法,本篇博客为该系统提供一种方便封装管理的制作思路。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/901093.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号