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以下,这样仅仅须要修正父对象。所以子对象的缩放都会正确。控制角色移动近一点的截图。

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

时间: 2024-10-14 03:39:42

NGUI研究之3D模型坐标转2D屏幕坐标-血条的相关文章

unity3d设置3D模型显示在2D背景之前(多个相机分层显示)(转)

解决步骤: 1.添加一个摄像机,命名为BackgroundCamera,然后在Layer添加一个background层.并且将plane拖放到改相机节点下. 然后将BackgroundCamera和Plane都置于background层,修改ClearFlags未Depthonly深度渲染,并且设置 CullingMask为只看到background层,还有设置Depth为-1,说明背景层是最深,其他model所在的相机的Depth是 0,NGUI的是1,这里层次关系就是NGUI在最前面,mod

D3D坐标系统下3D世界坐标映射到2D屏幕坐标的平移矩阵

D3D中绘画3D模型基本上就是靠3个矩阵World, View, Projection来联合进行模型位置定位.视角定位及透视变形的,这与2D绘制一个图形只需要给出屏幕上的一个像素坐标就能进行定位有着非常大的不同.在某些场合,我们想根据屏幕上的像素坐标来绘制3D模型,一般可以通过用正交投影代替透视投影就能轻松进行绘制,但在一些极其特殊的情况下我们还想让绘制出的3D模型保持原先指定的3个矩阵所有变换,这就需要通过这3个矩阵及目标像素点反求出一个平移矩阵,这篇文章就是介绍该怎么做的. 先简单介绍一下在

Unity中利用Vuforia制作AR同时令3D模型出现在2D图片前

如需转载请保留本文链接. 版本号:5.5.0 需配置:SDK,JDK,Vufoira的Unity包,Vufoira图片包 使用工具:UGUI 讲Canvas中的Render Mode改为:Screen Space-Camera, Render Camera中拖入AR相机下的Camera,结束. 设置如图:

[Unity3D]Unity3D再叙NGUI之血条及技能冷却效果

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本文作者:

Shader实例:NGUI制作网格样式血条

效果: 思路: 1.算出正确的uv去采样过滤图,上一篇文章说的很明白了.Shader实例:NGUI图集中的UISprite正确使用Shader的方法 2.用当前血量占总血量的百分比来设置shader中的变量,来控制血条的裁剪. 实际操作中,在shader中声明一个uniform float _Factor 然后在C#脚本中,对这个变量进行设置,结果发现,界面上不能实时响应这个值,进行正确的裁剪. 那么我只好牺牲color的一个分量,比如设置g分量,shader中用g分量的值来对血条进行裁剪.最终

Flash Stage3D 在2D UI 界面上显示3D模型问题完美解决

一直以来很多Stage3D开发者都在为3D模型在2DUI上显示的问题头疼.Stage3D一直是在 Stage2D下面.为了做到3D模型在2DUI上显示通常大家有几种实现方式,下面来说说这几种实现方式吧. 实现方式1: 在2DUI上挖个洞透过去显示3D层.这种做法的缺陷在于如果两个UI界面同时打开就会UI错层显示错乱.为了解决这问题很多程序员选择了当挖洞显示3D的UI打时把其他界面隐藏掉,用户体验超差. 实现方式2: 利用Context3D 的 drawToBitmapData API 实时将3D

cocos2d-x实现3D模型的换装系统的研究

这篇文章不会给出具体实现和代码(因为我也还没有搞定),但是会对我所理解的换装系统进行一些分析,并给出方向. 一.什么是换装系统 RPG游戏中,更换不同的武器.装备,人物模型也会有相应的改变,这就是换装系统.实现换装系统,可以增加表现力,比如暗黑中换不同盔甲,人物看起来也会不一样,有的极品装备还会有光效环绕,这样刷装备才会更加有趣. 二.实现换装系统的方式 1.武器和外挂式组件(比如护肩,披风)的换装. 这个最简单也最基础,在手部或者肩部创建一个绑点,然后将物体挂接上去就行.这类物体大多数是刚体且

Qt 3D研究(三):显示3D模型

Qt 3D研究(三):显示3D模型 上一篇文章介绍了如何使用最少的代码创建一个Qt 3D的应用.和大家最初接触的glut一样,对于3D应用来说,需要做的准备工作还真不少,不过呢,Qt 3D把一些窗口相关的琐碎事情解决了,剩下的,该由我们完成重要的渲染部分了,可以说,带来了某种程度的方便. 蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/43964499.欢迎同行前来探讨. 我们接下来要使用Qt 3D将一个模型显示出来.Qt 3

如何让NGUI的对象在3D模型之上

假设场景中有两台摄像机, 一台是NGUI的摄像机, 另外一台是投影摄像机. 投影摄像机看的是3D模型, Depth比NGUI的摄像机要大, Clear Flags设置的是Depth only. 现在想让3D模型夹在两个NGUI控件之间. 尝试的办法: 设置深度, 设置RendererQueue都没有用. 没辙了, 只好把想放到3D模型上面的UISprite也使用3D摄像机来看算了. 现在问题来了, 如何让原本在NGUI里已经把位置大小都调好了的东西, 当它在被一个3D摄像机看的时候依然一样? 如