• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

游戏开发

unity UI血条ui

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/youxikaifa/2019/0924/657.html

 
这次手机App外包功课五选一,我选了血条这个来做(感受对照着实简单)。 
先来看下功效,这个是IMGUI做的,玄色是由于没找到甚么办法设置色彩。 
这里写图片描述
这个是用UGUI,感受对照悦目点。 
这里写图片描述
 
这次用的这片面物资源和上次巡逻兵的同样,是在unity的市肆找的,资源如下 
人物控制挪动的代码与上次比拟稍有窜改。
 
IMGUI实现血条
先来讲下IMGUI,这个其实即是用OnGUI函数来实现的,通过GUI的box,label,HorizontalScrollbar等等来实现菜单甚么的ui,这里做的血条就用到了HorizontalScrollbar。但这个东西实现血条感受我做的还不太好,比方说人物走远了,血条大小照旧不变,而且感受上会越来越高等等,这些都是挺繁难的工作,要通过录像机和人物的距离来举行调解,光阴有限,这里只是大略地实现血条。
 
如下即是App开发培训IMGUI实现血条的代码,写好后干脆挂到人物上头就好了,凭据人物高矮和分辨率来调一下barUpLength。
 
public class IMGUI : MonoBehaviour {
    private Rect bloodBar;    private float barUpLength = 70f;    void Start()
    {
        bloodBar = new Rect (0, 0, 60, 20);
    }    void OnGUI()
    {
        Vector2 player2DPosition = Camera.main.WorldToScreenPoint (transform.position);
        player2DPosition.y = Screen.height - player2DPosition.y - barUpLength;
        bloodBar.center = player2DPosition + new Vector2(0 , 0);        if ( player2DPosition.x > Screen.width || player2DPosition.y > Screen.height
            || player2DPosition.x < 0 || player2DPosition.y < 0) {
 
        } else {
            GUI.HorizontalScrollbar(bloodBar, 0.0f, 1.0f, 0.0f, 1.0f);  
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
UGUI实现血条
而后即是UGUI,首先给人物增加一个Canvas。 
这里写图片描述
 
canvas的renderMode改成OverLay那个。 
这里写图片描述
 
而后Canvas内部加一个slider。 
这里写图片描述
 
slider下有几个子元素,把那个Handle Slide Area的active的√给点掉,这样slider就没有那个滑块了。 
这里写图片描述
 
而后设置slider下的Fill Area中的fill的色彩,设为血色,这样slider看上去即是血色的血条了。 
这里写图片描述
 
再把目前血量改一改。 
这里写图片描述 
还要改的即是血条slider的大小,在scale那边改改就好了,就不贴出来了。
 
接下来就UGUI的代码,这片面代码和IMGUI很像,都是将人物的坐标转换到录像机的坐标,而后把血条放到人物在录像机坐标的上方,但是UGUI中,Slider是着实的一个GameObject,挂在了人物上,是以感受对照着实。
 
public class UGUI : MonoBehaviour {    private float barUpLength = 3f;    public Slider healthSlider ;    // Use this for initialization
    void Start () {
 
    }    // Update is called once per frame
    void Update () {
        Vector3 worldPos = new Vector3(transform.position.x, transform.position.y + barUpLength , transform.position.z);
 
        Vector3 screenPos = Camera.main.WorldToScreenPoint(worldPos);
 
        healthSlider.transform.position = new Vector3(screenPos.x, screenPos.y, screenPos.z);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
总结
总的来说,常州网站开发培训IMGUI是个挺难弄的东西,由于它曾经挺过期了,UGUI的话就对照好,是着实的一个GameObject,不运行也能够看到,利便调试。这次功课中我用的这两种方式都没有实现血条的近大远小,由于感受也有点繁难,感受应该是通过录像机到人的距离来调解血条大小另有相对的高低,但是推导响应的公式感受对照头疼。
 
增补
事实上在UGUI中,把canvas的rendermode设置成worldspace,而后再用代码使得slider一直面朝录像机,便实现近大远小的功效,但是先生说能用overlay就用overlay,机能更好(有种被坑的感受),那种环境应该是静态的血条最好,例如少许游戏会在下方表现目前血量那种,这里这种动静的血条就不太好使,但是等我想起来这件事的时候曾经很晚了,以是前方的功课也就那样了。
 

上篇:上一篇:Unity5.3+ 在UGUI 上应用 粒子特效
下篇:下一篇:Unity的WWW类的用法整顿