1. 程式人生 > >用UGUI做一個滑鼠懸停事件

用UGUI做一個滑鼠懸停事件

以下文章整理的不對。還請見諒。


在遊戲中經常會有物品屬性的檢視,這些實現往往都是當滑鼠移動到該物體上時彈出一個屬性框,簡單的做法是做一個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秒可能有點長,這個時間是可以自己去設定的。