NGUI血条制作,当人物不移除屏幕后不现实血条,优化代码

using UnityEngine;
using System.Collections;
/// <summary>
/// 脚本功能:NGUI血条实现
/// 知识要点:NGUI,3D坐标到2D坐标的转换
/// 创建时间:2015年6月29日
/// 添加对象:添加到玩家身上
/// </summary>
public class HP_2 : MonoBehaviour
{
	// 玩家
	Transform Player;
	// 血条的UI
	public Transform Hp_UI;
	// 人物头顶空物体(用于固定血条位置,这个空物体是人物的子物体)
	Transform Head;
	// 主摄像机与血条之间的距离
	float Distance;
	// 血条UI是否可见(当人物移动到屏幕外方的时候为不可见)
	bool uiIsCanSee = true;

	// 当挂载这个脚本的物体在场景里可以看见的时候
	void OnBecameVisible ()
	{
		uiIsCanSee = true;
	}
	// 当挂载这个脚本的物体在场景里看不见的时候
	void OnBecameInvisible ()
	{
		uiIsCanSee = false;
	}

	void Start ()
	{
		// 获取挂载这个脚本的玩家的Transform
		Player = gameObject.transform.GetComponent<Transform> ();
		// 找到玩家自身头顶的空物体
		Head = Player.Find ("target");
		// 计算头顶空物体与主摄像机之间距离
		Distance = Vector3.Distance (Head.position, Camera.main.transform.position);
	}

	void Update ()
	{
		// 如果玩家在摄像机的视线内,就显示血条
		if (uiIsCanSee) {
			Hp_UI.gameObject.SetActive (true);
		} else {
			Hp_UI.gameObject.SetActive (false);
		}
		// 计算缩放比例
		float newDistance = Distance / Vector3.Distance (Head.position, Camera.main.transform.position);
		// 血条UI的坐标,由人物头顶的空物体坐标换算而来
		Hp_UI.position = WorldPointToUiPoint (Head.position);
		// 血条UI的缩放
		Hp_UI.localScale = Vector3.one * newDistance;

		if (Input.GetKey (KeyCode.W)) {
			gameObject.transform.Translate (Vector3.forward);
		}
		if (Input.GetKey (KeyCode.A)) {
			gameObject.transform.Translate (Vector3.left);
		}
		if (Input.GetKey (KeyCode.S)) {
			gameObject.transform.Translate (Vector3.back);
		}
		if (Input.GetKey (KeyCode.D)) {
			gameObject.transform.Translate (Vector3.right);
		}

	}

	// 主摄像机中物体的3D坐标--->UI摄像机的3D坐标
	public static Vector3 WorldPointToUiPoint (Vector3 point)
	{
		// 主摄像机中物体的3D坐标转换到主摄像机的2D坐标
		Vector3 main_point_2d = Camera.main.WorldToScreenPoint (point);
		// 主摄像机中物体的2D坐标转换到UI摄像机的3D坐标
		Vector3 ui_point_3d = UICamera.mainCamera.ScreenToWorldPoint (main_point_2d);
		// UI上的物体坐标不涉及Z轴,所以要设为0
		ui_point_3d.z = 0;
		return ui_point_3d;
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 23:23:28

NGUI血条制作,当人物不移除屏幕后不现实血条,优化代码的相关文章

unity3d学习笔记(十九)--ngui制作3d人物头顶的头像和血条

原地址:http://blog.csdn.net/lzhq1982/article/details/18793479 本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢. http://blog.csdn.net/lzhq1982/article/details/18793479 先上张图,自己做的一个demo. 这里的人物头像和血条是在3d世界生成的,所以有真正的纵深感和遮挡关系,废话不多说,看我是怎么实现的. 第一步,先在UI Root里制作头像和血条. 这个制作步骤基

Unity 3D 进度条制作

我们都知道玩游戏时,第一步要加载游戏,加载游戏时我们可以做一个简单的进度条来显示游戏加载进度,应为有了进度条,游戏画面不会过于呆板. 那么我们就开始游戏的进度条制作吧! 方法一: 1,使用NGUI制作,首先将NGUI插件导入到Unity 工程中. 导入后: 2,创建UI 3,在Panel下添加slider. 此处label是为了显示游戏进度. 5,脚本Procebar.cs,将此脚本添加到slider上. using UnityEngine; using System.Collections;

多种类型的导航条制作【css3,jquery】

导航条的使用很广,每个网站都会做出具有自己特色的导航条.最近特地去了解了各种类型的导航条,比如具有高亮显示的导航条,中英文互相切换的导航条,具有弹性动画的导航条,甚至是具有摩擦运动动画的导航条(文字下面有横线)等.每种导航条都有自己的特色,比如高亮显示的导航条看起来比较简单,但是视觉效果还不错,具有动画效果的导航条在视觉上也是有很好的效果. 接下来将会一一介绍4种应用比较广的导航条,即:高亮显示的导航条,中英文互相切换的导航条,具有弹性动画的导航条,具有摩擦运动动画的导航条. 1.高亮显示的导航

[NGUI]NGUI图集Atlas制作

1,在PS里面设计好要做的UI,然后切片成很多个png的图片(这属于美工的活啦,所以会描述的的比较简单点哈)2,在Unity中 Project下新建一个Folder,F2重命名为ResUI,以后就用来存放所有的UI,在ResUI里面重新新建一个Folder,我们这次以开始界面为例,因此F2重命名这个Folder为StartUI,这个StartUI用来存储关于开始界面的所有资源.[NGUI]NGUI图集Atlas制作简介" border="0" alt="转载 [NG

NGUI研究之制作转圈的技能CD特效

 昨天想做一个技能CD转圈的特效,花了大把的时间去用meshRender组件想通过三角形依据数学算法来绘制一个圆形的网格.通过动态绘制圆形网格的方法来实现技能CD特效.奶奶的昨天我研究了一晚上,最终做出来了.但是今天突然发现NGUI已经实现这个功能了,,真是坑爹啊啊---,在技能图标上面放个半透明的精灵,用来做技能冷却的特效,例如以下图所看到的,我就用NGUI中的图标来带取代.对事件方法不明确的看NGUI研究之三种方式监听NGUI的事件方法 然后改动一下特效的精灵类型,它是在技能图标上面悬浮

Unity基础 NGUI 图集Atlas制作

unity版本:4.5 NGUI版本:3.6.5 1.选择要制作的图片放到对应目录下,在Asset下新建一个文件夹Picture用于放置图片: 2.选中一张图片,打开Atlas Maker: 3.单击窗口中的Create按钮,选择一个路径保存,在这里我们新建一个文件夹Prefabs用于保存生成的文件,可以看到Prefabs文件夹下生成了对应的3个文件: 如果还需要创建其他的Atlas则重复2.3步骤: 4.用NGUI依次创建: 在Panel下新建一个Button来测试: 搜索simple but

9.6智力题(一)——给定两条绳子,每条绳子燃烧殆尽正好用一个小时,用这两条绳子准确计时15分钟

题目:给定两条绳子,每条绳子燃烧殆尽正好用一个小时,用这两条绳子准确计时15分钟. 注意:这些绳子密度不均匀,因此燃烧掉半截绳子不一定正好用时半个小时. 解答: 1)点燃绳子1一头的同一时候.将绳子2的两头点燃. 2)绳子2燃烧完时,正好过去30分钟. 3)将绳子1的另外一头点燃.開始计时. 4)15分钟后,绳子1燃烧完成.

MySQL 分组后,统计记录条数

分组后,统计记录条数: SELECT num,count(*) AS counts from test_a GROUP BY num; 查询结果如下: 对num去重后的数量的统计: SELECT count(t.counts) FROM ( SELECT num,count(*) AS counts from test_a GROUP BY num ) AS t; SELECT count(DISTINCT num) AS count FROM test_a; 它俩结果一样,都是5:只是一个是子

MSSQL&mdash;按照某一列分组后取前N条记录

以前在开发的时候遇到过一个需求,就是要按照某一列进行分组后取前几条数据,今天又有同事碰到了,帮解决了之后顺便写一篇博客记录一下. 首先先建一个基础数据表,代码如下: IF OBJECT_ID(N'Test') IS NOT NULL    BEGIN        DROP TABLE Test    END CREATE TABLE Test(ID bigint IDENTITY(1,1),Name nvarchar(50),Department nvarchar(50)) INSERT IN