Unity 伤害飘血效果


前言

一个对于战斗中飘字飘血的功能,比较简单。

一、效果演示

在这里插入图片描述
字的颜色没调整好,所以有点不好看。

二、相关代码

根据自定义曲线控制飘字效果

using LFrameWork;
using TMPro;
using UnityEngine;

namespace Game
{
    public class HUDText : LMonoBehaviour,IUpdate
    {
        private readonly Vector3 r_LifeBarOffsetY = new Vector3(0, 2.2f, 0);

        //飘字持续时间
        [Range(0, 10f)] [SerializeField] protected float m_DurationTime;
        [SerializeField] protected AnimationCurve m_AlphaCurve;
        [SerializeField] protected AnimationCurve m_ScaleCurve;
        [SerializeField] protected AnimationCurve m_OffsetXCurve;
        [SerializeField] protected AnimationCurve m_OffsetYCurve;

        protected Transform m_FollowPlayer;
        protected TMP_Text m_HUDText;
        protected float m_CurrentTime;

        protected float m_OriginX;
        protected float m_OriginY;
        
        public void SetData(Transform target, string info)
        {
            m_FollowPlayer = target;
            m_HUDText = GetComponent<TMP_Text>();
            m_HUDText.text = info;

			//设置文本的起始位置
            transform.position =
                Utils.GetScreenPos(Camera.current, m_FollowPlayer.position + r_LifeBarOffsetY);
            
            m_OriginX = transform.localPosition.x;
            m_OriginY = transform.localPosition.y;
            
            //加入到自定义生命周期控制中
            LifeCycleManager.Instance.AddUpdate(this);
        }

        private void OnDisable()
        {
            LifeCycleManager.Instance.RemoveUpdate(this);
        }

        public void UpdateFun()
        {
            m_CurrentTime += Time.deltaTime;
            var tmpPercent = m_CurrentTime / m_DurationTime;
            if (tmpPercent > 1f)
            {
                //对象池回收
                RPGGame.Instance.RecycleObject(gameObject);
                return;
            }
            //静态扩展方法
            m_HUDText.SetColorAlpha(m_AlphaCurve.Evaluate(tmpPercent));
            transform.localScale = Vector3.one * m_ScaleCurve.Evaluate(tmpPercent);
            transform.SetTransLocalPosX(m_OriginX + m_OffsetXCurve.Evaluate(tmpPercent));
            transform.SetTransLocalPosY(m_OriginY + m_OffsetYCurve.Evaluate(tmpPercent));
        }
    }
}

工具方法,世界坐标和屏幕坐标的转换

        public static Vector3 GetScreenPos(Camera camera, Vector3 worldPos)
        {
            var tmpScreenPos = RectTransformUtility.WorldToScreenPoint(camera, worldPos);
            return new Vector3(tmpScreenPos.x, tmpScreenPos.y, 0);
        }

对于颜色渐变效果:
因为我这里的文本用的是TextMeshPro组件,所以对于字体变色可以直接修改其对应的属性。来控制文本的颜色渐变。
在这里插入图片描述
对于老版的Text组件,这里贴上一个脚本。在生成网格时修改顶点颜色,达成渐变的效果

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

namespace Game
{
    public class TextGradient : BaseMeshEffect
    {
        public Color32 topColor = Color.white;
        public Color32 bottomColor = Color.black;

        public override void ModifyMesh(VertexHelper vh)
        {
            if (!IsActive() || vh.currentVertCount == 0) return;
            
            var tmpVertices = new List<UIVertex>();
            vh.GetUIVertexStream(tmpVertices);
            
            for (var i = 0; i < tmpVertices.Count && tmpVertices.Count - i >= 6; i += 6)
            {
                ChangeColor(tmpVertices,i, topColor);
                ChangeColor(tmpVertices,i + 1, topColor);
                ChangeColor(tmpVertices,i + 2, bottomColor);
                ChangeColor(tmpVertices,i + 3, bottomColor);
                ChangeColor(tmpVertices,i + 4, bottomColor);
                ChangeColor(tmpVertices,i + 5, topColor);
            }
            
            vh.Clear();
            vh.AddUIVertexTriangleStream(tmpVertices);
        }   

        private void ChangeColor(List<UIVertex> uiVertices,int index, Color color)
        {
            var tmpVertex = uiVertices[index];
            tmpVertex.color *= color;
            uiVertices[index] = tmpVertex;
        }
    }
}

在文本上添加此脚本以后,修改TopColor和BottomColor脚本也可以实现渐变的效果
在这里插入图片描述

最后再分享一下自己调的四种曲线
在这里插入图片描述
AlphaCurve
在这里插入图片描述
ScaleCurve
在这里插入图片描述

OffsetXCurve
在这里插入图片描述
OffsetYCurve
在这里插入图片描述

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用DOTween实现伤害飘字可以通过以下步骤完成: 1. 创建一个伤害飘字的预制体,可以包含一个Text组件来显示伤害数字。 2. 在代码中使用DOTween创建一个Tween对象,将伤害飘字的位置从伤害来源点移动到目标位置,并在移动过程中改变伤害飘字的透明度和缩放大小等属性。 3. 在Tween对象完成后,销毁伤害飘字的预制体。 下面是一个示例代码: ```csharp public class DamageNumber : MonoBehaviour { public Text damageText; public float moveDuration = 1f; public float fadeDuration = 0.5f; public float scaleDuration = 0.5f; public float moveDistance = 50f; public Vector3 targetPosition; private void Start() { // 设置伤害飘字的初始位置 transform.position = targetPosition + new Vector3(0f, moveDistance, 0f); // 创建Tween对象来移动伤害飘字的位置 var moveTween = transform.DOMove(targetPosition, moveDuration); // 创建Tween对象来改变伤害飘字的透明度 var fadeTween = damageText.DOFade(0f, fadeDuration); // 创建Tween对象来改变伤害飘字的缩放大小 var scaleTween = transform.DOScale(2f, scaleDuration).SetEase(Ease.OutQuad); // 当Tween对象完成时,销毁伤害飘字的预制体 moveTween.OnComplete(() => Destroy(gameObject)); // 启动Tween对象 moveTween.Play(); fadeTween.Play(); scaleTween.Play(); } public void SetDamageNumber(int damage) { // 设置伤害数字的文本 damageText.text = damage.ToString(); } } ``` 在游戏中,可以通过以下代码来创建并显示伤害飘字: ```csharp public class Player : MonoBehaviour { public GameObject damageNumberPrefab; public void TakeDamage(int damage) { // 创建伤害飘字的预制体 var damageNumber = Instantiate(damageNumberPrefab, transform.position, Quaternion.identity); // 设置伤害数字的值 var damageNumberComponent = damageNumber.GetComponent<DamageNumber>(); damageNumberComponent.SetDamageNumber(damage); // 设置伤害飘字的目标位置 var targetPosition = transform.position + new Vector3(0f, 2f, 0f); damageNumberComponent.targetPosition = targetPosition; // 启动伤害飘字的Tween动画 damageNumberComponent.Start(); } } ``` 当玩家受到伤害时,通过调用TakeDamage方法来显示伤害飘字。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值