美文网首页
Unity3D游戏开发之伤害数值显示

Unity3D游戏开发之伤害数值显示

作者: 胤醚貔貅 | 来源:发表于2017-07-07 19:02 被阅读302次

    using UnityEngine;

    using System.Collections;

    public class DamagePopup : 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 * 0.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坐标进行绘制

    GUI.Label(new Rect(mPoint.x,mPoint.y,ContentWidth,ContentHeight),Value.ToString());

    }

    }

    IEnumerator Free()

    {

    yield return new WaitForSeconds(FreeTime);

    Destroy(this.gameObject);

    }

    }

    在上面的代码中我们需要把握下面几点:

    1、根据Transform组件获取位置坐标,将此坐标转化为屏幕坐标及GUI坐标。

    2、常见的四种坐标系:

    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坐标

    好了,下面我们将这个脚本绑定在一个空的游戏体上,并制作成预设,在下面的示例中,我们将使用这个预设。

    如图,我们希望实现当角色攻击红色的胶囊体时,在游戏场景中显示玩家对胶囊体造成的伤害值。具体怎么做呢?我们可以先给模型和胶囊体加上碰撞器,并勾选IsTrigger使其成为一个触发器。我们分别将他们的tag设为Player和Enemy。接下来,为Enemy编写一个脚本:[csharp] view plaincopyprint?using UnityEngine;  using System.Collections;    public class Enemy : MonoBehaviour {        public GameObject PopupDamage;        void OnTriggerEnter(Collider mCollider)      {          if(mCollider.gameObject.tag=="Player")          {              //克隆伤害弹出组件              GameObject mObject=(GameObject)Instantiate(PopupDamage,transform.position,Quaternion.identity);              mObject.GetComponent().Value=Random.Range(20,40);

    }

    }

    }

    这里我们设定玩家对敌人造成的伤害值为20到40,运行程序,我们会得到下面的结果:

    由于这里使用的是非精确碰撞,所以导致程序一开始角色就和胶囊体发生了碰撞,而OnTrigger()方法由于只能在碰撞开始的时候捕捉碰撞,所以这里只显示了一次伤害值。理论上只有当玩家攻击胶囊体,才会触发伤害值的显示,不过这个问题再这里我们可以先不追究,因为我们关注的是伤害数值的显示。到目前为止,这个问题已经圆满的解决了。

    有朋友可能会问:为什么人家的游戏里显示的伤害效果看起来那么眩目,而你的程序却只能显示普普通通的文字呢?对于这个问题,我们这里给出两种思路,留给大家自己去探究啊。第一种方法是在项目中创建一个GUISkin,然后在DamagePopup脚本中添加一个GUIStyle类型的成员变量mStyle,通过该变量我们可以引用到在项目中创建的GUISkin。这样,我们就可以定义整体的GUI样式。此时,我们将OnGUI中的方法修改为:

    GUI.Label(new Rect(mPoint.x,mPoint.y,ContentWidth,ContentHeight),Value.ToString(),mStyle);

    这样我们就可以实现自定义的文字效果了。第二种方法是使用贴图,即首先准备0-9的数字图片,然后我们将Value各个数位上的数字分别截取出来,根据截取的结果来绘制贴图,这样同样可以实现自定义的效果。好了,今天的内容就是这样了.

    相关文章

      网友评论

          本文标题: Unity3D游戏开发之伤害数值显示

          本文链接:https://www.haomeiwen.com/subject/jvsrhxtx.html