using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using DG; using DG.Tweening; /// /// 描述:血条 /// 作者:WJ /// public class Hpbar : MonoBehaviour { /// /// 自身Transform /// private RectTransform mRectTransform = null; /// /// 角色 /// private Role mRole = null; /// /// 图片 /// private Image mImage = null; /// /// 图片底 /// private Image mImageD = null; /// /// 时间 /// private float mCurTime = 0; /// /// 血条的上次进度 /// private float mLastHPAmount = 1.0f; /// /// 当前进度 /// private float mCurAmount = 0; /// /// 差值进度 /// private float mOffsetAmount = 0; /// /// 父节点RectTransform /// private RectTransform mRootRectTransform = null; private float mDelayImageD = 1; /// /// 设置进度条进度 /// /// 值 public void UpdateHPProgress(float val, float hideTime = 5.0f) { if (mImage) { mImage.fillAmount = val; mCurTime = hideTime; mCurAmount = val; mOffsetAmount = mLastHPAmount - val; mLastHPAmount = val; mImageD.DOFillAmount(mCurAmount, 1f); } } /// /// 初始化 /// /// /// public void Init(RectTransform rect, Role role, float val) { mRootRectTransform = rect; mRole = role; mRectTransform = transform as RectTransform; mRectTransform.anchoredPosition = World2UI(mRole.transform.position + Vector3.up * 2.0f); transform.Find("Image").gameObject.SetActive(true); mImage = transform.Find("Bar").GetComponent(); mImageD = transform.Find("BarD").GetComponent(); mImage.gameObject.SetActive(true); UpdateHPProgress(val); } // Update is called once per frame void FixedUpdate() { if (mRole == null || mRole.isDie) { Destroy(gameObject); return; } // 更新血条底 if (mOffsetAmount > 0) { //延迟等待 if(mDelayImageD > 0) { mDelayImageD -= Time.deltaTime; } else { mOffsetAmount -= Time.deltaTime * 0.5f; if (mOffsetAmount <= 0) { //mImageD.fillAmount = mCurAmount; mDelayImageD = 1; } else { //mImageD.fillAmount = mCurAmount + mOffsetAmount; } } } // 更新显示时间 if (mCurTime > 0) { mCurTime -= Time.deltaTime; if (mCurTime <= 0) { gameObject.SetActive(false); } } mRectTransform.anchoredPosition = Vector2.Lerp(mRectTransform.anchoredPosition, World2UI(mRole.transform.position + Vector3.up * 2.0f), 10 * Time.deltaTime); } /// /// 世界坐标转成UI坐标 /// /// 世界坐标 /// UI坐标 public Vector2 World2UI(Vector3 wpos) { if (Camera.main == null) { return Vector2.zero; } //世界坐标 -> ViewPort坐标 Vector2 viewPos = Camera.main.WorldToViewportPoint(wpos); //ViewPort坐标 -> UGUI坐标  return new Vector2(mRootRectTransform.rect.width * viewPos.x, mRootRectTransform.rect.height * viewPos.y); } }