Unity编辑器UnityEditor基础(二)

终极目标

利用学到的东西制作自己的工具(自定义的窗口、Inspector、菜单、插件等等)。

准备工作

还是使用上一篇的 Unity 工程,然后在 Scripts 文件夹里创建一个新的 C# 脚本,命名为“Player”,然后双击打开脚本,然后为其添加如下代码:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[SerializeField]  //類序列化
public class Player : MonoBehaviour {public int id;public string playerName;public string backStory;public float health;public float damage;public float weaponDamage1, weaponDamage2;public string shoeName;public int shoeSize;public string shoeType;public List<Transform> playerTransformList;  //衹有類被序列化了才可以被繪製在見識面板上void Start(){health = 50;}
}

Player 类记录了 Player 的一些基础信息,例如:ID、名字、背景故事、生命值、伤害等等。

自定义 Inspector 属性面板的一些基础知识,和注意事项如下图所示:

接下来在 Editor 文件夹中创建一个新的 C# 脚本命名为PlayerInspector,引用using UnityEditor命名空间,让PlayerInspector继承自UnityEditor,代码如下:
using UnityEngine;
using System.Collections;
using UnityEditor;
//CustomEditor(typeof())用于关联你要自定义的脚本
[CustomEditor(typeof(Player))]
//必须要让该类型继承自Editor,且需要导入UnityEditor程序集
public class PlayerInspector : Editor {Player player;bool showWeapons;void OnEnable(){//获取当前编辑自定义Inspector的对象player = (Player)target;}//执行这个函数来自定义捡视面板public override void OnInspectorGUI(){//设置整个界面是以垂直方向来布局EditorGUILayout.BeginVertical();//空两行EditorGUILayout.Space();EditorGUILayout.Space();//绘制Player的基础信息EditorGUILayout.LabelField("Base Info");player.id = EditorGUILayout.IntField("Player ID",player.id);player.playerName = EditorGUILayout.TextField("Player Name",player.playerName);SerializedProperty property = serializedObject.FindProperty("playerTransformList");   //獲取已經序列化的對象EditorGUILayout.PropertyField(property, new GUIContent("TransformList"), true);//繪製已經序列化對象serializedObject.ApplyModifiedProperties();   //用於保存修改后的序列化對象;//空三行EditorGUILayout.Space();EditorGUILayout.Space();EditorGUILayout.Space();//绘制Player的背景故事EditorGUILayout.LabelField("Back Story");player.backStory = EditorGUILayout.TextArea(player.backStory,GUILayout.MinHeight(100));//空三行EditorGUILayout.Space();EditorGUILayout.Space();EditorGUILayout.Space();//使用滑块绘制Player生命值player.health = EditorGUILayout.Slider("Health",player.health,0,100);//根据生命值设置生命条的背景颜色if (player.health<20){GUI.color = Color.red;}else if(player.health>80){GUI.color = Color.green;}else{GUI.color = Color.green;}//指定生命条的宽高Rect progressRect = GUILayoutUtility.GetRect(100,50);//绘制生命条EditorGUI.ProgressBar(progressRect, player.health / 100.0f, "Health");//用此处处理,以防止上方的颜色变化会影响到下面的变化;GUI.color = Color.white;//空三行EditorGUILayout.Space();EditorGUILayout.Space();EditorGUILayout.Space();//使用滑块绘制伤害值;player.damage = EditorGUILayout.Slider("Damage",player.damage,0,20);//根据伤害值的大小设置提示显示的类型和提示语if(player.damage<10){EditorGUILayout.HelpBox("伤害太低了吧!",MessageType.Error);  //错误类型 }else if(player.damage>15){EditorGUILayout.HelpBox("伤害有点高啊!",MessageType.Warning);}else{EditorGUILayout.HelpBox("伤害适中!!!",MessageType.Info); //正常类型}//空三行EditorGUILayout.Space();EditorGUILayout.Space();EditorGUILayout.Space();//绘制鞋子信息EditorGUILayout.LabelField("Shoe");//以水平方向排列EditorGUILayout.BeginHorizontal();EditorGUILayout.LabelField("Name",GUILayout.MaxWidth(50));player.shoeName = EditorGUILayout.TextField(player.name);EditorGUILayout.LabelField("Size",GUILayout.MaxWidth(50));player.shoeSize = EditorGUILayout.IntField(player.shoeSize);EditorGUILayout.LabelField("Type", GUILayout.MaxWidth(50));player.shoeType = EditorGUILayout.TextField(player.shoeType);EditorGUILayout.EndHorizontal();EditorGUILayout.EndVertical();}}
Vertical - 垂直布局

EditorGUILayout.BeginVertical();

EditorGUILayout.EndVertical();

Horizontal - 水平布局

EditorGUILayout.BeginHorizontal();

EditorGUILayout.EndHorizontal();

Space - 空间(空行)
         使用 EditorGUILayout.Space() 可在两个元素之间空出一行。

绘制各种类型字段

EditorGUILayout.LabelField()标签字段

EditorGUILayout.IntField() 整数字段

EditorGUILayout.FloatField() 浮点数字段

EditorGUILayout.TextField() 文本字段

EditorGUILayout.Vector2Field() 二维向量字段

EditorGUILayout.Vector3Field() 三维向量字段

EditorGUILayout.Vector4Field() 四维向量字段

滑块、进度条

滑块:EditorGUILayout.Slider()

EditorGUILayout.Slider()用于绘制一个滑块,从上可知:

  1. 第一个参数是滑块的名字

  2. 第二个参数是滑块要改变的值

  3. 第三和第四个参数是滑块的范围

进度条:EditorGUI.ProgressBar()

EditorGUI.ProgressBar()用于绘制一个进度条,从上可知:

  1. 第一个参数是设置进度条的大小,类型是一个 Rect。

  2. 第二个参数是设置显示的值,

  3. 第三个参数是设置进度条的名字

提示:

1.第一个参数,我们使用了 GUILayoutUtility.GetRect() 工具类的 GetRect()方法返回一个设置好的矩形框,在案例里我们设置了一个 100*50 大小的矩形框。

2.第二个参数,我们使用 player.health / 100.0f。那是因为进度条的最大值为1,如果不除100的话,当滑块的值为1时,进度条便填满了,因此我们想让值与进度条的比例同步;

帮助框

帮助框:EditorGUILayout.HelpBox()

EditorGUILayout.HelpBox()用于绘制一个盒子(也可以看作矩形框),然后再盒子的里面显示提示信息:

  1. 第一个参数是传入提示信息

  2. 第二个参数是提示信息的类型

效果图

Unity编辑器UnityEditor基础(二)相关推荐

  1. 【Unity编辑器扩展】(二)PSD转UGUI Prefab, 图层解析和碎图导出

    书接上回:[Unity编辑器扩展](一)PSD转UGUI Prefab, Aspose.PSD和Harmony库的使用_TopGames的博客-CSDN博客 工具使用预览: 工具目标: 1. 实现将p ...

  2. Unity 编辑器学习(二)之 全局光照(GI)

    光影流年,花影阡陌.光与影交织的岁月教育我们,不会使用光照的程序员不是个好美术. 一.概述 点击 Window > Lighting > Settings 会弹出Lighting窗口,这个 ...

  3. Unity编辑器拓展之二十四:基于Unity Node Editor、ScriptableObject的配置化新手引导系统

    博客迁移 个人博客站点,欢迎访问,www.jiingfengji.tech 本文主要介绍根据一款Node Editor库开发的新手引导系统 git地址如下: https://github.com/lu ...

  4. 【Unity编辑器扩展】(三)PSD转UGUI Prefab, 一键拼UI解放美术/程序(完结)

    工具效果: 第一步,把psd图层转换为可编辑的节点树,并自动解析UI类型.自动绑定UI子元素: 第二步, 点击"生成UIForm"按钮生成UI预制体 (若有UI类型遗漏可在下拉菜单 ...

  5. 【Unity编辑器扩展实践】、查找所有引用该图片的预制体

    上一篇Unity编辑器扩展实践二.通过代码查找所有预制中已经查到到所有的预制体了. 然后我们就可以用这些预制体做一些其他的操作了,比如查找该预制的资源引用.可以直接遍历预制,找到预制里面的所有Imag ...

  6. 【Unity编辑器扩展】(一)PSD转UGUI Prefab, Aspose.PSD和Harmony库的使用

    [Unity编辑器扩展](二)PSD转UGUI Prefab, 图层解析和碎图导出_psd导入unity_TopGames的博客-CSDN博客 [Unity编辑器扩展](三)PSD转UGUI Pref ...

  7. Unity面试题加强版之二《unity编辑器基础》

    Unity面试题加强版之二Unity编辑器基础 unity超全面试题,掌握轻轻松松拿Offer,码住学习 40.请描述游戏动画有几种,以及其原理. 主要有关节动画.单一网格模型动画(关键帧动画).骨骼 ...

  8. 【Unity编辑器】UnityEditor多重弹出窗体与编辑器窗口层级管理

    一.简介 最近马三为公司开发了一款触发器编辑器,对于这个编辑器策划所要求的质量很高,是模仿暴雪的那个触发器编辑器来做的,而且之后这款编辑器要作为公司内部的一个通用工具链使用.其实,在这款触发器编辑器之 ...

  9. unity2d游戏开发系列教程:二、新建工程并熟悉Unity编辑器常用功能

    目录 unity2d游戏开发系列教程:一.环境安装 第一步.打开项目 耐心等待一小会 工程界面 第二步.创建第一个场景(第一关)进行试玩 点击图中标号1的运行按钮,即可简单试玩感受,操作如下 移动A, ...

最新文章

  1. Mongodb的安装部署
  2. android clipChildren的使用
  3. opencv读取图片、视频、摄像头
  4. php 掌握jquery,完全掌握jquery tmpl模板
  5. C语言(CED)判断一个数是否是2的整数幂的简便方法!
  6. JVM快速调优手册02:常见的垃圾收集器
  7. 数据可视化系列(四):文字图例尽眉目
  8. Java面试题:final修饰的对象,有几种初始化方式
  9. 深度学习2.0-38.RNNCell使用-RNN Layer
  10. 数字图像处理概述PPT学习1
  11. 游戏中植入广告的例子
  12. 使用gdb调试出现 No debugging symbols found in a.out
  13. C++ 使用 OpenCV 实现证件照蓝底换成白底功能(或其他颜色如红色)详解
  14. Exception Triggered - Qt-Creator The inferior stopped because it triggered an exception.
  15. 软件测试的魅力何在?您为什么选择测试一行而不做开发?
  16. Android开发——集成友盟社会化分享遇到的坑(一)
  17. Microsoft Enterprise Library 简介与请大家下载Microsoft Enterprise Library 5.0体验微软最新技术应用于企业信息平台
  18. 汇川MD500变频器学习之路(一)
  19. 71 linux usb设备驱动
  20. Oracle 11G 数据迁移 到 12C

热门文章

  1. FASTDFS上传文件时报错,org.csource.commom.MyException:getStoreStorage fail,error code : 28解决办法
  2. excel数据统计函数
  3. python调用百度人脸识别:来一次颜值评分
  4. 企业信任危机“诱因”解析
  5. Win32中调用InvalidateRect时,屏幕闪烁的解决方法
  6. WPF 密码框输入密码时强制使用英文输入法
  7. Polynomial Round 2022 (Div. 1 + Div. 2, Rated, Prizes!)(E、B)
  8. SpringBoot定时任务@Scheduled注解详解
  9. 健康体检中心与医院的差别?
  10. java中的线程等待