首页 > 代码库 > NGUI研究之3D模型坐标转2D屏幕坐标-血条

NGUI研究之3D模型坐标转2D屏幕坐标-血条

??

刚好今天有朋友问我,比較典型的样例就是游戏里面人物的血条。

原理非常easy就是把3D点换算成2D的点。可是因为NGUI自身是3D所以我们须要先把NGUI下的点转成2D点。然后在把他转成3D的点。

听起来有点绕,不要紧我直接上代码。

对屏幕自适应不明确的看NGUI研究之怎样自适应屏幕

眼下我一直都是用NGUI来做人物血条,可是2D血条都会有个限制。就是它不能和模型有遮挡关系。只是血条能够依据人物的位置调节。比方远一点的人物血条会小一些,近一点的人物血条会大一些。

最好让美术做FBX的时候直接内置一个GameObject 的点。由于模型有的高有的低,所以血条的位置高度是不一样的,假设美术内置的话能够让美术来调节模型头顶上的点,这样比較方便。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using UnityEngine;
using System.Collections;
 
public class NewBehaviourScript : MonoBehaviour {
 
  //角色
    public Transform Cube;
    //角色的血条
    public Transform UI;
 
  //默认血条缩与摄像机的距离
    private float Fomat;
    //角色头顶的点, 最好让美术把这个点直接做在fbx模型里面。
    private Transform Head;
 
    void Start ()
    {
      //找到角色身上头顶的点
        Head = Cube.Find("head");
        //计算下面默认血条的距离,也能够写个常量,就是标记一下
        Fomat  = Vector3.Distance(Head.position,Camera.main.transform.position);
    }
 
    void Update ()
    {
      //这里能够推断一下 假设位置没有变化就不要在赋值了
        float newFomat = Fomat / Vector3.Distance(Head.position,Camera.main.transform.position);
        UI.position  = WorldToUI(Head.position);
        //计算出血条的缩放比例
        UI.localScale = Vector3.one * newFomat;
 
    //測试代码。按下W S键前后移动角色
        if(Input.GetKey(KeyCode.W))
            Cube.Translate(Vector3.forward);
        if(Input.GetKey(KeyCode.S))
            Cube.Translate(Vector3.back);
    }
 
  //核心代码在这里把3D点换算成NGUI屏幕上的2D点。
    public static Vector3 WorldToUI(Vector3 point)
    {
        Vector3 pt = Camera.main.WorldToScreenPoint(point);
        //我发现有时候UICamera.currentCamera 有时候currentCamera会取错。取的时候注意一下啊。
        Vector3 ff =     UICamera.currentCamera.ScreenToWorldPoint(pt);
        //UI的话Z轴 等于0
        ff.z = 0;
        return ff;
    }
}

 

再说一下,一般血条可能都是由多个UISprite组成。那么最好把这些Sprite都挂在同一个GameObject以下,这样仅仅须要修正父对象。所以子对象的缩放都会正确。控制角色移动近一点的截图。

技术分享

控制角色移动远一点的截图,你会发现血条在屏幕上的比例是不会变化的。

NGUI研究之3D模型坐标转2D屏幕坐标-血条