上一次我们完成了字体的制作,这次我们完成HUD的显示吧!首先,我们知道我们可以将NGUI的Label摆在任意位置,而我们3D场景中的人物是移动的,可能远,可能近,也可以在左右或者上下,那么我们必须让这个Label根据我们的人物进行移动。让Label的坐标和人物的坐标相关联。我们先制作一个Label的预制体,命名为HUD;然后创建一个代码文件输入一下代码:
void Start ()
{
MyUICamera = NGUITools.FindCameraForLayer (LayerMask.NameToLayer("map"));
transform.localScale = Vector3.one;
Vector3 pos = Camera.main.WorldToScreenPoint(v_Pos); //获取目标物体的屏幕坐标
pos = MyUICamera.ScreenToWorldPoint(pos); //将屏幕坐标转换为UI的世界坐标
pos.z = 0;//由于NGUI 2D界面的Z轴都为0
transform.position = pos; //将修改过的坐标赋给UI界面
transform .GetComponent<UILabel> ().text = HurtNum.ToString();
}
一个一个解释一下:
MyUICamera = NGUITools.FindCameraForLayer (LayerMask.NameToLayer("map"));
这行代码时NGUI自带的根据LayerMask查找相机的代码,我们在这里找的时NGUI的相机,也就是如下图的这个:
transform.localScale = Vector3.one;
v_Pos是我们3D物体要显示的位置,我们将这个位置转换到屏幕的坐标系中。
pos = MyUICamera.ScreenToWorldPoint(pos);
然后将这个位置从屏幕坐标系中转换到我们的NGUI的摄像机坐标系。
原理很简单,因为我们的NGUI的位置是在世界坐标上的,所以需要转到世界坐标系。
transform.position = pos;将我们的位置设置给HUD;这样,我们的的HUD的位置就会跟着我们的物体了。
transform .GetComponent<UILabel> ().text = HurtNum.ToString();
最后,我们将伤害赋值上去;
代码卸载Start中的原因是,因为显示的出血量是不会一直跟着物体的,只是在出现的时候出现在一个位置,然后向上飘动。
那么理解以上代码之后在看看下面的代码,向上飘动:
void Update ()
{
if (LeftTime > 0)
{
Color color = transform.GetComponent<UILabel>().color;
transform.Translate(Vector3.up * Time.deltaTime *( MoveSpeed/10));
if(LeftTime<1.0f)
{
color.a-= Time.deltaTime*2;
}
elseif(color.a < 1)
{
color.a+= Time.deltaTime *3;
}
transform.GetComponent<UILabel>().color = color;
LeftTime -= Time.deltaTime;
}
else
{
Destroy(gameObject);
}
}
LeftTime是HUD存在的时间,如果超过这个时间就清除掉他。
Color color = transform.GetComponent<UILabel>().color;
在这里我们获取了Label字体的颜色,我们需要做淡入淡出的效果。
transform.Translate(Vector3.up * Time.deltaTime *( MoveSpeed/10));
这里就是HUD向上移动的效果了。
if(LeftTime<1.0f)
{
color.a-= Time.deltaTime*2;
}elseif(color.a < 1)
{
color.a+= Time.deltaTime *3;
}
这部分代码是根据时间,让HUD淡入,然后再淡出。只要设置透明度alpha就可以。
transform.GetComponent<UILabel>().color = color;
将颜色设置回去,让他显示。
LeftTime -= Time.deltaTime;
存活时间减少,这样才能让他消失。
完整代码如下:
usingUnityEngine;
usingSystem.Collections;
publicclassHUD : MonoBehaviour
{
publicfloatHurtNum = 0f;
publicfloatMoveSpeed = 1.0f;
publicVector3v_Pos;
publicCameraMyUICamera;
publicfloatLeftTime = 0f;
// Use this for initialization
voidStart ()
{
MyUICamera = NGUITools.FindCameraForLayer (LayerMask.NameToLayer("map"));
transform.localScale = Vector3.one;
Vector3pos = Camera.main.WorldToScreenPoint(v_Pos);//获取目标物体的屏幕坐标
pos = MyUICamera.ScreenToWorldPoint(pos);//将屏幕坐标转换为UI的世界坐标
pos.z = 0f;//由于NGUI2D界面的Z轴都为0
transform.position = pos;//将修改过的坐标赋给UI界面
transform .GetComponent<UILabel> ().text = HurtNum.ToString();
}
// Update is called once per frame
voidUpdate ()
{
if (LeftTime > 0f)
{
Color color = transform.GetComponent<UILabel>().color;
transform.Translate(Vector3.up * Time.deltaTime *( MoveSpeed/10));
if(LeftTime<1.0f)
{
color.a-= Time.deltaTime*2;
}
elseif(color.a < 1)
{
color.a+= Time.deltaTime *3;
}
transform.GetComponent<UILabel>().color = color;
LeftTime -= Time.deltaTime;
}
else
{
Destroy(gameObject);
}
}
}// end class
怎么使用这个HUD呢?
我们只需要创建就可以了,代码如下:
///<summary>
///显示HUD
///</summary>
///<paramname="HUDPos">HUD产生的位置</param>
///<paramname="HurtNum">显示的伤害</param>
///<paramname="LeftTime">显示到消失的时间(默认2秒)</param>
///<paramname="MoveSpeed">向上移动的速度</param>
public void ShowHUD(Vector3HUDPos,intHurtNum,floatLeftTime = 2.0f,floatMoveSpeed = 1.0f)
{
GameObjectg = (GameObject)Object.Instantiate (GameStart.Instance.HUDPrefab);
g.transform.parent = GameObject.Find ("UI Root").transform;
HUDhud = g.transform.GetComponent<HUD>();
hud.v_Pos = HUDPos;
hud.LeftTime = 2.0f;
hud.HurtNum = HurtNum;
}
上面的代码很清晰了,就是穿件一个HUD预制体,然后将这个对象放入UIRoot作为它的子物体,获取HUD脚本,传入显示伤害的位置,显示的时间,伤害数值。这样,HUD就可以出现了。效果如下:
好了,显示HUD我就完成了,完整的工程在如下链接中:
http://pan.baidu.com/s/1gfC2S3D
那么感谢大家的阅读。鱼都会的东西,你也会。o( ̄▽ ̄*)ゞ)) ̄▽ ̄*)o