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);
}
}