unity制作游戏中掉血飘红滚动数值的制作
2017-09-14 19:47
666 查看
有时候我们做伤害显示飘红的时候,如果对方收到伤害的频率过高,会造成视图的混乱,也难以让玩家知道自己究竟造成了多少伤害,所以会有了伤害数字滚动显示并进行累加,比如英雄联盟中的寒冰射手开启Q时伤害累加的效果。
那么我们如何来实现这一效果呢?
1.首先解决飘红跟随问题,现在UGUI有HUD插件实现跟随,当然也可以自己写逻辑,通过相机下的转换空间的方法实现,根据需要而定;
2.然后是伤害数值的滚动,所谓的滚动,就是数值不断累加,数值显示有一个飞快的数字变化,我们可以通过Mathf中线性插值实现,最后加一些简单的动画实现强调,可以自己制作,也可以导入插件比如DoTween等;
3.最后是飘红后如果在一定时间内没有新的输出,伤害显示会飘走并且消失;
话不多说,直接上代码:
那么我们如何来实现这一效果呢?
1.首先解决飘红跟随问题,现在UGUI有HUD插件实现跟随,当然也可以自己写逻辑,通过相机下的转换空间的方法实现,根据需要而定;
2.然后是伤害数值的滚动,所谓的滚动,就是数值不断累加,数值显示有一个飞快的数字变化,我们可以通过Mathf中线性插值实现,最后加一些简单的动画实现强调,可以自己制作,也可以导入插件比如DoTween等;
3.最后是飘红后如果在一定时间内没有新的输出,伤害显示会飘走并且消失;
话不多说,直接上代码:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using DG.Tweening; public class ChangeValue : MonoBehaviour { int value=0;//当前伤害值 int damage = 0; //伤害 int startValue = 0;//起始伤害 int endValue = 0;//结束伤害 float startTime = 0;//开始时间 public float duration = 1;//持续时间 public float normalDamageMutiple=1.5f;//普通伤害缩放倍数 public float volleyDamageMutiple=2.0f;//暴击伤害缩放倍数 bool isFollow = false;//是否跟随玩家 bool isChangeTime=false;//是否递增时间 Text damageShow;//伤害TEXT public Canvas canvas;//画布 public Transform target;//跟随对象 Vector3 pos_InMainCamScreen=Vector3.zero;//屏幕空间坐标 Vector3 pos_InCanvasCamWorld = Vector3.zero;//UI相机世界空间下坐标 Vector3 pos_FinalInWorld = Vector3.zero;//最终坐标 // Use this for initialization void Awake() { damageShow = GetComponent<Text>(); damageShow.enabled = false; } // Update is called once per frame void Update () { ScrollNum(); } void LateUpdate() { Follow(); } /// <summary> /// 滚动数字显示 /// </summary> void ScrollNum() { //普通攻击 if (Input.GetKeyDown(KeyCode.A)) { isFollow = true; isChangeTime = true; damage = Random.Range(10, 200); startTime = 0; startValue = value; endValue = 4000 value + damage; damageShow.transform.DOScale(normalDamageMutiple,0.5f); StartCoroutine(ReversePlay()); Show(); } //暴击 if (Input.GetKeyDown(KeyCode.B)) { isFollow = true; isChangeTime = true; damage = Random.Range(10, 200); startTime = 0; startValue = value; endValue = value + damage; damageShow.transform.DOScale(volleyDamageMutiple, 0.5f); StartCoroutine(ReversePlay()); Show(); } //时间递增 if(isChangeTime) startTime += Time.deltaTime; if (startTime <= duration)//是否到达一秒钟 { value = (int)Mathf.Lerp(startValue, endValue, startTime / duration); damageShow.text = value.ToString(); } else { damageShow.text = endValue.ToString(); value = 0; isFollow = false; isChangeTime = false; transform.DOMoveY(1,1); StartCoroutine(Hide()); } } /// <summary> /// 反向播放放大的动画 /// </summary> /// <returns></returns> private IEnumerator ReversePlay() { yield return new WaitForSeconds(0.3f); transform.DORewind(); } /// <summary> /// 延迟隐藏 /// </summary> /// <returns></returns> IEnumerator Hide() { yield return new WaitForSeconds(0.5f); if (isFollow) yield break; startValue = 0; damageShow.text = startValue.ToString(); damageShow.enabled = false; } /// <summary> /// 显示 /// </summary> void Show() { damageShow.enabled = true; } /// <summary> /// 实现跟随 /// </summary> void Follow() { if (!isFollow) return; pos_InMainCamScreen = Camera.main.WorldToScreenPoint(target.position); pos_InCanvasCamWorld = canvas.worldCamera.ScreenToWorldPoint(pos_InMainCamScreen); pos_FinalInWorld = new Vector3(pos_InCanvasCamWorld.x,pos_InCanvasCamWorld.y,canvas.GetComponent<RectTransform>().anchoredPosition3D.z); transform.position = pos_FinalInWorld; } }最后只需要将代码挂载,拖上相关的物体,设置公开的数值便可以实现了,文章中伤害是随机计算的,如有需要自行修改。
相关文章推荐
- Unity中制作游戏的快照游戏支持玩家拍快照
- Unity学习笔记3 简易2D横版RPG游戏制作(三)
- unity制作斗地主游戏大致流程
- Unity学习之路(一)太空大战类游戏制作4
- 如何使用Unity制作一款自己喜欢玩的游戏demo(Unity萌新的进阶技巧)
- unity打飞机游戏简单制作
- PonePal_unity游戏制作
- 用Unity制作游戏,你需要深入了解一下IL2CPP
- 【Unity 3D】学习笔记二十九:游戏实例——简单小地图制作
- <Unity3D>使用Unity来制作俄罗斯方块游戏
- Unity中制作游戏的快照游戏支持玩家拍快照
- Unity自发光材质制作——做游戏里的液晶显示屏,荧光对象可以用到
- 【unity】使用NGUI制作滚动列表
- Unity手机开发之巧妙利用纹理制作滚动背景
- Unity-3D捕鱼达人小游戏开发 —— 游戏中精灵动画的制作
- 小小打灰机——1-制作游戏首界面和滚动背景
- 使用Unity制作游戏关卡的教程(一)
- ROLL A BALL (Unity 3D 入门) 游戏制作指导 - 移动游戏对象
- 分享2D Unity游戏的动画制作经验
- unity The Matrix和游戏制作的一些指标