您的位置:首页 > 产品设计 > UI/UE

【NGUI】NGUI血条制作,当人物移出屏幕后不显示血条,优化代码

2015-06-30 00:25 501 查看
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: