用UGUI做一个鼠标悬停事件

来源:互联网 发布:yy踢人软件 编辑:程序博客网 时间:2024/06/05 00:16

Hello,我是KitStar。

以下文章整理的不对。还请见谅。



在游戏中经常会有物品属性的查看,这些实现往往都是当鼠标移动到该物体上时弹出一个属性框,简单的做法是做一个UI框,将它的Active设置成false,就是不让它显示,只有当鼠标移动到这个物体上时,才会让它显示,这样的话,可以考虑OnMouseEnter()方法、OnMouseExit()方法的组合,或者也可以用接口即IPointerEnterHandler和IPointerExitHandler,今天用接口做的,也不知道为什么用OnMouseEnter()方法没反应,也就用了接口,而且习惯用接口,好了,下面就贴上代码:

using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
using System;
using UnityEngine.UI;

public class PopPropertyGridWhenMouseOver : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{

   public GameObject obj;

   public void OnPointerEnter(PointerEventData eventData)
    {
    obj.SetActive(true);
   }

   public void OnPointerExit(PointerEventData eventData)

    {
     obj.SetActive(false);
    }
}

obj 即是属性框,将这个脚本拖到相应的物体上,然后把属性框拖到脚本的GameObject里面就可以了;

上面的是比较简单的,还有一种稍微复杂一点的是,当鼠标悬停在物体上时,让它等一段时间再弹出属性框,这养的话需要做一个时间判断,先上代码:

 

using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
using System;
using UnityEngine.UI;

public class PopPropertyGridWhenMouseOver : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
  public GameObject obj;
  private bool _isEnter;
  private float _timer;

  void Update()
  {

    _timer += Time.deltaTime;


    if (_isEnter && _timer - 1.0f > 0f)
    {
      obj.SetActive(true);
    }
  }
  public void OnPointerEnter(PointerEventData eventData)
  {
    _timer = 0;
    _isEnter = true;
  }

  public void OnPointerExit(PointerEventData eventData)
  {
    _isEnter = false;
    obj.SetActive(false);
  }
}

上面的这段代码是当鼠标悬停在无统一上时,过一秒钟再弹出属性框。

下面对这段代码做一个解释:

首先使用了两个接口IPointerEnterHandler和IPointerExitHandler,用以处理当鼠标进入物体和离开物体时所出发的事件,同时有一个计时器 _timer,还有一个判断鼠标是否进入物体的bool变量_isEnter;

在Update中让计时器开始累加,并做了一个判断,这个判断是处理属性框弹出的,表示的是当鼠标进入物体并停留一秒后让属性框弹出来;

OnPointerEnter方法是实现接口IPointerEnterHandler的,它表示的是每次当鼠标进入物体之后都将计时器重置为0,并将_isEnter赋值为true;

OnPointerExit方法是实现接口IPointerExitHandler的,他表示的是每次当鼠标离开物体时,将_isEnter赋值为false,并将属性框隐藏。

如上面的,每次鼠标进入物体后都会将计时器重置为0,然后开始累加,当计时器的值大于1的时候,属性框就会弹出,如果在计时器还未累加到1的时候鼠标就移出了物体,那么计时器也会继续累加,但是即使它超过1,也不会弹出属性框,只有当鼠标在物体中连续待过1秒,才会弹出属性框,当然,1秒可能有点长,这个时间是可以自己去设置的。

1 0