【u3d泰斗破坏神】09 --- 角色血条的制作、掉血特效

本文介绍如何在Unity中实现角色血条及其掉血特效。具体包括在角色上添加血条Canvas,利用脚本控制血条方向始终朝向屏幕,以及通过对象池技术实现掉血数字的高效复用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:角色下添加一个 Canvas,在Canvas下添加血条即可

  1. 添加Canvas、血条,血条的Scale设置为0.006大小就差不多
    这里写图片描述

  2. Canvas下添加一个脚本来控制血条,因为血条在角色身上所以会跟随角色旋转,所以我们要让它一直朝向屏幕

    void Update ()
    {
        transform.rotation = Camera.main.transform.rotation;
    }
  3. 掉血特效的实现 ①先做好一个显示掉血数字的prefab ②构建一个对象池 ③通过对象池获取prefab并添加特效,之后回收。

//对象池
using System.Collections.Generic;
using UnityEngine;

public class ObjectPool : MonoBehaviour
{
    public Queue<GameObject> pool = new Queue<GameObject>();//使用队列,先进先出,避免连续生成同一个对象
    GameObject model; //预制体,就是一个image,用来显示数字
    private Transform m_wordParent;

    private void Awake()
    {
        m_wordParent = GameObject.Find("LoseHpNode").transform;
    }

    public void Expand(int count)
    {
        GameObject obj = null;
        for (int index = 0; index < count; index++)
        {
            obj = Instantiate(Resources.Load<GameObject>("Prefabs/LoseHp"));
            obj.transform.SetParent(m_wordParent);
            obj.SetActive(false);
            pool.Enqueue(obj);
        }
    }
    public GameObject GetObject()//得到一个对象
    {
        if (pool.Count <= 0)//池子没有对象,扩展
            Expand(20);
        GameObject obj = pool.Dequeue();//得到队列底部的对象
        obj.SetActive(true);
        return obj;
    }
    public void Recovery(GameObject obj)//回收一个对象
    {
        obj.SetActive(false);
        obj.transform.SetParent(m_wordParent);
        if (pool.Contains(obj))//重复的不添加?。。。
            return;
        pool.Enqueue(obj);
    }
}
//掉血效果的实现
    public void LoseHp(float damage)
    {
        GameObject obj = m_pool.GetObject();
        obj.transform.SetParent(m_hpNode);
        obj.GetComponent<Text>().text = "-" + damage;
        obj.GetComponent<RectTransform>().localPosition = new Vector3(0, 0, 0);
        obj.transform.localRotation = Quaternion.identity;
        StartCoroutine(UpNumber(obj));//使实例的物体上升
    }

    IEnumerator UpNumber(GameObject obj)
    {
        yield return new WaitForSeconds(0.2f);
        obj.GetComponent<RectTransform>().DOLocalMove(new Vector3(0, 2f, 0), 0.5f);//用tween将数字移动到指定位置
      //  obj.GetComponent<Renderer>().material.DOFade(0, 1);
        yield return new WaitForSeconds(1);//1秒钟后隐藏或者销毁
        m_pool.Recovery(obj);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值