在Unity和C#中显示当前的悬停对象属性/名称

时间:2019-02-11 13:18:58

标签: c# unity3d

假设我有5个按钮,每个按钮都有不同的名称(即“红色”,“蓝色”等) 我想创建一个函数,当您将鼠标悬停在按钮上时,它将“ textToDisplay”文本属性更改为当前的悬停按钮名称。

完整示例: 您有一个显示“ Nothing”的文本,但是如果将鼠标悬停在带有“ red”名称的按钮上,该文本将自身变为“ red”。

我可以创建与按钮数量一样多的功能,并分别将每个功能与每个按钮匹配,但这不是一个好方法吗?

TL:DR: 我想获取当前的悬停对象属性。

1 个答案:

答案 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
}