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

angularjs网站模板做外贸公司网站多少钱

angularjs网站模板,做外贸公司网站多少钱,小企业网站免费建设,合肥网站建设推广服务Unity UI Button 事件优先级调整技术方案 在 Unity 项目开发过程中#xff0c;针对 UI Button 的事件执行顺序控制是一个常见需求。本文详细阐述两种将新添加事件置于第一个执行位置的方法#xff0c;旨在为开发者提供全面且专业的技术参考。 一、基于反射机制的事件插入方…Unity UI Button 事件优先级调整技术方案 在 Unity 项目开发过程中针对 UI Button 的事件执行顺序控制是一个常见需求。本文详细阐述两种将新添加事件置于第一个执行位置的方法旨在为开发者提供全面且专业的技术参考。 一、基于反射机制的事件插入方法 一核心函数InsertClickListenerAtStart 以下函数实现了将指定的 UnityAction 插入到 Button 的 onClick 事件列表头部确保其在其他已有事件之前执行。 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);}}}}}}} }此方法通过反射深入到 UnityEventBase 和 Button 的内部实现机制精准地操作事件调用列表。其核心步骤包括 首先对目标事件进行去重操作避免同一事件多次添加导致的逻辑混乱。接着利用反射获取 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 GetComponentButton();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 变量。同时将 Button 的 onClick 事件替换为一个新的空事件以便后续插入自定义事件。当用户点击按钮时OnPointerClick 方法被触发。首先执行自定义的 BeforeOnClick 事件这是我们希望优先执行的事件。接着将 Button 的 onClick 事件恢复为原始备份的事件并立即触发该事件从而保证了自定义事件在原始事件之前执行。最后销毁 OneTimeButtonEventInsertor 脚本实例避免对后续事件处理产生不必要的干扰。 综上所述这两种方法分别从底层反射和高层脚本代理的角度为 Unity UI Button 事件优先级控制提供了有效的解决方案。开发者可根据项目的具体需求、性能要求以及代码维护性等因素灵活选择合适的方法来实现按钮事件的精准排序。
http://www.hkea.cn/news/14565090/

相关文章:

  • 乌拉圭网站后缀广州冼村社区服务中心电话
  • 门户网站建设进度中小企业网站构建设计
  • 襄阳网站建设八零后商业网站建设实训指导书
  • pc端网站未来安徽海通建设集团网站
  • 潍坊网络建站模板新郑网络推广公司
  • 济南做网站软件前端需要会wordpress
  • 网站推广专家十年乐云seo网页设计期末作业源码
  • 免费 网站建设域名注册过程
  • 湖南营销型网站建设 地址磐石网络专业的网站建设服务商
  • 懂做网站的人就是好广州做网站app
  • 好用的网站系统网站需要的技术
  • 建筑工程专业网站优化的关键词
  • 销售网站页面特点做英文网站的标准字体
  • 浦东网站推广青岛制作企业网站
  • 邢台网站建设 冀icp备上海广告公司赵菲
  • 合肥建筑网站静态网站做新闻系统
  • 一站式营销推广平台一台云服务器多少钱
  • 两学一做山西答题网站深圳企业网站制作招聘信息
  • 微网站定制多久网站模板 整站源码
  • 电子商务网站开发与设计项目管理物流公司网站建设模板
  • 建设游戏网站石家庄网站建设策划方案
  • 如何设计商务网站商丘旅游网站的建设
  • 贵州省交通建设集团网站网站建设网站制作有限
  • 江门网站建设联系电话会写网站怎么赚钱
  • 交互效果网站网络管理系统设计
  • 建设银行的网站网站记登录账号怎么做
  • 淘宝客cms建站教程网站后台批量上传图片
  • 石家庄seo网站优化公司网络贷款公司哪个好
  • 苏州网站建设培训湖北建设工程造价协会网站
  • 网站设计和网站建设c 网站开发项目