版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/CJB_King/article/details/52876863
UGUI实现伤害数值显示的原理是在人物头顶放置空物体,然后将下面的脚本挂在空物体上,将该空物体制作为预制体;
代码语言:javascript复制using UnityEngine;
using System.Collections;
public class PopupDamage : MonoBehaviour {
//目标位置
private Vector3 mTarget;
//屏幕坐标
private Vector3 mScreen;
//伤害数值
public int Value;
//文本宽度
public float ContentWidth = 100;
//文本高度
public float ContentHeight = 50;
//GUI坐标
private Vector2 mPoint;
//销毁时间
public float FreeTime = 1.5F;
void Start()
{
//获取目标位置
mTarget = transform.position;
//获取屏幕坐标
mScreen = Camera.main.WorldToScreenPoint(mTarget);
//将屏幕坐标转化为GUI坐标
mPoint = new Vector2(mScreen.x, Screen.height - mScreen.y);
//开启自动销毁线程
StartCoroutine("Free");
}
void Update()
{
//使文本在垂直方向山产生一个偏移
transform.Translate(Vector3.up * 1.5F * Time.deltaTime);
//重新计算坐标
mTarget = transform.position;
//获取屏幕坐标
mScreen = Camera.main.WorldToScreenPoint(mTarget);
//将屏幕坐标转化为GUI坐标
mPoint = new Vector2(mScreen.x, Screen.height - mScreen.y);
}
void OnGUI()
{
//保证目标在摄像机前方
if (mScreen.z > 0)
{
//内部使用GUI坐标进行绘制
GUIStyle style = new GUIStyle();
style.fontSize = 30;
style.normal.textColor = Color.red;
GUI.Label(new Rect(mPoint.x, mPoint.y, ContentWidth, ContentHeight), "-" Value.ToString(),style);
}
}
IEnumerator Free()
{
yield return new WaitForSeconds(FreeTime);
Destroy(this.gameObject);
}
}
unity中的几种坐标体系:
1、根据Transform组件获取位置坐标,将此坐标转化为屏幕坐标及GUI坐标。 2、Unity3D中常见的四种坐标系: a、世界坐标:场景中物体的坐标,使用 transform.position获得。 b、屏幕坐标:以像素来定义的,以屏幕的左下角为(0,0)点,右上角为(Screen.width,Screen.height),Z的位置是以相机的世界单位来衡量的。如Input.mousePosition即为屏幕坐标。
c、视口坐标:视口坐标是标准的和相对于相机的。相机的左下角为(0,0)点,右上角为(1,1)点,Z的位置是以相机的世界单位来衡量的。 d、GUI坐标:该坐标系以屏幕的左上角为(0,0)点,右下角为(Screen.width,Screen.height)。 3、在代码中我们将世界坐标先转化为屏幕坐标,再转化为GUI坐标
在人物受到伤害是,生成该预制体,方法如下:
代码语言:javascript复制 GameObject damageGo = Instantiate(popupDamageGo,transform.position new Vector3(0,10,0),Quaternion.identity) as GameObject;
damageGo.GetComponent<PopupDamage>().Value = (int)damage;