今天介绍Unity3D使用OnGUI()的方法来实现伤害数值的显示,在战斗系统中我们常用于敌人和我方的伤害显示,在后面做敌人AI的时候会用到。下面我们看脚本!
首先我们创建一个Damage的脚本。好的,我们打好代码后,在场景中新建一个空的游戏对象,并且命名为Damage,把脚本绑定在这个对象上,并且把它作为预设体。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Damage : MonoBehaviour
{
//目标位置
private Vector3 mTarget;
//屏幕坐标
private Vector3 mScreen;
//伤害数值
public int Value;
//文本宽度
public float ContentWidth = 100f;
//文本高度
public float ContentHeight = 3f;
//文本偏移速度
public float ContentSpeed = 10.0f;
//GUI坐标
private Vector2 mPoint;
//销毁时间
public float FreeTime = 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 * ContentSpeed * 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.color = Color.red;
GUI.skin.label.fontSize = 25;
//内部使用GUI坐标进行绘制
GUI.Label(new Rect(mPoint.x, mPoint.y, ContentWidth, ContentHeight), Value.ToString());
}
}
IEnumerator Free()
{
yield return new WaitForSeconds(FreeTime);
Destroy(this.gameObject);
}
}
下面我们为敌人写一个脚本Enemy,并且把脚本绑定在敌人上。把刚才做好的Damage预设体拖拽到脚本面板中。这里需要注意的是要为敌人添加一个碰撞器作为碰撞检测,并且勾选Is Trigger。
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Enemy : MonoBehaviour
{
public GameObject PopupDamage;
void OnTriggerEnter(Collider mCollider)
{
if (mCollider.gameObject.name=="Player")
{
GameObject mObject = (GameObject)Instantiate(PopupDamage, transform.position, Quaternion.identity);
mObject.GetComponent<Damage>().Value = Random.Range(20, 40);
}
}
}
我们下面来看效果,这里还有一个问题,就是当“主角”进入碰撞范围才显示一次伤害值,想要再显示必须离开敌人再靠近敌人。这里介绍主要显示伤害值效果而已,在后面做敌人AI的时候,我会完善敌人Enemy脚本,再此脚本中传入伤害值。
(脚本来自秦元培博客)