当前位置:首页 » 《关注互联网》 » 正文

Unity 简单的伤害数字显示_日常掉san的博客

17 人参与  2021年03月04日 15:43  分类 : 《关注互联网》  评论

点击全文阅读


Unity 伤害数字显示

参考链接https://blog.csdn.net/book_longssl/article/details/39610775?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-7&spm=1001.2101.3001.4242

试着做了下伤害数字的显示 效果如下
在这里插入图片描述

首先是新建一个c#脚本

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

public class DamageGUI : MonoBehaviour
{
    private Vector3 mTarget;
    private Vector3 mScreen;
    public float value;

    public float ContentWidth = 100;
    public float ContentHeight = 50;

    private Vector2 mPoint; //GUI坐标
    public float DestoryTime = 2.0f; //伤害数字消失时间
    // Start is called before the first frame update
    void Start()
    {
        mTarget = transform.position; //获取目标位置
        mScreen = Camera.main.WorldToScreenPoint(mTarget); //转化为屏幕位置
        mPoint = new Vector2(mScreen.x, Screen.height - mScreen.y);
        StartCoroutine("Free"); //开启一个协程
    }

    // Update is called once per frame
    void Update()
    {
        transform.Translate(Vector3.up * 0.5f * Time.deltaTime); //伤害数字上移效果
        mTarget = transform.position;  
        mScreen = Camera.main.WorldToScreenPoint(mTarget);
        mPoint = new Vector2(mScreen.x, Screen.height - mScreen.y);//实时变化位置
    }

    void OnGUI()
    {
        if (mScreen.z > 0) //伤害数字显示
        {
            GUI.Label(new Rect(mPoint.x, mPoint.y, ContentWidth, ContentHeight), value.ToString());
        }

    }
    IEnumerator Free()  //协程,伤害数字时间一到消失
    {
        yield return new WaitForSeconds(DestoryTime);
        Destroy(this.gameObject);
    }
}

随意新建一个空的物体
取名为DamageText,插入前面写好的DamageGUI脚本
并设为预制体,放入Resources文件夹
在这里插入图片描述

随后在人物的头顶位置Create Empty Object
我这里是新建了一个statusBar 以后也可以用于制作例如眩晕、减速等
在这里插入图片描述
随后在之前写好的战斗模块中调用这个DamageText预制体

public GameObject DamageGUI;
 void Start()
    {
        DamageGUI = Resources.Load("DamageText") as GameObject;
    }
public void AddHp(float value) {
        GameObject DamageText = (GameObject)Instantiate(DamageGUI, transform.DeepFind("statusBar").gameObject.transform.position, Quaternion.identity);
        DamageText.GetComponent<DamageGUI>().value = value;
    }

调用这个预制体的脚本位于PlayerHandle这一层中
在这里插入图片描述

在这里插入图片描述
而初始的Damage GUI是空的,需要将预制体拖入,但为了不每次新建角色怪物时重新拖入,这里我使用了

DamageGUI = Resources.Load("DamageText") as GameObject;

从Resources资源文件夹获取之前放入的预制体,运行后就可以自动获取

同时生成伤害数字的起始位置也是向下搜索

transform.DeepFind("statusBar").gameObject.transform.position

DeepFind的代码如下

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

public static class TransformHelpers 
{
    public static Transform DeepFind(this Transform parent, string targetName) {
        Transform tempTrans = null;
        foreach (Transform child in parent)
        {
            if (child.name == targetName)
            {
                return child;
            }
            else { 
                tempTrans = DeepFind(child, targetName);
                if (tempTrans != null) {
                    return tempTrans;
                }
            }
        }
        return tempTrans;
    }
}

简单的白字伤害数字就此完成,此后还需添加样式,例如更改伤害数字的大小,应该是从跳出时最大,逐渐变小,同时如果是暴击,得变个颜色,而且随着时间渐渐透明等,留待以后完成。


点击全文阅读


本文链接:http://zhangshiyu.com/post/16238.html

伤害  数字  预制  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1