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

Unity 编辑器-监听创建控件,prefab创建或添加组件的自动处理⭐

拓展控件

    • 需求
    • 解决方案
      • 方案

需求

比如我想在添加Text时,自动添加一个脚本,用于处理多语言。在添加图片时,自动去掉raycast的勾选以节约性能损耗

解决方案

方案

ObjectFactory.componentWasAdded 用于监听组件的添加事件

using TMPro;
using UnityEngine;
using UnityEditor;
using UnityEngine.UI;
using UnityEngine.EventSystems;
/// <summary>
/// Inspector面板添加组件回调
/// </summary>
[InitializeOnLoad]
public class InspectorAddComponent
{static InspectorAddComponent(){//监听组件添加事件ObjectFactory.componentWasAdded += ComponentWasAdded;}private static void ComponentWasAdded(Component com){switch (com.GetType().ToString()){case "UnityEngine.UI.Image":ComponentOptimizing.OptimizingImage(com as Image);break;case "UnityEngine.UI.Text":ComponentOptimizing.OptimizingText(com as Text);break;case "UnityEngine.UI.Button":ComponentOptimizing.OptimizingButton(com as Button);break;case "UnityEngine.UI.Mask":ComponentOptimizing.OptimizingMask(com as Mask);break;case "TMPro.TextMeshProUGUI":ComponentOptimizing.OptimizingTmp(com as TextMeshProUGUI);break;}}
}
using TMPro;
using Unity.VisualScripting;
using UnityEditor;
using UnityEditor.Events;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;/// <summary>
/// 组件优化设置
/// </summary>
public class ComponentOptimizing
{#region Imagepublic static void OptimizingImage(Image image){//如果当前图片不是按钮,取消勾选RaycastTargetif (image.gameObject.GetComponent<Button>() == null){image.raycastTarget = false;}}#endregion#region TextMeshProUGUIpublic static void OptimizingTmp(TextMeshProUGUI tmp){if (tmp.gameObject.GetComponent<MaskableGraphic>() == null ){tmp.raycastTarget = false;}if (tmp.GetComponent<DictionaryText>() == null){tmp.AddComponent<DictionaryText>();}}#endregion#region Textpublic static void OptimizingText(Text text){if (text.gameObject.GetComponent<MaskableGraphic>() == null){text.raycastTarget = false;}//是否支持富文字框架,默认不支持,有需求再手动勾选text.supportRichText = false;if (text.GetComponent<DictionaryText>() == null){text.AddComponent<DictionaryText>();}}#endregion#region Buttonpublic static void OptimizingButton(Button button){//判断需要添加button组件的物体是否有继承自MaskableGraphic的组件,有的话就勾选RaycastTargetif (button.gameObject.GetComponent<MaskableGraphic>() != null){button.gameObject.GetComponent<MaskableGraphic>().raycastTarget = true;}if (button.GetComponent<ClickSound>() == null){var btnE = button.AddComponent<ClickSound>();button.onClick.AddListener(btnE.OnPlaySound);AddListener(button, btnE.OnPlaySound);}}private static void AddListener(Button button, UnityAction e){// 获取或创建自定义序列化对象和属性SerializedObject serializedButton = new SerializedObject(button);// 将新创建的 UnityEvent 添加到 Button 的 OnClick 事件中UnityEventTools.AddVoidPersistentListener(button.onClick, e);// 应用所有更改并重新绘制 Inspector 视图serializedButton.ApplyModifiedProperties();}#endregion#region Maskpublic static void OptimizingMask(Mask mask){//判断需要添加mask组件的物体是否有继承自MaskableGraphic的组件,有的话就勾选RaycastTargetif (mask.gameObject.GetComponent<MaskableGraphic>() != null){mask.gameObject.GetComponent<MaskableGraphic>().raycastTarget = true;}}#endregion
}

如图,inspector 面板和场景中创建的所有控件,几乎都能触发这个回调。
或者说所有使用到ObjectFactory.AddComponent 方法添加脚本的都能触发这个回调。

值得注意的是TextmeshoPro.。测试发现TextMeshProUGU 部分控件不能触发事件

查看源码可发现,text - TextMeshPro控件使用的是ObjectFactory.AddComponent ,而Button - TextMeshPro 使用的是GameObject.AddComponent

如果需要修改,可以把TMPpackage包从PackageManager中挪出来,改为本地Package


http://www.mrgr.cn/news/11132.html

相关文章:

  • python源码:基于fastapi+websocket双向信息通道的简易网页聊天室
  • HR招聘面试测评工具,DISC性格测试,disc行为风格
  • 【案例58】WebSphere输出日志输出慢导致线程被阻塞
  • word技巧:保护Word文档页眉,确保内容不被随意修改
  • 什么牌子的运动耳机最好用?五大绝佳臻品细致汇集!
  • 入门STM32--按键输入
  • Jmeter下载、配置环境变量
  • 制造业中的MES知识与ERP\PLM\WMS架构关系(附智能制造MES解决方案PPT下载)
  • ES6笔记总结:第四天(ES6完结)
  • 浅谈【数据结构】图-图的存储
  • p10 容器的基本命令
  • ImportError: DLL load failed while importing _ssl: 找不到指定的模块。
  • 机器学习-朴素贝叶斯
  • Qt Group、泛联新安即将亮相IDAS 2024设计自动化产业峰会!
  • Windows10企业版找不到微软商店以及微软商店打不开问题解决
  • 如何在 Hugging Face 上下载和使用模型—全面指南
  • 【Qt】Qt系统 | Qt事件 按键事件
  • 阿卡迈2.0逆向
  • konva Image 对上报不同格式客户端处理方式
  • FaceChain 打造个人证件照 职业照 写真照