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

【Unity】Inspector排版扩展学习初探

一、简单的Unity Inspector扩展

[SerializeField]

[SerializeField] 作用:让private属性也可以显示在面板上

[Range(x , y)]

[Range(x , y)] 作用: 让参数从输入框变为范围滑条

[Header(" 标题 ")]

[Header(" 标题 ")]作用:在属性前面加上标题

[Tooltip(" 解释")]

[Tooltip(" 解释")]作用: 在鼠标停留在属性名上时显示解释

[TextArea(a ,b)]

[TextArea(a ,b)]作用: 让文本输入框可以输入不止1行,为最小a行,最大b行

[Space(N)]

[Space(N)]作用:控制两个属性在Inspector面板上显示的间隔大小N

[HideInInspector]

[HideInInspector] 作用: 让public属性不会显示在面板上

以上可以满足基本需求,但更复杂的排版需要代码实现,需要扩展Editor类。

二、使用IMGUI框架扩展

1.添加参数

扩展的Editor类必须放在Editor文件夹

然后在脚本中使用UnityEditor,并且继承Editor类,同时在初始需要写[CustomEditor(typeof(Class))],来指明是为哪个脚本添加的扩展 

 

在IMGUI框架下,我们需要覆盖OnInspectorGUI()来实现扩展。

 如图所示,在覆盖时会自动调用父类的方法OnInspectorGUI,如果去掉该方法则原脚本则不会有任何属性显示。

我们先定义一个2D纹理,然后调用ObjectField函数,输入名称,值等信息。 该函数返回值是一个Object所以在前面加上强制转换。然后就可以看到原脚本的面板上有了新的属性。

2.添加按钮&调整样式

我们还可以添加按钮: 

GUILayout.Button用来添加按钮,如果按钮被点击,则该方法会返回一个True。如下图所示。

IMGUI框架也可以调整样式,如下图,为按钮添加高度参数,可以让按钮变大。 

 

三、使用UI Elements扩展

使用UI Elements框架需要添加相应的命名空间。 

同样的覆盖父类的方法,如上图。此时返回Unity窗口,我们发现我们原本脚本的之前用IMGUI框架添加的属性全部消失了。原因是当CreateInspectorGUI的返回值不为空的时候,它的优先级是最高的,所以无视了之前IMGUI框架下的方法。 

其中VisualElement是该框架下最基本的显示对象,可以添加最基本的任何其它子显示对象。

1.添加参数 

以上三行代码显示了如何像IMGUI框架一样为原脚本添加一个纹理的参数。

2.添加按钮&调整样式 

 接着我们添加一个按钮,如下图代码所示,我们可以为按钮设置相应的调用方法。

 可以看到,按下按钮后,打印出了相应的字符串。

我们同样可以用Button.style.height来更改样式高度,如下图所示。 

3.注册回调

我们还可以检测属性注册来执行回调自定方法,如下图所示。

 可以看到,当我们指定了一张纹理后,回调函数被调用,打印出了字符串。

 

如果我们想对更改后的纹理或其他属性做一些操作,如打印新纹理的名字,那么要在回调函数中执行如上图所示。

4.调用原脚本方法

那么如果我们想在扩展脚本里调用原脚本的函数该怎么办呢?比如按下按钮,调用原脚本的函数。我们先在原脚本中写一个函数,打印一个字符串。

 然后在扩展Editor的脚本里更改按下按钮的方法,这里把原来的打印注释掉。

 Unity提供了target指向原来的脚本。当然我们需要把它强制转换成原脚本的类。然后调用即可。如上图所示。

按下按钮,可以看到,打印成功了。 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python进阶-部署Flask项目(以TensorFlow图像识别项目WSGI方式启动为例)
  • 使用 Vue 和 Ant Design 实现抽屉效果的模块折叠功能
  • Android帧绘制流程深度解析 (二)
  • Java项目:111 基于SpringBoot的在线家具商城设计与实现
  • Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena阅读笔记
  • opencv_特征检测和描述
  • 洛谷B3642 二叉树的遍历(前序、中序、后序)
  • JVM的几种常见垃圾回收算法
  • Flutter笔记:关于WebView插件的用法(上)
  • Linux基础IO【II】真的很详细
  • 什么是CSS的:target选择器
  • css实现优惠券样式
  • 破布叶(Microcos paniculata)单倍型染色体级别基因组-文献精读22
  • 软考初级网络管理员_08_网络单选题
  • Docker:镜像命令和容器命令
  • @angular/forms 源码解析之双向绑定
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • canvas 高仿 Apple Watch 表盘
  • create-react-app项目添加less配置
  • docker python 配置
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • iOS编译提示和导航提示
  • JAVA_NIO系列——Channel和Buffer详解
  • Linux gpio口使用方法
  • php ci框架整合银盛支付
  • 编写符合Python风格的对象
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 开源地图数据可视化库——mapnik
  • 前嗅ForeSpider采集配置界面介绍
  • 人脸识别最新开发经验demo
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 微服务入门【系列视频课程】
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • ###STL(标准模板库)
  • #QT(QCharts绘制曲线)
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (4) PIVOT 和 UPIVOT 的使用
  • (42)STM32——LCD显示屏实验笔记
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (八)Flask之app.route装饰器函数的参数
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (回溯) LeetCode 78. 子集
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (五)网络优化与超参数选择--九五小庞
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转载)虚函数剖析
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题