UI3D转2D平面显示UI3DTo2D血条显示:

using UnityEngine;

using System.Collections;

public class UI3DTo2D : MonoBehaviour

{

private GameObject _TargetEnemyObj;                //目标物体

private Camera worldcamera;                        //世界相机

private Camera guiCamera;                          //UI相机

private Slider uiSlider;                           //敌人的血条

public float FloHPPrefabsLength = 2F;              //血条预设长度

public float FloHpPrefabsHeight = 1F;              //血条预设高度

public float FloHpHeightPosset = 1.5F;             //血条高度偏移量

//敌人生命数值

private float _FloCurrentHP = -999;                //当前生命数值

private float _FloMaxHP = -999;                    //最大生命数值

// 设置目标敌人

public void SetTargetEnemy(GameObject goEnemy)

{

_TargetEnemyObj = goEnemy;

}

//初始化目标对象变量

void Start()

{

//本UI Label 对象尺寸

this.transform.localScale = new Vector3(FloHPPrefabsLength, FloHpPrefabsHeight, 0);

//得到UI Slider 控件

uiSlider = this.gameObject.GetComponent<Slider>();

//世界摄像机(主摄像机)

worldcamera = Camera.main.gameObject.GetComponent<Camera>();

//带标签Tag_UICamera的UI摄像机

guiCamera = GameObject.FindGameObjectWithTag(Tag.Tag_UICamera).GetComponent<Camera>();

//参数检查

if (_TargetEnemyObj == null)

{

return;

}

}

// 计算敌人血量

void Update()

{

//判断帧数

if (Time.frameCount % 2 == 0)

{

try

{

//当前与最大生命值

_FloCurrentHP = _FloCurrentHP;  //变化的生命值(实时更新)

_FloMaxHP = _FloMaxHP;          //变化的生命值(实时更新)

//计算敌人血量

uiSlider.value = _FloCurrentHP / _FloMaxHP;

//本UI Label 对象尺寸

this.transform.localScale = new Vector3(FloHPPrefabsLength, FloHpPrefabsHeight, 0);

if (_FloCurrentHP <= (_FloMaxHP * 0.05))

{

//死亡销毁

Destroy(this.gameObject);

}

}

catch (System.Exception)

{

throw;

}

}

}

// 敌人血量计算后,实时的把_TargetEnemyObj的世界坐标转换为UI世界坐标,通过世界摄像机,转屏幕坐标,再把3D敌人(世界摄像机)屏幕坐标,转UI摄像机的屏幕坐标

void LateUpdate()

{

if (_TargetEnemyObj != null)

{

if (Time.frameCount % 2 == 0)

{

//获取目标物体的屏幕坐标

Vector3 pos = worldcamera.WorldToScreenPoint(_TargetEnemyObj.transform.position);

//将屏幕坐标转换为UI的世界坐标

pos = guiCamera.ScreenToWorldPoint(pos);

//由于NGUI 2D界面的Z轴都为0,只取其X,Y坐标

pos.z = 0;

//将修改过的坐标赋给UI界面

transform.position = new Vector3(pos.x - 0.1f, pos.y + FloHpHeightPosset, pos.z);

}

}

}

}

注:void LateUpdate()方法为摄像机转换坐标,是具体实现的过程,此方法为世界坐标和平面坐标之间的转换,可逆向操作实现

UI3D转2D平面显示UI3DTo2D血条显示的更多相关文章

  1. unity如何显示血条(不使用NGUI)

    用unity本身自带的功能,如何显示血条? 显示血条,从资源最小化的角度,只要把一个像素的色点放大成一个矩形就足够,三个不同颜色的矩形,分别显示前景色,背景色,填充色,这样会消耗最少的显存资源. un ...

  2. Unity3D人物头顶名称与血条更新与绘制

    using UnityEngine; using System.Collections; public class NPC : MonoBehaviour { //主摄像机对象 private Cam ...

  3. Unity UGUI实现分段式血条

    我们可以看到像英雄联盟等游戏里英雄头顶的血条显示并非是纯色的,而是根据血量的多少而显示一定量的格子,这种方式明显是比较友好.比较美观的,事实上我们的游戏里面也想实现这样的效果,那该怎么办呢?根据血量的 ...

  4. pygame 笔记-7 生命值/血条处理

    通常游戏中的角色都有所谓的生命值,而且头顶上会有一个血条显示.生命值无非就是一个属性而已,很容易在Player.py类中增加,头顶上的血条其实就是绘制二个矩形,叠加在一起. 以上节的Player.py ...

  5. unity3d-游戏实战突出重围,第二天 制作血条

    using UnityEngine; using System.Collections; public class xt : MonoBehaviour { //红色血条 public Texture ...

  6. 制作Unity中的单位血条

    本文章用于记录Unity的学习过程,如有疑问,欢迎交流. 1.血条的显示 在Unity场景中创建空物体,然后新建两个Image(图片),当然只用一个也行,一个作为填充来显示血量,一个作为血条的外框. ...

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

     刚好今天有朋友问我,比較典型的样例就是游戏里面人物的血条. 原理非常easy就是把3D点换算成2D的点.可是因为NGUI自身是3D所以我们须要先把NGUI下的点转成2D点.然后在把他转成3D的点 ...

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

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

  9. Unity NGUI弧形血条的制作

    unity版本:4.6 NGUI版本:3.6. (转载请注明参考链接及作者) 参考链接:http://www.cnblogs.com/louissong/p/3841656.html,作者:博客园 L ...

随机推荐

  1. 数据结构_bubble_sort

    问题描述 给定一个 1~N 的排列 P,即 1 到 N 中的每个数在 P 都只出现一次. 现在要对排列 P 进行冒泡排序,代码如下:for (int i = 1; i <= N; ++i)for ...

  2. STL源码剖析--迭代器(转)

    一.为什么需要traits编程技术 前面说了很多关于traits的光荣事迹,但是却一直没有介绍traits究竟是个什么东西,究竟是用来干什么的?traits在英文解释中就是特性,下面将会引入trait ...

  3. C++面试笔记--循环链表,队列,栈,堆

    之前已经学会了单链表的建立删除插入转置以及一些普通操作,双链表和单链表差不多,就是多了一个前驱指针,在许多操作中很方便,但是加了一个指针开销应该会大一些,总体上影响不大,这里开始讨论循环链表以及其他的 ...

  4. 序列化+fastjson和java各种数据对象相互转化

    序列化的定义 序列化就是一种用来处理对象流的机制 所谓对象流也就是将对象的内容进行流化.可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间. 序列化是将对象转换为容易传输的格式的过程 例 ...

  5. 《Head First Servlets & JSP》-6-会话管理-listener etc. demo

    工程结构 上下文参数示例 示例程序展示了如何从上下文读取参数,并在上下文监听器中生成属性对象和在上下文中设置属性. 建立一个简单的JavaBean对象作为属性:Dog.java package com ...

  6. code manager tools myeclipse10 svn插件安装及使用

    一.下载: 1.在线安装地址:http://subclipse.tigris.org/update_1.6.x 2.安装包下载地址:http://subclipse.tigris.org/servle ...

  7. 【转】php通过curl跨域向asp.net服务器上传文件及参数

    转:http://blog.sina.com.cn/s/blog_13331dce50102vq32.html 这是一个由php通过调用asp.net接口向asp.net服务器post上传文件及参数并 ...

  8. day03-Linux操作系统目录结构

    一. Linux系统目录表示        ‘/’表示根目录:                                                            ‘.’表示当前目录 ...

  9. 转载文章 MySQL与Oracle的区别

    MySQL与Oracle的区别   1.  Oracle是大型数据库而Mysql是中小型数据库,Oracle市场占有率达40%,Mysql只有20%左右,同时Mysql是开源的而Oracle价格非常高 ...

  10. loj #2026. 「JLOI / SHOI2016」成绩比较

    #2026. 「JLOI / SHOI2016」成绩比较   题目描述 THU 的 G 系中有许许多多的大牛,比如小 R 的室友 B 神.B 神已经厌倦了与其他的同学比较 GPA(Grade Poin ...