Unity开发:血条跟随的实现

之前在网上看了很多人物血条跟随的方式,都不是很顺手..包括各种偏移的计算啊什么的都不是很完美,于是仔细去看了一篇RectTransform属性的详解,又了解了一下坐标转换的原理,最终得到了一个比较完美而且很简单的方案:

基本实现:

void Start ()
{
    Bar = Instantiate(BarPrefab, BarPrefab.transform);
    rectBloodPos = Bar.GetComponent();
    rectBloodPos.anchoredPosition = new Vector2 (x, y);//控制偏移量
}

private void Update()
{
    Vector2 vec2 = Camera.main.WorldToScreenPoint (this.gameObject.transform.position);
    rectBloodPos.anchorMax = Camera.main.ScreenToViewportPoint(vec2);
    rectBloodPos.anchorMin = Camera.main.ScreenToViewportPoint(vec2);

}

Unity开发:血条跟随的实现_第1张图片


随物体缩放的实现
如果只实现上面,那么血条的大小只是固定的,如果有多个物体要显示血条,就需要近大远小的效果

public GameObject BarPrefab;
public GameObject BarAnchor;
private GameObject Bar;

public float limit;//与摄像头的距离,超出这个距离就消失
private bool visible;

private void Update()
{
    Vector2 vec2 = Camera.main.WorldToScreenPoint (BarAnchor.transform.position);
vec2.y);//控制偏移量
    rectBloodPos.anchorMax = Camera.main.ScreenToViewportPoint(vec2);
    rectBloodPos.anchorMin = Camera.main.ScreenToViewportPoint(vec2);


    float dist = Vector3.Distance(transform.position, CameraAction.instance.camera.transform.position);
    if (dist > limit || !visible)
    {
        Bar.SetActive(false);
    }
    else
    {
        Bar.SetActive(true);
    }
    float one = dist/limit;
    float sc = 1.4f - 1f * one;//缩放系数
    rectBloodPos.localScale = Vector3.one * sc; 
}

private void OnBecameVisible()
{
    Debug.Log("Visible");
    visible = true;
}

private void OnBecameInvisible()
{
    Debug.Log("Invisible");
    visible = false;
}

另外第一次接触OnBecameInvisible()这两个方法的朋友们注意一下,在编辑器模式中需要确保在GameScene两个场景下该物体都不可见,以及包含MeshRender组件才会被调用到

你可能感兴趣的:(Unity)