Unity游戏积分/计分UI系统制作方法 您所在的位置:网站首页 unity按钮显示物体 Unity游戏积分/计分UI系统制作方法

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

#Unity游戏积分/计分UI系统制作方法| 来源: 网络整理| 查看: 265

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得分的事件通知,然后做出相应的处理,这个事件何时发送以及它的发送者则由游戏逻辑决定。积分/计分系统可以更加复杂也可以使用其他方法,本篇博客为该系统提供一种方便封装管理的制作思路。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有