在開發(fā)項(xiàng)目中雪标,可能會(huì)有制作血條的功能筷狼,或者制作三維場(chǎng)景中人物頭上的狀態(tài)欄或者信息欄的功能需求动看。
效果:
其實(shí)主要就是UGUI物體跟隨三維世界的物體坐標(biāo)的實(shí)現(xiàn)裕偿。然后將血條信息或者其他的信息數(shù)據(jù)賦值洞慎。
知識(shí)點(diǎn):
1、就是三維世界與UGUI的坐標(biāo)轉(zhuǎn)換
Uunity提供了很方便的API:RectTransformUtility(RectTransform的輔助類)
a嘿棘、這個(gè)功能主要用到了ScreenPointToWorldPointInRectangle劲腿;
解釋:
bool ScreenPointToWorldPointInRectangle(RectTransform rect, Vector2 screenPoint, Camera cam, out Vector3 worldPoint),把屏幕坐標(biāo)轉(zhuǎn)換成在rect這個(gè)實(shí)參平面內(nèi)的世界坐標(biāo)鸟妙,這個(gè)函數(shù)可能會(huì)比較難搞懂一些焦人,可以理解為在屏幕坐標(biāo)ScrrenPoint處發(fā)條Z方向的射線,攝像與rect的交點(diǎn)就是返回的世界坐標(biāo)worldPoin重父。(這里的rect就傳自身的RectTransform花椭,screenPoint就是屏幕坐標(biāo),其實(shí)就是把screenPoint投射在Canvas平面上得到rect的世界坐標(biāo)點(diǎn))
b房午、還有另外一個(gè)接口和它類似:ScreenPointToLocalPointInRectangle
解釋:bool ScreenPointToLocalPointInRectangle(RectTransform rect, Vector2 screenPoint, Camera cam, out Vector2 localPoint); 把一個(gè)屏幕空間上的點(diǎn)矿辽,轉(zhuǎn)換成rect的內(nèi)部坐標(biāo),Canvas 的RenderMode在Camera和World模式下郭厌,傳入的camera為UI攝像機(jī)袋倔,在OverLay,camara參數(shù)應(yīng)該傳入null折柠。(這里的rect就傳你想要賦值的物體的父物體)奕污。
主要思路就是將目標(biāo)的三維世界坐標(biāo)先轉(zhuǎn)化為屏幕坐標(biāo),然后將得到的屏幕坐標(biāo)轉(zhuǎn)化為UGUI自身的坐標(biāo)液走。
2碳默、可以用UGUI的Slider制作血條,也可以直接用圖片Image(用圖片的話設(shè)置方式見下圖);
主要設(shè)置ImageType為Filled模式即可缘眶,然后改變Fill Amount的值嘱根。
代碼部分:
public Vector3 Offset = new Vector3(0,1,0);
private void CalPosition()
{
Vector3 vector3 = Vector3.zero;
Vector3 screenPosition = Camera.main.WorldToScreenPoint(TargetTransform.position + Offset);//將目標(biāo)物體的坐標(biāo)轉(zhuǎn)化為屏幕坐標(biāo)
Vector3 uiPosition = Vector3.zero;
//;//將得到的屏幕坐標(biāo)轉(zhuǎn)化為UGUI坐標(biāo)
if (RectTransformUtility.ScreenPointToWorldPointInRectangle(transform as RectTransform, screenPosition, null, out uiPosition))
{
transform.position = uiPosition ;
}
}
設(shè)置偏移量,方便調(diào)整血條的位置巷懈,使其位置更和諧该抒。