在游戏中经常会有物品属性的查看,这些实现往往都是当鼠标移动到该物体上时弹出一个属性框,简单的做法是做一个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秒可能有点长,这个时间是可以自己去设置的。