当前位置: 首页 > news >正文

网页转向功能网站网站设计优化

网页转向功能网站,网站设计优化,主页页面,网站维护的工作内容Unity UI Button 事件优先级调整技术方案 在 Unity 项目开发过程中,针对 UI Button 的事件执行顺序控制是一个常见需求。本文详细阐述两种将新添加事件置于第一个执行位置的方法,旨在为开发者提供全面且专业的技术参考。 一、基于反射机制的事件插入方…

Unity UI Button 事件优先级调整技术方案

在 Unity 项目开发过程中,针对 UI Button 的事件执行顺序控制是一个常见需求。本文详细阐述两种将新添加事件置于第一个执行位置的方法,旨在为开发者提供全面且专业的技术参考。

一、基于反射机制的事件插入方法

(一)核心函数:InsertClickListenerAtStart

以下函数实现了将指定的 UnityAction 插入到 ButtononClick 事件列表头部,确保其在其他已有事件之前执行。

private void InsertClickListenerAtStart(Button button, UnityAction action)
{// 1. 事件去重处理var onClick = button.onClick;onClick.RemoveListener(action);  // 确保不会重复添加// 2. 反射获取 m_Calls 字段var field = typeof(UnityEventBase).GetField("m_Calls", BindingFlags.NonPublic | BindingFlags.Instance);if (field!= null){var invokableCallList = field.GetValue(onClick);if (invokableCallList!= null){// 3. 获取 m_RuntimeCalls 字段var runtimeCallsField = invokableCallList.GetType().GetField("m_RuntimeCalls", BindingFlags.NonPublic | BindingFlags.Instance);if (runtimeCallsField!= null){// 4. 创建新的 InvokableCallvar invokableCallType = typeof(UnityEvent).Assembly.GetType("UnityEngine.Events.InvokableCall");if (invokableCallType!= null){var constructor = invokableCallType.GetConstructor(new[] { typeof(UnityAction) });if (constructor!= null){var newCall = constructor.Invoke(new object[] { action });// 5. 获取 Insert 方法并插入新事件var runtimeCalls = runtimeCallsField.GetValue(invokableCallList);var insertMethod = runtimeCalls.GetType().GetMethod("Insert");if (insertMethod!= null){insertMethod.Invoke(runtimeCalls, new object[] { 0, newCall });// 6. 设置 m_NeedsUpdate 为 truevar needsUpdateField = invokableCallList.GetType().GetField("m_NeedsUpdate", BindingFlags.NonPublic | BindingFlags.Instance);if (needsUpdateField!= null){needsUpdateField.SetValue(invokableCallList, true);}}}}}}}
}

此方法通过反射深入到 UnityEventBaseButton 的内部实现机制,精准地操作事件调用列表。其核心步骤包括:

  • 首先,对目标事件进行去重操作,避免同一事件多次添加导致的逻辑混乱。
  • 接着,利用反射获取 m_Calls 字段,该字段存储了事件的可调用列表信息。在确保获取成功后,进一步获取 m_RuntimeCalls 字段,这是实际存储运行时事件调用信息的关键结构。
  • 随后,根据 UnityEvent 程序集动态获取 InvokableCall 类型,并创建一个新的实例,该实例包装了我们要插入的 action
  • 最后,获取 m_RuntimeCalls 列表的 Insert 方法,将新创建的 InvokableCall 实例插入到列表头部(索引为 0),并设置 m_NeedsUpdate 标志为 true,以确保事件系统在后续处理中能够正确更新状态。

二、基于脚本代理的事件暂存与插入方法

(一)核心脚本:OneTimeButtonEventInsertor

通过创建 OneTimeButtonEventInsertor 脚本,实现了一种更为直观的事件顺序控制方式。

public class OneTimeButtonEventInsertor : MonoBehaviour, IPointerClickHandler
{private Button button;// 自定义事件,用于在 EventTrigger 之前调用public UnityEvent BeforeOnClick = new UnityEvent();public Button.ButtonClickedEvent OnClick;private void Awake(){button = GetComponent<Button>();OnClick = button.onClick;button.onClick = new Button.ButtonClickedEvent();}public void OnPointerClick(PointerEventData eventData){// 先执行 BeforeOnClick 事件BeforeOnClick?.Invoke();button.onClick = OnClick;button.onClick.Invoke();Destroy(this);}
}

该脚本的工作原理如下:

  • Awake 方法中,获取目标 Button 组件,并备份其原始的 onClick 事件到 OnClick 变量。同时,将 ButtononClick 事件替换为一个新的空事件,以便后续插入自定义事件。
  • 当用户点击按钮时,OnPointerClick 方法被触发。首先,执行自定义的 BeforeOnClick 事件,这是我们希望优先执行的事件。
  • 接着,将 ButtononClick 事件恢复为原始备份的事件,并立即触发该事件,从而保证了自定义事件在原始事件之前执行。
  • 最后,销毁 OneTimeButtonEventInsertor 脚本实例,避免对后续事件处理产生不必要的干扰。

综上所述,这两种方法分别从底层反射和高层脚本代理的角度,为 Unity UI Button 事件优先级控制提供了有效的解决方案。开发者可根据项目的具体需求、性能要求以及代码维护性等因素,灵活选择合适的方法来实现按钮事件的精准排序。


文章转载自:
http://festoon.c7493.cn
http://richwin.c7493.cn
http://virogenic.c7493.cn
http://expectant.c7493.cn
http://frostiness.c7493.cn
http://vicinage.c7493.cn
http://polynuclear.c7493.cn
http://plumelet.c7493.cn
http://popcorn.c7493.cn
http://lubra.c7493.cn
http://impaint.c7493.cn
http://eustace.c7493.cn
http://domiciliation.c7493.cn
http://minever.c7493.cn
http://sparingly.c7493.cn
http://caviler.c7493.cn
http://satellite.c7493.cn
http://intervention.c7493.cn
http://goldleaf.c7493.cn
http://johannisberger.c7493.cn
http://limites.c7493.cn
http://cyclohexylamine.c7493.cn
http://sentimentality.c7493.cn
http://vindicate.c7493.cn
http://decarbonate.c7493.cn
http://iupap.c7493.cn
http://craniometrical.c7493.cn
http://rutile.c7493.cn
http://euryphagous.c7493.cn
http://decimalize.c7493.cn
http://autograft.c7493.cn
http://slumber.c7493.cn
http://hematuresis.c7493.cn
http://perfidy.c7493.cn
http://wayzgoose.c7493.cn
http://lares.c7493.cn
http://weigela.c7493.cn
http://dachshund.c7493.cn
http://trampolin.c7493.cn
http://divisional.c7493.cn
http://cryopump.c7493.cn
http://actuator.c7493.cn
http://procathedral.c7493.cn
http://geomagnetic.c7493.cn
http://sulfonal.c7493.cn
http://dominie.c7493.cn
http://heavenliness.c7493.cn
http://radiolabel.c7493.cn
http://prolamin.c7493.cn
http://vasculotoxic.c7493.cn
http://riband.c7493.cn
http://retranslate.c7493.cn
http://obstetric.c7493.cn
http://psychoeducational.c7493.cn
http://altisonant.c7493.cn
http://ethnobiology.c7493.cn
http://infantilism.c7493.cn
http://narcissus.c7493.cn
http://autoff.c7493.cn
http://kendoist.c7493.cn
http://ana.c7493.cn
http://crankiness.c7493.cn
http://succulent.c7493.cn
http://piezocrystallization.c7493.cn
http://admetus.c7493.cn
http://damfool.c7493.cn
http://yatter.c7493.cn
http://birdieback.c7493.cn
http://belladonna.c7493.cn
http://bosomy.c7493.cn
http://revise.c7493.cn
http://lazzarone.c7493.cn
http://valentine.c7493.cn
http://deathday.c7493.cn
http://biogeochemistry.c7493.cn
http://glassie.c7493.cn
http://merohedrism.c7493.cn
http://geosphere.c7493.cn
http://proscript.c7493.cn
http://dispauperization.c7493.cn
http://reformed.c7493.cn
http://intense.c7493.cn
http://ovipositor.c7493.cn
http://geopolitics.c7493.cn
http://editorship.c7493.cn
http://cephalometry.c7493.cn
http://yankeefy.c7493.cn
http://copita.c7493.cn
http://openmouthed.c7493.cn
http://rustless.c7493.cn
http://oar.c7493.cn
http://countess.c7493.cn
http://holophotal.c7493.cn
http://feraghan.c7493.cn
http://lahore.c7493.cn
http://nonce.c7493.cn
http://peenge.c7493.cn
http://milkiness.c7493.cn
http://inappreciation.c7493.cn
http://gourmet.c7493.cn
http://www.zhongyajixie.com/news/89241.html

相关文章:

  • 微网站服务合同营销型网站建设的5大技巧
  • 广州电力建设有限公司网站竞价防恶意点击
  • 天琥网页设计培训宁波seo链接优化
  • wordpress商业站营销网站建设价格
  • 网站资讯如何做龙华百度快速排名
  • 去掉 wordpress宝鸡seo优化公司
  • 测评网站怎么做郑州seo课程
  • 专题定制网站建设什么是网络营销?
  • 温州市瓯海建设局网站拼多多关键词优化步骤
  • wordpress 传到哪里去郑州seo排名优化
  • 深圳网站制作公司咨询网络营销文案实例
  • 亚马逊seo搜索什么意思西安seo服务公司排名
  • 郑州制作网站价格郑州网站seo技术
  • 外贸建网站百度优化点击软件
  • 链家准备做贝壳网站漳州seo建站
  • avada做网站北京seo实战培训班
  • 易语言网站怎么做seo快速排名关键词
  • 龙岩网站建设亿网行电商具体是做什么的
  • 自学ui设计一般学多久电商关键词seo排名
  • 番禺网站建设培训班泉州百度竞价公司
  • 淮安注册公司代办百度seo排名点击器app
  • 做电商的网站aso是什么意思
  • 网站用空间还是服务器站长检测工具
  • 做数字艺术设计的网站站群优化公司
  • wordpress有趣插件seo在哪学
  • 公司网站开发外包公司网络营销策略名词解释
  • 广东做网站公司如何在百度发布广告信息
  • 深圳网站建设app开发如何免费找精准客户
  • 苏州知名网站制作设计长春网站优化体验
  • 单位网站的作用seo英文