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

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

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

对屏幕自适应不明确的看

p=852" rel="bookmark">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屏幕坐标-血条的更多相关文章

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

    解决步骤: 1.添加一个摄像机,命名为BackgroundCamera,然后在Layer添加一个background层.并且将plane拖放到改相机节点下. 然后将BackgroundCamera和P ...

  2. OpenGL编程(七)3D模型的深度(z轴)检测

    下图是我们要修改后的效果图: 一.深度检测 1.模型Z轴显示有问题: 上一次试验中,如果认真留意,会发现一个问题.当控制锥体在左右或上下旋转时,你会发现锥体看起来是在+-180度之间来回摆动,而不是3 ...

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

    效果: 思路: 1.算出正确的uv去采样过滤图,上一篇文章说的很明白了.Shader实例:NGUI图集中的UISprite正确使用Shader的方法 2.用当前血量占总血量的百分比来设置shader中 ...

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

    一直以来很多Stage3D开发者都在为3D模型在2DUI上显示的问题头疼.Stage3D一直是在 Stage2D下面.为了做到3D模型在2DUI上显示通常大家有几种实现方式,下面来说说这几种实现方式吧 ...

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

    假设场景中有两台摄像机, 一台是NGUI的摄像机, 另外一台是投影摄像机. 投影摄像机看的是3D模型, Depth比NGUI的摄像机要大, Clear Flags设置的是Depth only. 现在想 ...

  6. 从2D图片生成3D模型(3D-GAN)

    https://blog.csdn.net/u014365862/article/details/54783209 3D-GAN是使用生成对抗网络学习2D图像到3D模型的映射,生成网络负责生成3D模型 ...

  7. Unity NGUI和UGUI与模型、特效的层级关系

    目录 1.介绍两大UI插件NGUI和UGUI 2.unity渲染顺序控制方式 3.NGUI的控制 4.UGUI的控制 5.模型深度的控制 6.粒子特效深度控制 7.NGUI与模型和粒子特效穿插层级管理 ...

  8. NGUI研究之开发项目的一些使用心得比較细节

     不知不觉使用NGI插件已经有一段时间了.感觉NGUI真的是眼下Unity3D中最好用的UI插件. 可是它也有一些不是BUG的BUG,这些问题可能会让新人摸不着头脑,那么这篇文章将总结一下这段时间 ...

  9. c# winform用sharpGL(OpenGl)解析读取3D模型obj

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11783026.html 自己写了个简单的类读取解析obj模型,使用导入类,然后new个对象,在 ...

随机推荐

  1. spring mvc处理静态文件

    现在流行REST开发风格,REST风格的URL 是不希望看到例如:*.do后缀的. <servlet-mapping> <servlet-name>cxy</servle ...

  2. 转 Python爬虫入门三之Urllib库的基本使用

    静觅 » Python爬虫入门三之Urllib库的基本使用 1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器 ...

  3. 标准C程序设计七---43

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  4. #pragma用法

    #pragma是一种预处理指令,作用是设定编译器的状态或者是指示编译器完成一些特定的动作. 其格式一般为:#pragma Para.其中Para为参数.下面是一些常见用法. 1.message ——在 ...

  5. Python初见

    参考资料:http://wenku.baidu.com/link?url=_akpT-G5Tvf7ECyszSipOAhHXzjlpYu-RWPcRTYp_tecPOollPGUxXG4MH69MLN ...

  6. 细说Redis监控和告警

    https://blog.csdn.net/qq_27623337/article/details/53206685

  7. WKWebView与js交互中产生的内存泄漏

    最近开发中突然发现富文本帖子详情内存没有释放掉,找了好久问题都没找到,终于今天发现了问题,先上一点代码片段 WKWebViewConfiguration *configuration = [[WKWe ...

  8. 51Nod 1239 欧拉函数前n项和 杜教筛

    http://www.51nod.com/Challenge/Problem.html#!#problemId=1239 AC代码 #include <bits/stdc++.h> #de ...

  9. Database | SQL

    Basic of MySQL 创建数据库: mysql> create database xxj; Query OK, row affected (0.00 sec) 列举数据库: mysql& ...

  10. shell细节决定高度

    1.文件测试操作符 -f[file]:文件存在且为普通文件则为真; -d[directory]:文件存在且为目录文件则为真; -s[size]:文件存在且为文件大小不为0则为真; -e[exist]: ...