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