Answers:
有一种更改事件的超级简单方法:
编辑
请参阅我的其他答案,以快速,轻松地为事件添加OnClick
事件。对于其他事件,OnDrag
请参见下文。
此外,如果您不仅仅需要默认提供的事件,建议EventTrigger
您将a附加到您的游戏对象上。这使我们可以访问BaseEventData
从事件返回的对象,从而告诉我们诸如创建事件的对象之类的东西。然后,您可以执行以下操作:
//Create an event delegate that will be used for creating methods that respond to events
public delegate void EventDelegate(UnityEngine.EventSystems.BaseEventData baseEvent);
然后,我们可以创建一个用于处理事件的方法,签名必须与我们的委托的签名匹配。因此,它需要返回void
并接受BaseEventData
作为其第一个也是唯一的参数:
public void DropEventMethod(UnityEngine.EventSystems.BaseEventData baseEvent) {
Debug.Log(baseEvent.selectedObject.name + " triggered an event!");
//baseEvent.selectedObject is the GameObject that triggered the event,
// so we can access its components, destroy it, or do whatever.
}
最后,要动态添加事件:
//Get the event trigger attached to the UI object
EventTrigger eventTrigger = buttonObject.GetComponent<EventTrigger>();
//Create a new entry. This entry will describe the kind of event we're looking for
// and how to respond to it
EventTrigger.Entry entry = new EventTrigger.Entry();
//This event will respond to a drop event
entry.eventID = EventTriggerType.Drop;
//Create a new trigger to hold our callback methods
entry.callback = new EventTrigger.TriggerEvent();
//Create a new UnityAction, it contains our DropEventMethod delegate to respond to events
UnityEngine.Events.UnityAction<BaseEventData> callback =
new UnityEngine.Events.UnityAction<BaseEventData>(DropEventMethod);
//Add our callback to the listeners
entry.callback.AddListener(callback);
//Add the EventTrigger entry to the event trigger component
eventTrigger.delegates.Add(entry);
如果您使用的是5.3.3或更高版本,请使用此行而不是上面的最后一行,代表已弃用:
eventTrigger.triggers.Add(entry);
这个词是delegate{}
我在上一个答案中找到的语法已过时,还有另一种使用lambda表示法的方法:
void buttonSetup(Button button) {
//Remove the existing events
button.onClick.RemoveAllListeners();
//Add your new event using lambda notation
button.onClick.AddListener (handleButton);
}
void handleButton() {
Debug.Log("Button pressed!");
}
或者,您可以传递按钮使事情变得更加动态:
void buttonSetup(Button button) {
button.onClick.RemoveAllListeners();
//Add your new event
button.onClick.AddListener(() => handleButton(button));
}
void handleButton(Button b) {
Debug.Log("Button '" + b.name + "' pressed!");
}
OnClick
事件。为了动态添加其他事件,您需要按照我的其他答案中的说明进行操作。
根据以下内容创建一个新脚本:
public class EventHandler : MonoBehaviour, IPointerClickHandler
{
public void OnPointerClick(PointerEventData eventData)
{
Debug.Log("Element: " +
eventData.selectedObject.name +
" was clicked at " +
eventData.position.ToString());
}
}
该脚本在IPointerClickHandler接口中实现(在许多其他可用接口中)。只需将此脚本附加到UI元素,即可使该脚本拦截点击事件(或实现接口的任何事件)。
下一步是简单地将此脚本作为组件动态添加到所需的UI元素:
myButton.AddComponent<EventHandler>();
这会将脚本作为一个组件添加到其中myButton
,并且下次单击该按钮时,将获得有关单击哪个按钮以及单击发生位置的信息。
与我的其他答案相比,这提供了有关事件的最多信息。
统一如何实现UI就像其他任何统一组件一样。您添加GameObject并将UI组件附加到它。获得游戏对象后,您可以从中获取UI组件并更改属性。
UI的API参考可以在UnityEngine.UI命名空间下找到,BUtton的API参考是http://docs.unity3d.com/ScriptReference/UI.Button.html
有关 从C#脚本访问UI的更多信息,请参见http://blog.trsquarelab.com/2015/03/new-ui-implementation-using-c-scripts.html。