1. 程式人生 > >Unity開發:血條跟隨的實現

Unity開發:血條跟隨的實現

之前在網上看了很多人物血條跟隨的方式,都不是很順手..包括各種偏移的計算啊什麼的都不是很完美,於是仔細去看了一篇RectTransform屬性的詳解,又瞭解了一下座標轉換的原理,最終得到了一個比較完美而且很簡單的方案:

基本實現:

void Start ()
{
    Bar = Instantiate(BarPrefab, BarPrefab.transform);
    rectBloodPos = Bar.GetComponent<RectTransform>();
    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); }

這裡寫圖片描述

隨物體縮放的實現
如果只實現上面,那麼血條的大小隻是固定的,如果有多個物體要顯示血條,就需要近大遠小的效果

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元件才會被呼叫到