首页
限免课
实战课
免费好课
课程库
经验
问答
会员课程
首页 |经验 |游戏 |经验详情

鱼都会的NGUI的HUD血量以及血条(二)

更新时间:2023-12-03

无私向斑马

游戏

1294

上一次我们完成了字体的制作,这次我们完成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的相机,也就是如下图的这个:

 鱼都会的NGUI的HUD血量以及血条(二)

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就可以出现了。效果如下:

 鱼都会的NGUI的HUD血量以及血条(二)

好了,显示HUD我就完成了,完整的工程在如下链接中:

http://pan.baidu.com/s/1gfC2S3D

那么感谢大家的阅读。鱼都会的东西,你也会。o( ̄▽ ̄*)ゞ)) ̄▽ ̄*)o

上一篇 下一篇

相关课程

ONLINE COURSES
  • 渲染是什么意思

    渲染是什么意思

    讲师:多喝热水

  • 实时渲染和离线渲染的区别

    实时渲染和离线渲染的区别

    讲师:多喝热水

  • 游戏建模和影视建模有什么区别

    游戏建模和影视建模有什么区别

    讲师:多喝热水

  • 工业建模和游戏建模哪个好

    工业建模和游戏建模哪个好

    讲师:多喝热水

免费好课

FREE GOOD COURSES
MORE
  • 虚幻5从安装到出图 - 70分钟解析影视级渲染新方案

    虚幻5从安装到出图 - 70分钟解析影视级渲染新方案

    1小时12分钟46秒

  • AutoCAD施工图基础课

    AutoCAD施工图基础课

    3小时16分钟32秒

  • C4D材质灯光渲染课

    C4D材质灯光渲染课

    3小时16分钟23秒

  • Q版角色三头身设计课

    Q版角色三头身设计课

    3小时9分钟29秒

  • 人体动态结构表现

    人体动态结构表现

    3小时20分钟5秒

  • AI+UE5轻松实现科幻电影!

    AI+UE5轻松实现科幻电影!

    32分钟36秒

Copyright © 2015 - 2021北京云创科讯软件有限公司

京ICP备16013396号-1

经营许可证京ICP证161220号

课程咨询电话 18516802937

  • 在线咨询
  • 插件下载
  • 职业测评
  • 素材下载
  • 微信咨询
学习在线解答