unity3d实现动态显示伤害值

  今天介绍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脚本,再此脚本中传入伤害值。


     (脚本来自秦元培博客)

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值