重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章给大家介绍Unity3D中怎么实现Button面板事件绑定功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
创新互联建站坚持“要么做到,要么别承诺”的工作理念,服务领域包括:网站制作、成都网站设计、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的谷城网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!using System; using System.Collections; using UnityEngine.Events; using UnityEngine.EventSystems; using UnityEngine.Serialization; namespace UnityEngine.UI { // Button that's meant to work with mouse or touch-based devices. [AddComponentMenu("UI/Button", 30)] public class Button : Selectable, IPointerClickHandler, ISubmitHandler { [Serializable] ////// Function definition for a button click event. /// public class ButtonClickedEvent : UnityEvent {} // Event delegates triggered on click. [FormerlySerializedAs("onClick")] [SerializeField] private ButtonClickedEvent m_OnClick = new ButtonClickedEvent(); protected Button() {} ////// UnityEvent that is triggered when the button is pressed. /// Note: Triggered on MouseUp after MouseDown on the same object. /// ////// public ButtonClickedEvent onClick { get { return m_OnClick; } set { m_OnClick = value; } } private void Press() { if (!IsActive() || !IsInteractable()) return; UISystemProfilerApi.AddMarker("Button.onClick", this); m_OnClick.Invoke(); } ////// using UnityEngine; /// using UnityEngine.UI; /// using System.Collections; /// /// public class ClickExample : MonoBehaviour /// { /// public Button yourButton; /// /// void Start() /// { /// Button btn = yourButton.GetComponent
////// Call all registered IPointerClickHandlers. /// Register button presses using the IPointerClickHandler. You can also use it to tell what type of click happened (left, right etc.). /// Make sure your Scene has an EventSystem. /// /// Pointer Data associated with the event. Typically by the event system. ////// public virtual void OnPointerClick(PointerEventData eventData) { if (eventData.button != PointerEventData.InputButton.Left) return; Press(); } ////// //Attatch this script to a Button GameObject /// using UnityEngine; /// using UnityEngine.EventSystems; /// /// public class Example : MonoBehaviour, IPointerClickHandler /// { /// //Detect if a click occurs /// public void OnPointerClick(PointerEventData pointerEventData) /// { /// //Use this to tell when the user right-clicks on the Button /// if (pointerEventData.button == PointerEventData.InputButton.Right) /// { /// //Output to console the clicked GameObject's name and the following message. You can replace this with your own actions for when clicking the GameObject. /// Debug.Log(name + " Game Object Right Clicked!"); /// } /// /// //Use this to tell when the user left-clicks on the Button /// if (pointerEventData.button == PointerEventData.InputButton.Left) /// { /// Debug.Log(name + " Game Object Left Clicked!"); /// } /// } /// } ///
////// Call all registered ISubmitHandler. /// /// Associated data with the event. Typically by the event system. ////// This detects when a Button has been selected via a "submit" key you specify (default is the return key). /// /// To change the submit key, either: /// /// 1. Go to Edit->Project Settings->Input. /// /// 2. Next, expand the Axes section and go to the Submit section if it exists. /// /// 3. If Submit doesn't exist, add 1 number to the Size field. This creates a new section at the bottom. Expand the new section and change the Name field to “Submit”. /// /// 4. Change the Positive Button field to the key you want (e.g. space). /// /// /// Or: /// /// 1. Go to your EventSystem in your Project /// /// 2. Go to the Inspector window and change the Submit Button field to one of the sections in the Input Manager (e.g. "Submit"), or create your own by naming it what you like, then following the next few steps. /// /// 3. Go to Edit->Project Settings->Input to get to the Input Manager. /// /// 4. Expand the Axes section in the Inspector window. Add 1 to the number in the Size field. This creates a new section at the bottom. /// /// 5. Expand the new section and name it the same as the name you inserted in the Submit Button field in the EventSystem. Set the Positive Button field to the key you want (e.g. space) /// public virtual void OnSubmit(BaseEventData eventData) { Press(); // if we get set disabled during the press // don't run the coroutine. if (!IsActive() || !IsInteractable()) return; DoStateTransition(SelectionState.Pressed, false); StartCoroutine(OnFinishSubmit()); } private IEnumerator OnFinishSubmit() { var fadeTime = colors.fadeDuration; var elapsedTime = 0f; while (elapsedTime < fadeTime) { elapsedTime += Time.unscaledDeltaTime; yield return null; } DoStateTransition(currentSelectionState, false); } } }
代码其实挺简单的,主要是自己new 一个新的unityEvent,然后我们在外界调用。这个UnityEvent通过序列化显示在面板上。我们可以通过两种方式绑定事件。第一种就是在面板绑定,第二种就是AddListener添加事件。于是我们可以照猫画虎择取我们自己需要的部份写我们自己需要的事件绑定。代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using UnityEngine.EventSystems; using UnityEngine.Serialization; using System; namespace MyEvent { public class MyCompotent : MonoBehaviour { [Serializable] public class MyCompontentEvent:UnityEvent{ } [FormerlySerializedAs("MyEvent")] [SerializeField] private MyCompontentEvent myEvent = new MyCompontentEvent(); public MyCompontentEvent MyEvent { get { return myEvent; }set { myEvent = value; } } //执行绑定的事件 public void ExcuteEvent() { MyEvent.Invoke(); } } }
我们将脚本挂到空物体上,效果如下:
使用方法如下例子:
我们自己写一个步骤设置器,代码如下:
namespace MyEvent { public class StepControl : MyCompotent { public string Name; public int Index; private void Start() { //设置名字 //设置Index //去做每一步应该设置得事情 ExcuteEvent(); } } }
我们在StepControl里设置相同的操作。不同的操作通过面板绑定让ExcuteEvent()去执行。使用unity自带的消息事件会让我们开发轻松很多。如果不使用UnityEvent,我们也可以在StepControl声明一个我们自己的委托,但是去调用小的操作的时候会需要多写一点代码。比如 我们想让某个物体隐藏,需要单独写一个脚本设置物体隐藏并且将函数绑定到此StepControl的委托上。而在UnityEvent里可以直接通过面板操作实现。
关于Unity3D中怎么实现Button面板事件绑定功能就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。