视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
NGUI研究之3D模型坐标转2D屏幕坐标
2020-11-09 08:10:44 责编:小采
文档


刚好今天有朋友问我,比较典型的例子就是游戏里面人物的血条。原理很简单就是把3D点换算成2D的点,但是由于NGUI自身是3D所以我们需要先把NGUI下的点转成2D点,然后在把他转成3D的点。听起来有点绕,不要紧我直接上代码。对屏幕自适应不明白的看NGUI研究之如



刚好今天有朋友问我,比较典型的例子就是游戏里面人物的血条。原理很简单就是把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;

publicclassNewBehaviourScript :MonoBehaviour{

//角色

publicTransform Cube;

//角色的血条

publicTransform UI;

//默认血条缩与摄像机的距离

privatefloatFomat;

//角色头顶的点, 最好让美术把这个点直接做在fbx模型里面。

privateTransform Head;

voidStart()

{

//找到角色身上头顶的点

Head=Cube.Find("head");

//计算以下默认血条的距离,也可以写个常量,就是标记一下

Fomat =Vector3.Distance(Head.position,Camera.main.transform.position);

}

voidUpdate()

{

//这里可以判断一下 如果位置没有变化就不要在赋值了

floatnewFomat=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点。

publicstaticVector3 WorldToUI(Vector3 point)

{

Vector3 pt=Camera.main.WorldToScreenPoint(point);

//我发现有时候UICamera.currentCamera 有时候currentCamera会取错,取的时候注意一下啊。

Vector3 ff= UICamera.currentCamera.ScreenToWorldPoint(pt);

//UI的话Z轴 等于0

ff.z=0;

returnff;

}

}

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

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

祝大家学习愉快,欢迎讨论,嘿嘿嘿嘿

下载本文
显示全文
专题