一. 参数自定义

一个含有成员的类Player

using System.Collections;
using System.Collections.Generic;
using UnityEngine; 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; void Start()
{
health = ;
}
}

写完之后,inspector面板上是这样的:

然后,写一个编辑扩展脚本(写出该脚本即可,不需要做任何操作):

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
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(); //绘制palyer的基本信息
EditorGUILayout.LabelField("Base Info");
player.id = EditorGUILayout.IntField("Player ID", player.id);
player.playerName = EditorGUILayout.TextField("PlayerName", player.playerName); //空三行
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.Space(); //绘制Player的背景故事
EditorGUILayout.LabelField("Back Story");
player.backStory = EditorGUILayout.TextArea(player.backStory, GUILayout.MinHeight()); //空三行
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.Space(); //使用滑块绘制 Player 生命值
player.health = EditorGUILayout.Slider("Health", player.health, , ); //根据生命值设置生命条的背景颜色
if (player.health < )
{
GUI.color = Color.red;
}
else if (player.health > )
{
GUI.color = Color.green;
}
else
{
GUI.color = Color.gray;
} //指定生命值的宽高
Rect progressRect = GUILayoutUtility.GetRect(, ); //绘制生命条
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, , ); //根据伤害值的大小设置显示的类型和提示语
if (player.damage < )
{
EditorGUILayout.HelpBox("伤害太低了吧!!", MessageType.Error);
}
else if (player.damage > )
{
EditorGUILayout.HelpBox("伤害有点高啊!!", MessageType.Warning);
}
else
{
EditorGUILayout.HelpBox("伤害适中!!", MessageType.Info);
} //空三行
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.Space(); //设置内容折叠
showWeapons = EditorGUILayout.Foldout(showWeapons, "Weapons");
if (showWeapons)
{
player.weaponDamage1 = EditorGUILayout.FloatField("Weapon 1 Damage", player.weaponDamage1);
player.weaponDamage2 = EditorGUILayout.FloatField("Weapon 2 Damage", player.weaponDamage2);
} //空三行
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.Space(); //绘制鞋子信息
EditorGUILayout.LabelField("Shoe");
//以水平方向绘制
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Name", GUILayout.MaxWidth());
player.shoeName = EditorGUILayout.TextField(player.shoeName);
EditorGUILayout.LabelField("Size", GUILayout.MaxWidth());
player.shoeSize = EditorGUILayout.IntField(player.shoeSize);
EditorGUILayout.LabelField("Type", GUILayout.MaxWidth());
player.shoeType = EditorGUILayout.TextField(player.shoeType);
EditorGUILayout.EndHorizontal();
EditorGUILayout.EndVertical();
} }

写完之后inspector面板上是这样的

通过自定义Inspector视图可以实现很多方便的功能。例如将脚本组件的static变量或者私有变量显示出来,或者实现多参数的联动变化,即修改其中的某个参数,其余参数会随之调整。

内容转载自https://www.jianshu.com/p/2f686da4905c

二. 编辑时运行

代码:

[ExecuteInEditMode]
public class Test : MonoBehaviour
{ // Update is called once per frame
void Update()
{
transform.LookAt(Vector3.zero);
}
}

ExecuteInEditMode表示程序的Update在编辑状态下运行

Unity---Inspector面板自定义的更多相关文章

  1. Unity Inspector面板常用的属性

    在扩展Unity的时候,往往会用到一些属性,这里将常用的列一下. 1.属性只读: #if UNITY_EDITOR using UnityEditor; #endif using UnityEngin ...

  2. Unity 自定义Inspector面板时的数据持久化问题

    自定义Inspector面板的步骤: Unity内创建自定义的Inspector需要在Asset的任意文件夹下创建一个名字是Editor的文件夹,随后这个文件夹内的cs文件就会被放在vstu生成的Ed ...

  3. 让Unity的Inspector面板支持字符限制(restrict)功能

    今天在优化红点组件,笔者打算将红点id由10进制改为16进制处理,就打算将红点id字段由uint类型改成string类型,用于填写16进制的字符(因为在Inspector面板里,uint/int类型字 ...

  4. 使用反射功能在Unity运行状态通过Inspector面板修改字段和调用方法

    使用反射功能在Unity运行状态通过Inspector面板修改字段和调用方法 效果展示 一个很简单的组件脚本 运行状态在Inspector面板可以随便修改字段和调用方法 方法调用日志 设计由来 最近在 ...

  5. Unity编辑器环境在Inspector面板中显示变量

    Serialize功能Unity3D 中提供了非常方便的功能可以帮助用户将 成员变量 在Inspector中显示,并且定义Serialize关系. 简单的说,在没有自定义Inspector的情况下所有 ...

  6. Unity编辑器重写Inspector面板,面板中编辑的数据不触发场景发生变化的问题。

    今天开始协助主程一起制作新框架.主程让我写关于新版UI框架注册UI预制体用的快捷编辑器. 现学现写,总算完成了. 可以直接把选中的预制体添加到UIController的数组中,期间涉及到改变大小.所以 ...

  7. Unity3d Inspector面板实现set/get访问器

    简单说一下属性和字段的区别:字段就是成员变量,而属性确实提供给外部访问内部成员变量的接口.之所以会有属性的出现,就是为了避免外部对类的成员的直接访问,通俗的说就是OOP中的封装思想. using Un ...

  8. Unity3D:Text在Inspector面板中中无法显示,需转换成UTF-8格式

    环境:Win10 读取text内容后unity报错:Input string was not in the correct format 同时在Inspector面板中无法预览Text文本内容 随后发 ...

  9. Unity检视面板的继承方法研究 (二)

    之前做了普通对象的可继承的检视面板类, 现在想要实现对Unity自带的检视面板的继承的话, 要怎样写呢? 万变不离其宗,  仍然是围绕UnityEditor.Editor.CreateEditor 这 ...

随机推荐

  1. 检索 COM 类工厂中 CLSID 为 {00021A20-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80080005

    创建Excel对象失败: Excel.Application xApp = new Excel.Application(); 错误提示:{"检索 COM 类工厂中 CLSID 为 {0002 ...

  2. CISCO ASA 5505 经典配置案例

    nterface Vlan2 nameif outside  ----------------------------------------对端口命名外端口  security-level 0 -- ...

  3. 【转】Spring学习---SpringIOC容器的初始化过程

    [原文]https://www.toutiao.com/i6594400249429623304/ SpringIOC容器的初始化过程 简单来说,IoC容器的初始化是由refresh()方法来启动的, ...

  4. 使用 jekyll + github pages 搭建个人博客

    1. 新建 github.io 项目 其实 github pages 有两个用途,大家可以在官方网页看到.其中一个是作为个人/组织的主页(每个账号只能有一个),另一个是作为 github 项目的项目主 ...

  5. Docker容器学习与分享06

    Docker容器网络 Docker有三种原生网络:none网络.host网络.bridge网络. 先来学习一下bridge网络. 首先使用ifconfig命令查看一下本机的网络设备: 从图中可以看见多 ...

  6. java调用Linux执行Python爬虫,并将数据存储到elasticsearch--(环境脚本搭建)

    java调用Linux执行Python爬虫,并将数据存储到elasticsearch中 一.以下博客代码使用的开发工具及环境如下: 1.idea: 2.jdk:1.8 3.elasticsearch: ...

  7. Learn Algorithms With Javascript - 基于 Js 进行算法学习

    基于 javascript 学习并实现常用的经典算法,欢迎对算法和数学感兴趣的 Js 开发者参与,一起学习共同进步. 算法实现 排序 插入排序 sort/lib/insertion-sort.js 希 ...

  8. weblogic92一次成功修改密码的记录

    假设你忘记了weblogic92控制台的密码了: 假设你的hostname叫localhost.localdomain 假设你的bea在/opt下: ------------------------- ...

  9. Android自定义布局的背景在多分辨率的情况下设置fill_parent时背景不能够横向全屏的问题解决

    问题描述:最近做了一个自定义的控件LinearLayout就是公用的底部菜单条,在指定分辨率下(例如:480x800,480x854)下背景是正常的,但是当程序运行到非指定(默认)的分辨率下就不正常了 ...

  10. FFMpeg笔记(七) 代码结构分析,以HLS为例

    HLS流在播放时是先解协议(hls.c)后解封装(mpegts.c),libavformat下的hls.c和mpegts.c实际上是同一个级别的,同属于demuxer. 一.解HLS协议 1. FFm ...