用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秒可能有點長,這個時間是可以自己去設定的。