【NGUI】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;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zok93

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值