unity编辑器扩展高级用法

在PropertyDrawer中,您不能使用来自GUILayoutEditorGUILayout的自动布局API,而只能使用来自GUIEditorGUI的绝对Rect API始终传递相应的起始位置和维度。

你需要

  • 计算显示嵌套内容所需的总高度
  • 将此高度添加到public override float GetPropertyHeight,这将告诉检查员根据Rect保留以绘制您的财产
  • 将为sub-editor保留的相应Rect传递到editor中,并在给定位置和尺寸处绘制

=>您不能简单地使用默认编辑器来实现这一点,因为它在PropertyDrawers无法使用的auto-layout系统中运行。


#region UNITY_EDITOR
using System.Collections.Generic;
using System;
using UnityEditor;
using static UnityEditor.Progress;
using UnityEngine;
using Unity.VisualScripting;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Xml.Linq;
using System.IO;public class UICollector : MonoBehaviour
{public string GenerateClassName;public OperateSetting OperateSetting;public List<ComponentInfo> components = new List<ComponentInfo>();public void GenerateMainClass(){//  F:\AAAAAAAAAAAG4\UnityProject\MyDoor\trunk\client_root\Assets\Scripts\Game\Runtime\Logic\Dialog\_AirShipBodayTab.csstring mainPath = $"{Application.dataPath}/Scripts/Game/Runtime/Logic/Dialog/{GenerateClassName}.cs";if (!File.Exists(mainPath)){File.Create(mainPath).Close();         }UnityEditor.AssetDatabase.Refresh();File.WriteAllText(mainPath,@"using UnityEngine;
using System;
using UnityEngine.UI;
public partial class _D_CLASSNAME : Dialog
{public override bool IsFullScreen() { return true;}public override bool NeedShowCoins(){   return false; }protected override void OnCreate(){}
}
".Replace("_D_CLASSNAME", GenerateClassName));UnityEditor.AssetDatabase.Refresh();GeneratePartClass();}private void GeneratePartClass(){string fielddata = "";string referdata = "";foreach (var item in components){if (!string.IsNullOrEmpty(item.name)&& item.component!=null){fielddata += $"private {item.component.GetType().Name} {item.name};\n";referdata += $"{item.name} = transform.Find(\"{ item.path }\").GetComponent<{item.component.GetType().Name}>();\n";}}string baseTemp = @"using System;
using UnityEngine;
using UnityEngine.UI;public partial class _D_CLASSNAME : Dialog
{FILEDLISTprotected override void InitRef(){REFERENCE}
}
";string info = "";info = baseTemp.Replace("FILEDLIST", fielddata);info = info.Replace("_D_CLASSNAME", GenerateClassName);info = info.Replace("REFERENCE", referdata);string aprtPath = $"{Application.dataPath}/Scripts/Game/Runtime/Logic/Dialog/Partial/{GenerateClassName}.cs";if (!File.Exists(aprtPath)){File.CreateText(aprtPath).Close();UnityEditor.AssetDatabase.Refresh();         }File.WriteAllText(aprtPath, info);UnityEditor.AssetDatabase.Refresh();}}[Serializable]
public class ComponentInfo
{public string name;public string path;public int index;public UnityEngine.Component component;public GameObject go;public GameObject lastObject;
}
[CustomPropertyDrawer(typeof(ComponentInfo))]
public class ComponentInfoEditor : PropertyDrawer
{private UnityEngine.Object lastObject;public override float GetPropertyHeight(SerializedProperty property, GUIContent label){return base.GetPropertyHeight(property, label) + 40;//这个总区域的高度}public override void OnGUI(Rect position, SerializedProperty property, GUIContent label){GUI.color = Color.white;float span = 220;float width = 180;var f1Rect = new Rect(position.x + span * 1, position.y, width, 20);var f2Rect = new Rect(position.x + span * 0, position.y, width, 20);var f3Rect = new Rect(position.x, position.y + 20, width, 20);var f4Rect = new Rect(position.x + span * 1, position.y + 20, width, 20);var f5Rect = new Rect(position.x + span * 2, position.y + 20, width, 20);EditorGUIUtility.labelWidth = 70;var go = property.FindPropertyRelative("go").objectReferenceValue;if (go != null){EditorGUI.PropertyField(f2Rect, property.FindPropertyRelative("go"));bool isChange = false;var lastObject = property.FindPropertyRelative("lastObject").objectReferenceValue;if (isChange == false) isChange = lastObject != go;property.FindPropertyRelative("lastObject").objectReferenceValue = go;UnityEngine.Component[] components = go.GetComponents<UnityEngine.Component>();List<string> types = new List<string>();foreach (UnityEngine.Component comp in components){types.Add(comp.GetType().Name);}int nowindex = EditorGUI.Popup(f1Rect, property.FindPropertyRelative("index").intValue, types.ToArray());if (isChange == false) isChange = property.FindPropertyRelative("index").intValue != nowindex;property.FindPropertyRelative("index").intValue = nowindex;int index = property.FindPropertyRelative("index").intValue;property.FindPropertyRelative("component").objectReferenceValue = components[index];if (isChange || string.IsNullOrEmpty(property.FindPropertyRelative("name").stringValue)){string name = "m_" + components[index].GetType().Name.Substring(0, 4) + "_" + components[index].name;property.FindPropertyRelative("name").stringValue = name;}EditorGUI.PropertyField(f3Rect, property.FindPropertyRelative("name"));EditorGUI.PropertyField(f4Rect, property.FindPropertyRelative("component"));//当前挂载位置var parent = property.serializedObject.targetObject.GetComponent<Transform>();var curgo = go.GetComponent<Transform>();types.Clear();while (curgo != parent && curgo != null){types.Add(curgo.name);curgo = curgo.parent;}string path = "";for (int i = types.Count - 1; i >= 0; i--){path += (types[i] + (i != 0 ? "/" : ""));}property.FindPropertyRelative("path").stringValue = path;EditorGUI.PropertyField(f5Rect, property.FindPropertyRelative("path"));}else{EditorGUI.PropertyField(f2Rect, property.FindPropertyRelative("go"));}}
}[Serializable]
public class OperateSetting
{
}[CustomPropertyDrawer(typeof(OperateSetting))]
public class OperateSettingAEditor : PropertyDrawer
{private Dictionary<string, ComponentInfo> keyValuePairs = new Dictionary<string, ComponentInfo>();public override float GetPropertyHeight(SerializedProperty property, GUIContent label){return base.GetPropertyHeight(property, label) + addHeight;}private float addHeight;private string repeatname;public override void OnGUI(Rect position, SerializedProperty property, GUIContent label){//UnityEditor.EditorGUILayout.Space(60);var uiCollector = property.serializedObject.targetObject.GetComponent<UICollector>();if (string.IsNullOrEmpty(uiCollector.GenerateClassName)){uiCollector.GenerateClassName = $"_D_{uiCollector.transform.name.Replace("_d_", "")}";}if (GUI.Button(new Rect(position.x, position.y, position.width, 30), "生成CSharp")){uiCollector.GenerateMainClass();}if (uiCollector.components.Count > 0){keyValuePairs.Clear();bool isRepeat = false;foreach (var item in uiCollector.components){if (!keyValuePairs.ContainsKey(item.name)){keyValuePairs.Add(item.name,item);}else{//GUI.color = Color.red; // 设置错误文本颜色为红色repeatname = item.name;isRepeat = true;break;}}if (isRepeat){GUI.Label(new Rect(position.x, position.y + 30, position.width, 40), "重复提示:" + repeatname + "字段重复", new GUIStyle());addHeight = 40;}else{addHeight = 30;}}}
}#endregion

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/765950.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实用工具推荐:适用于 TypeScript 网络爬取的常用爬虫框架与库

随着互联网的迅猛发展&#xff0c;网络爬虫在信息收集、数据分析等领域扮演着重要角色。而在当前的技术环境下&#xff0c;使用TypeScript编写网络爬虫程序成为越来越流行的选择。TypeScript作为JavaScript的超集&#xff0c;通过类型检查和面向对象的特性&#xff0c;提高了代…

Linux :环境基础开发工具

目录: 1. Linux 软件包管理器 yum 1. 什么是软件包 2. 查看软件包 3. 如何安装软件 4. 如何卸载软件 2. Linux开发工具 1. Linux编辑器-vim的基本概念 2. vim使用 3. vim的基本操作 4. vim正常模式命令集 5. vim末行模式命令集 6. 简单vim配置 3. Linux编译器-gcc/…

常用相似度计算方法总总结

一、欧几里得相似度 1、欧几里得相似度 公式如下所示&#xff1a; 2、自定义代码实现 import numpy as np def EuclideanDistance(x, y):import numpy as npx np.array(x)y np.array(y)return np.sqrt(np.sum(np.square(x-y)))# 示例数据 # 用户1 的A B C D E商品数据 [3.3…

知识管理软件那么多,怎么挑选才适合初创企业?

对于初创企业来说&#xff0c;资源有限&#xff0c;效率显得尤其重要。此时&#xff0c;一个强大的知识管理软件就显得必不可少。它不仅利于信息的录入、查找和共享&#xff0c;还可以帮助团队更好的组织和协作&#xff0c;提高工作效率。那么&#xff0c;在众多的知识管理软件…

SQL-Labs靶场“34-35”关通关教程

君衍. 一、34关 POST单引号宽字节注入1、源码分析2、联合查询注入3、updatexml报错注入4、floor报错注入 二、35关 GET数字型报错注入1、源码分析2、联合查询注入3、updatexml报错注入4、floor报错注入 SQL-Labs靶场通关教程&#xff1a; SQL注入第一课 SQL注入思路基础 SQL无列…

第 6 章 ROS-xacro练习(自学二刷笔记)

重要参考&#xff1a; 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 6.4.3 Xacro_完整使用流程示例 需求描述: 使用 Xacro 优化 URDF 版的小车底盘模型实现 结果演示: 1.编写 X…

使用Dockerfile打包java项目生成镜像部署到Linux

1、Dockerfile 介绍 如果说容器就是“小板房”&#xff0c;镜像就是“样板间”。那么&#xff0c;要造出这个“样板间”&#xff0c;就必然要有一个“施工图纸”&#xff0c;由它来规定如何建造地基、铺设水电、开窗搭门等动作。这个“施工图纸”就是“Dockerfile”。 比起容…

VUE3.0(一):vue3.0简介

Vue 3 入门指南 什么是vue Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界…

0基础 三个月掌握C语言(13)-下

数据在内存中的存储 浮点数在内存中的存储 常见的浮点数&#xff1a;3.141592、1E10等 浮点数家族包括&#xff1a;float、double、long double类型 浮点数表示的范围&#xff1a;在float.h中定义 练习 关于&#xff08;float*)&n&#xff1a; &n&#xff1a;这是一…

53、Qt/信号与槽、QSS界面设计20240322

一、使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是…

yolov6实现遥感影像目标识别|以DIOR数据集为例

1 目标检测是计算机视觉领域中的一项重要任务&#xff0c;它的目标是在图像或视频中检测出物体的位置和类别。YOLO&#xff08;You Only Look Once&#xff09;是一系列经典的目标检测算法&#xff0c;最初由Joseph Redmon等人于2016年提出。YOLO算法具有快速、简单、端到端的特…

证书(公钥):网络安全的关键

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

YOLOv5全网首发改进: 注意力机制改进 | 上下文锚点注意力(CAA) | CVPR2024 PKINet 遥感图像目标检测

💡💡💡本文独家改进:引入了CAA模块来捕捉长距离的上下文信息,利用全局平均池化和1D条形卷积来增强中心区域的特征,从而提升检测精度,CAA和C3进行结合实现二次创新,改进思路来自CVPR2024 PKINet,2024年前沿最新改进,抢先使用 💡💡💡小目标数据集,涨点近两个…

【亚马逊云AI课程上新】「生成式 AI 精英速成计划」 即刻成为炙手可热 AI 人才

文章目录 1. 生成式 AI 精英速成计划介绍2. 重磅课程 增亮你的职业生涯3. 多种身份 全面赋能4. 关于「商业应用技能」课程5. 关于「技术开发技能」课程介绍6. 化身学霸得好礼 好礼双周送附&#xff1a;亚马逊云科技海外账号注册流程 1. 生成式 AI 精英速成计划介绍 &#x1f4…

公司调研 | Agility | 网红人形机器人Digit | 商业化情况

最近做的一些公司 / 产品调研没有从技术角度出发&#xff0c;而更关注宏观发展&#xff1a;主营方向、产品介绍、商业化落地情况、融资历程、公司愿景、创始人背景等。部分调研放在知乎上&#xff0c;大部分在飞书私人链接上 最近较关注人形Robot的发展情况&#xff0c;欢迎感兴…

在云上部署我的个人博客!!!

这和上一篇是连起来的&#xff0c;大家先整体看一遍&#xff0c;不要跟&#xff0c;前面有些弯路&#xff01;&#xff01;&#xff01; 【这是按时计费的&#xff0c;欠费不能用&#xff0c;交了好几次哈哈哈哈 】 【我买的域名是&#xff1a;128.1.61.228】 【把域名这个位置…

鸿蒙Harmony应用开发—ArkTS(@Link装饰器:父子双向同步)

子组件中被Link装饰的变量与其父组件中对应的数据源建立双向数据绑定。 说明&#xff1a; 从API version 9开始&#xff0c;该装饰器支持在ArkTS卡片中使用。 概述 Link装饰的变量与其父组件中的数据源共享相同的值。 限制条件 Link装饰器不能在Entry装饰的自定义组件中使用…

优化选址问题 | 模拟退火算法求解物流选址问题含Matlab源码

目录 问题代码问题 模拟退火算法(Simulated Annealing, SA)是一种概率性的全局优化算法,用于求解大规模组合优化问题。在物流选址问题中,模拟退火算法可以用来寻找成本最低、效率最高的仓库或配送中心位置。下面是一个简化的模拟退火算法求解物流选址问题的描述,并附带有…

贪吃蛇(C语言超详细版)

目录 前言&#xff1a; 总览&#xff1a; API&#xff1a; 控制台程序&#xff08;Console&#xff09;&#xff1a; 设置坐标&#xff1a; COORD&#xff1a; GetStdHandle&#xff1a; STD_OUTPUT_HANDLE参数&#xff1a; SetConsoleCursorPosition&#xff1a; …

LabVIEW飞行器螺旋桨性能测试与数据监控

LabVIEW飞行器螺旋桨性能测试与数据监控 开发LabVIEW的电动飞行器螺旋桨性能测试与数据监控系统&#xff0c;专门针对电动飞行器螺旋桨在运行过程中的性能测试和监控需求。通过采集转速、转矩、拉力和温度等关键参数&#xff0c;系统能够实时监测和分析螺旋桨的状态&#xff0…