自己花了两个小时研究出来的 3D游戏怪物受到伤害,显示伤害的数字

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;

public class DamageTextShowControler : MonoBehaviour
{
    public Camera mainCamera;
    public RectTransform damageHolderRect;//承载text的父物体

    public int DamageTextPoolCount = 20;//对象池容量
    void Start()//出自ZLY毕设
    {
        mainCamera = Camera.main;
        for (int i = 0; i < DamageTextPoolCount; i++)//初始化对象池子
        {
            GameObject textGO = GameObject.Instantiate(Resources.Load("DamageText") as GameObject, damageHolderRect); 
            damgeTextPool.Add(textGO);
            textGO.gameObject.SetActive(false);
        }
    }
    private List<GameObject> damgeTextPool=new List<GameObject>();//对象池
    /// <summary>
    /// 承受伤害的方法 传递过来受伤的怪物的位置,伤害数字,是否暴击了
    /// </summary>
    /// <param name="damagePosition"></param>
    /// <param name="damageCount"></param>
    /// <param name="isCritical"></param>
    public void ShowDamageText(Vector3 damagePosition, float damageCount, bool isCritical = false)
    {
        Vector3 screenPosition = mainCamera.WorldToScreenPoint(damagePosition);//先把怪物的位置转化为屏幕坐标
        Vector2 position;//再把屏幕坐标转化为对象池父物体的局部坐标
        RectTransformUtility.ScreenPointToLocalPointInRectangle(damageHolderRect, screenPosition, null, out position);
        if (position == null) return;
        
        string damageText = "-" + (int)damageCount;
        if (isCritical)//如果暴击 变成红色字体
        {
            damageText = "<color=#FF5F5FFF>" + damageText + "</color>";
        }
        Text text = GetTheText().GetComponent<Text>();
        text.transform.localPosition = position;//使用转化之后的位置
        text.text = damageText;
        text.transform.DOLocalMoveY(100, 3);//先网上飘去
        text.DOFade(0, 3);//渐变透明
        StartCoroutine(HideTextContinue(text));

    }//隐藏text的携程
    IEnumerator HideTextContinue(Text text)
    {
        yield return new WaitForSeconds(3); 
        text.color = new Color(255,217,118);//恢复正常颜色
        text.gameObject.SetActive(false);
    }
    //从对象池中取得对象的方法
    private GameObject  GetTheText()
    { 
        for (int i = 0; i < damgeTextPool.Count; i++)
        {
            if (damgeTextPool[i].activeInHierarchy == false)
            {
                damgeTextPool[i].SetActive(true);
                return damgeTextPool[i];
            }
        } 
        //如果没找到 就直接生成一个 然后直接计时销毁
        GameObject textGO = GameObject.Instantiate(Resources.Load("DamageText") as GameObject, damageHolderRect);
        Destroy(textGO,3.5f);
        return textGO; 
    }

//出自ZLY毕设
}


Text的prefabs的结构很简单 就是一个text ,没有别的 而他的父物体是在一个canvas上的

效果是这样的 出自ZLY毕设
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值