假设我有5个按钮,每个按钮都有不同的名称(即“红色”,“蓝色”等) 我想创建一个函数,当您将鼠标悬停在按钮上时,它将“ textToDisplay”文本属性更改为当前的悬停按钮名称。
完整示例: 您有一个显示“ Nothing”的文本,但是如果将鼠标悬停在带有“ red”名称的按钮上,该文本将自身变为“ red”。
我可以创建与按钮数量一样多的功能,并分别将每个功能与每个按钮匹配,但这不是一个好方法吗?
TL:DR: 我想获取当前的悬停对象属性。
答案 0 :(得分:0)
您可以使用IPointerEnterHandler
并将此组件添加到与GameObject
组件连接的同一Button
上。
public class Example : MonoBehaviour, IPointerEnterHandler
{
public void OnPointerEnter(PointerEventData pointerEventData)
{
// passing in "this" as context additionally allows to
// click on the log to highlight the object where it came from
Debug.Log("Currently hovering " + name, this);
}
}
确保场景中存在
EventSystem
,以允许指针检测。对于非UI GameObjects上的指针检测,请确保将PhysicsRaycaster
附加到Camera
。
您可以添加例如UnityEvent<string>
以便添加回调
[System.Serializable]
public class StringEvent : UnityEvent<string>
{
}
public class Example : MonoBehaviour, IPointerEnterHandler
{
public StringEvent OnHover;
public void OnPointerEnter(PointerEventData pointerEventData)
{
// passing in "this" as context additionally allows to
// click on the log to highlight the object where it came from
Debug.Log("Currently hovering " + name, this);
}
}
,而不是在检查器中引用回调方法(例如使用onClick
),但请注意,这些方法必须以string
作为参数。
或者在目标组件中,您可以将回调添加到每个此类事件中,例如
private void Start()
{
var buttons = FindObjectsOfType<Example>();
foreach(var button in buttons)
{
// it is allways save to remove listeners even if
// they are not there yet
// this makes sure that they are only added once
button.OnHover.RemoveListener(OnButtonHovered);
button.OnHover.AddListener(OnButtonHovered);
}
}
private void OnButtonHovered(string buttonName)
{
// do something with the buttonName
}