在遊戲的戰鬥中經常需要使用到一個能夠跟隨人物位置變化而變化的血條,由於項目用到,就動手寫了一個,作爲鞏固一下里面需要用到的座標變換的知識。
我們項目中ui層使用的照相機跟場景中的照相機是獨立的,所以這個例子中需要兩個照相機,一個用來顯示血條,另外一個用來顯示角色,當然,需要保證角色的屏幕座標跟血條的屏幕座標要保持一致。慣例先來上最終效果圖:
上面三幅圖中,不管球體怎麼移動,血條在屏幕上的座標始終是跟它的屏幕座標是一致的。下面來講解一下製作過程。
1,創建兩個照相機,分別爲camera1,camera2,其中camera1對準的是球體,camera2則是畫布的照相機。
2,創建畫布,將畫布的renderCamera設置爲camera2,畫布上添加一個血條。
3,給血條添加一個腳本,腳本代碼如下:
using UnityEngine;
using System.Collections;
public class BloodBar : MonoBehaviour
{
public Transform m_tagTrans;//傳進來跟隨的物體,這裏就是一個球體,遊戲中可以爲角色
public Camera m_cam;<span style="white-space:pre"> </span>//畫布的renderCamera
public UnityEngine.Canvas m_canvas;//畫布
public UnityEngine.UI.Image img;
private float m_curBlood = 0.0f;
private float m_tagBlood = 0.5f;
// Use this for initialization
void Start ()
{
}
//傳進來的血量必須是百分比
void UpdateBlood(float blood)
{
if (0 <= blood && 1 >= blood)
m_tagBlood = blood;
else
Debug.Log("傳入錯誤血量值!!!");
}
//隨着目標點變動更新位置
void UpdatePosition()
{
//目標世界座標轉畫布座標
Vector3 worldToScreenPoint = Camera.main.WorldToScreenPoint(m_tagTrans.position);
//在畫布上對應的點
worldToScreenPoint = new Vector3(worldToScreenPoint.x, worldToScreenPoint.y, m_canvas.planeDistance);
Vector3 screenToWorldPoint = m_cam.ScreenToWorldPoint(worldToScreenPoint);
//得到最終畫布座標系中的投影點
Vector3 projPoint = m_canvas.transform.worldToLocalMatrix.MultiplyPoint(screenToWorldPoint);
this.transform.localPosition = projPoint;
}
// Update is called once per frame
void Update ()
{
//血量變動
m_curBlood = Mathf.Lerp(m_curBlood, m_tagBlood, 0.1f);
img.fillAmount = m_curBlood;
UpdatePosition();
}
}
代碼中關鍵部分爲UpdatePosition()這個函數,理解了mvp變換很容易就可以看出來這幾句代碼做了什麼。