Unity3D学习笔记(二十八):Editor
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Rigidbody))]
[ExecuteInEditMode]
//[AddComponentMenu("LessonMonoEditor")]
[AddComponentMenu("Lesson/MonoEditor")]
public class LessonMonoEditor : MonoBehaviour {
[Header("玩家的信息")]//显示标题
[Space()]
[Tooltip("玩家名字")]//鼠标悬停,显示信息
public string playerName;
[Delayed()]
public int id;
[HideInInspector]//面板隐藏(可序列化)
public int id1;
[SerializeField]//面板显示(可序列化标识)
private bool sex;
[System.NonSerialized]//面板隐藏(不可序列化标识)
public bool sex1;
[Range(, )]//滑动条
public float hp;
[Range(, )]
public int level;
[Multiline()]
public string message;//多行显示
[TextArea()]
public string message1;//带滑动条的多行显示
[ContextMenuItem("function", "Test")]
[TextArea(, )]
public string message2;
// Use this for initialization
void Start() {
hp = ;
Debug.Log("hp:" + hp);
}
// Update is called once per frame
void Update() {
Debug.Log(id);
}
void Test()
{
Debug.Log("Test方法执行");
message2 = "这是一个玩家信息";
}
[ContextMenu("重置方法")]
private void ResetPosition()//必须是非静态的方法
{
Debug.Log("ResetPosition");
}
[UnityEditor.MenuItem("Menu/Open")]
static void OpenMenu()
{
Debug.Log("OpenMenu");
}
[System.Serializable]
public class A
{
public string name;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;//1、引用命名空间
[CustomEditor(typeof(Player))]//3、关联该类扩展开发的脚本
public class PlayerEditor : Editor//2、继承Editor类
{
public Player player;
//4、利用OnEnable和OnDisable做一些初始化和清理的工作
private void OnEnable()
{
//5、利用Target来获取到你选择的物体上的LessonPlayer对象
player = (Player)target;
Debug.Log("OnEnable:" + player.gameObject.name);
}
//6、重写OnInspectorGUI,在这个方法内对LessonPlayer里的变量等进行重写操作
public override void OnInspectorGUI()
{
//base.OnInspectorGUI();
//针对字符串变量
//第一个参数:输入框前面显示的文本内容
//第二个参数:输入框里面显示的文本内容
//返回值:每次输入的内容
player.playerName = EditorGUILayout.TextField("玩家名字:", player.playerName);
//针对int类型
player.id = EditorGUILayout.IntField("玩家ID:", player.id);
//针对float类型
player.hp = EditorGUILayout.FloatField("玩家血量:", player.hp);
//针对bool类型
player.sex = EditorGUILayout.Toggle("玩家性别:", player.sex);
//针对枚举的单选
player.type = (Player.PlayerType)EditorGUILayout.EnumPopup("玩家职业:", player.type);
//针对枚举的多选,对于每个枚举值对应的int值是2的n次方,类似标签和层级的枚举
player.work = (Player.PlayerWork)EditorGUILayout.EnumMaskField("玩家职业:", player.work);
//针对向量类型
player.birthPosition = EditorGUILayout.Vector3Field("玩家出生位置", player.birthPosition);
//针对颜色类型
player.color = EditorGUILayout.ColorField("玩家颜色", player.color);
//对于基类是Object类型的对象,我们可以使用这种方式去查找相应的变量
//第一个参数,显示的标签
//第二个参数,要找的变量
//第三个参数,该变量的类型,一般使用typeof(类型)
//第四个参数,是否可以使用场景中的物体
player.weaponObj = (GameObject)EditorGUILayout.ObjectField("武器的对象", player.weaponObj, typeof(GameObject), true);
player.tex = (Texture)EditorGUILayout.ObjectField("玩家的贴图", player.tex, typeof(Texture), true);
player.weapon = (Weapon)EditorGUILayout.ObjectField("武器的脚本", player.weapon, typeof(Weapon), false);
//终极方法,支持各种类型
//通过变量的名字来获取序列化的对象
SerializedProperty items = serializedObject.FindProperty("items");
//绘制序列化的对象,
//第二个参数:显示的名字
//第三个参数:true证明该对象里的所有的属性也是可以序列化的
EditorGUILayout.PropertyField(items, new GUIContent("物品:"), true);
//针对类的
SerializedProperty pet = serializedObject.FindProperty("pet");
EditorGUILayout.PropertyField(pet, new GUIContent("宠物:"), true);
//用于保存序列化的对象,如果没有这个方法,对对象的修改无效
serializedObject.ApplyModifiedProperties();
//布局调整
EditorGUILayout.BeginHorizontal();//开始水平布局
player.playerName = EditorGUILayout.TextField("玩家名字:", player.playerName);
player.id = EditorGUILayout.IntField("玩家ID:", player.id);
EditorGUILayout.EndHorizontal();//结束水平布局
//针对float类型的滑动条,第三个和第四个参数,最小值和最大值
player.maxHp = EditorGUILayout.Slider("玩家的最大血量:", player.maxHp, , );
//针对float类型的
player.hp = EditorGUILayout.FloatField("玩家血量:", player.hp);
//获取自动布局的位置信息,按照顺序往后的位置
Rect rect = GUILayoutUtility.GetRect(, );
//绘制一个进度条
EditorGUI.ProgressBar(rect, player.hp / player.maxHp, "玩家的血量");
//绘制提示信息
player.atk = EditorGUILayout.FloatField("攻击力", player.atk);
if (player.atk > )
{
EditorGUILayout.HelpBox("攻击力太高了", MessageType.Error);
}
else if (player.atk < )
{
EditorGUILayout.HelpBox("攻击力太低了", MessageType.Warning);
}
else
{
EditorGUILayout.HelpBox("攻击力适中", MessageType.Info);
}
}
private void OnDisable()
{
Debug.Log("OnDisable");
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour {
public string playerName;
public int id;
public float hp;
public float maxHp;
public bool sex;
public PlayerType type;
public PlayerWork work;
public Vector3 birthPosition;
public Color color;
public GameObject weaponObj;
public Texture tex;
public Weapon weapon;
public Pet pet;
public List<string> items;
public float atk;
[ContextMenu("打印")]
private void DebugMessage()
{
Debug.Log(playerName);
Debug.Log("宠物的名字:" + pet.name);
}
public enum PlayerType//针对枚举的单选
{
战士,//战士,0,0000
法师,//法师,1,0001
牧师,//牧师,2,0010
术士,//术士,3,0011 = 0001或上0010,针对枚举的多选时,选择刺客会同时选上法师和道士
盗贼,//盗贼,4,0100
猎人,//猎人,5,0101
}
public enum PlayerWork//针对枚举的多选,对于每个枚举值对应的int值是2的n次方
{
分解师 = ,//分解师,0,0001
炼金师 = ,//炼金师,0,0010
采矿师 = ,//采矿师,0,0100
锻造师 = ,//锻造师,0,1000
}
[System.Serializable]
public class Pet
{
public string name;
public float hp;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;//2、引用命名空间UnityEditor
//1、先创建一个处理窗口的类
public class WindowEditor : EditorWindow//3、继承EditorWindow类
{
[MenuItem("MyMenu/创建窗口")]
static void CreateWindow()
{
//4、创建一个创建
EditorWindow.GetWindow<WindowEditor>();
}
//5、利用OnEnable方法和OnDisable方法,实现初始化和清理工作
public void OnEnable()
{
Debug.Log("OnEnable");
}
public GameObject obj;
private Vector2 scrollPosition;
//6、利用OnGUI方法实现对窗口内容的绘制
private void OnGUI()
{
//Debug.Log("OnGUI");
EditorGUILayout.LabelField("我的窗口");
//绘制一个进度条
Rect rect = GUILayoutUtility.GetRect(,);
EditorGUI.ProgressBar(rect, 0.5f, "玩家血量");
//对于基类是Object类型的对象
obj = (GameObject)EditorGUILayout.ObjectField("GameObject", obj, typeof(GameObject), true);
//绘制滚动窗口
scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);
for (int i = ; i < ; i++)
{
EditorGUILayout.LabelField("我的窗口");
}
EditorGUILayout.EndScrollView();
}
public void OnDisable()
{
Debug.Log("OnDisable");
}
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BagData
{
private static BagData instance;
public static BagData Instance
{
get { return instance; }
}
public static void SetInstance(BagData bag)
{
if (bag == null)
{
instance = new BagData();
instance.items = new List<ItemData>();
}
else
{
instance = bag;
}
}
private BagData() { }
public List<ItemData> items;
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class BagDataWindow : EditorWindow
{
[MenuItem("MyMenu/背包数据窗口")]
static void CreateWindow()
{
EditorWindow.GetWindow<BagDataWindow>();
}
private void OnEnable()
{
string json = FileTools.ReadJson(Application.streamingAssetsPath + "/BagJson.txt");
if (json == "")
{
BagData.SetInstance(null);
}
else
{
BagData.SetInstance(JsonUtility.FromJson<BagData>(json));
}
Debug.Log(BagData.Instance.items.Count);
data = new ItemData();
}
private Vector2 scrollPosition;
private ItemData data;
private Texture itemTex;
private void OnGUI()
{
GUI.skin.label.alignment = TextAnchor.MiddleCenter;
GUI.skin.label.fontSize = ;
GUILayout.Label("背包数据");
GUILayout.Space();
scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);
for (int i = ; i < BagData.Instance.items.Count; i++)
{
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("ID:" + BagData.Instance.items[i].ID);
EditorGUILayout.LabelField("ID:" + BagData.Instance.items[i].itemName);
EditorGUILayout.LabelField("ID:" + BagData.Instance.items[i].iconName);
if (GUILayout.Button("删除"))
{
BagData.Instance.items.Remove(BagData.Instance.items[i]);
}
EditorGUILayout.EndHorizontal();
}
EditorGUILayout.EndScrollView();
EditorGUILayout.BeginHorizontal();
data.ID = EditorGUILayout.IntField("物品ID:", data.ID);
data.itemName = EditorGUILayout.TextField("物品名字:", data.itemName);
itemTex = (Texture)EditorGUILayout.ObjectField("物品图片:", itemTex, typeof(Texture), false);
if (GUILayout.Button("添加"))
{
bool isFindID = false;
for (int i = ; i < BagData.Instance.items.Count; i++)
{
if (BagData.Instance.items[i].ID == data.ID)
{
isFindID = true;
break;
}
}
if (isFindID)
{
Debug.LogError("ID重复了");
}
else
{
data.iconName = itemTex.name;
BagData.Instance.items.Add(data);
data = new ItemData();
for (int i = ; i < BagData.Instance.items.Count; i++)
{
if (data.ID < BagData.Instance.items[i].ID)
{
data.ID = BagData.Instance.items[i].ID;
}
}
data.ID++;
}
}
EditorGUILayout.EndHorizontal();
bool isID = false;
for (int i = ; i < BagData.Instance.items.Count; i++)
{
if (BagData.Instance.items[i].ID == data.ID)
{
isID = true;
break;
}
}
if (isID)
{
EditorGUILayout.HelpBox("ID重复了", MessageType.Error);
}
}
private void OnDisable()
{
//关闭界面时,需要把数据写入到Json
string json = JsonUtility.ToJson(BagData.Instance, true);
FileTools.WriteJson(Application.streamingAssetsPath + "/BagJson.txt", json);
}
}
Unity3D学习笔记(二十八):Editor的更多相关文章
- Java学习笔记二十八:Java中的接口
Java中的接口 一:Java的接口: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承 ...
- Java基础学习笔记二十八 管家婆综合项目
本项目为JAVA基础综合项目,主要包括: 熟练View层.Service层.Dao层之间的方法相互调用操作.熟练dbutils操作数据库表完成增删改查. 项目功能分析 查询账务 多条件组合查询账务 添 ...
- Unity3D学习笔记(十八):动画内容补充
动画系统: 旧动画系统(帧动画系统:关键帧驱动,关键帧记录的数据进行插值移动) 1.添加Animation,添加到父物体上 2.添加动画片段 3.添加关键帧(子物体的坐标是相对于父物体的坐标),帧之间 ...
- angular学习笔记(二十八-附2)-$http,$resource中的promise对象
下面这种promise的用法,我从第一篇$http笔记到$resource笔记中,一直都有用到: HttpREST.factory('cardResource',function($resource) ...
- angular学习笔记(二十八-附1)-$resource中的资源的方法
通过$resource获取到的资源,或者是通过$resource实例化的资源,资源本身就拥有了一些方法,$save,$delete,$remove,可以直接调用来保存该资源: 比如有一个$resour ...
- angular学习笔记(二十八)-$http(6)-使用ngResource模块构建RESTful架构
ngResource模块是angular专门为RESTful架构而设计的一个模块,它提供了'$resource'模块,$resource模块是基于$http的一个封装.下面来看看它的详细用法 1.引入 ...
- PHP学习笔记二十八【抽象类】
<?php //定义一个抽象类.主要用来被继承 //如果一个类继承了抽象类,则它必须实现该抽象类的所有抽象方法(除非它自己也是抽象类) // abstract class Animal{ pub ...
- Java框架spring 学习笔记(十八):事务管理(xml配置文件管理)
在Java框架spring 学习笔记(十八):事务操作中,有一个问题: package cn.service; import cn.dao.OrderDao; public class OrderSe ...
- python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码
python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ...
- python3.4学习笔记(二十五) Python 调用mysql redis实例代码
python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...
随机推荐
- Linux 运维测试及第三应用及测试工具
一 .第三方应用及测试工具链接地址 https://pan.baidu.com/s/1rLQ5NCZvxcy93YQ4fGFaBQ 1.linux LSI系列raid卡监测工具 1)使用参数详解链接: ...
- C#基础知识整理
年时,北风吹雁雪纷纷,一条秋裤冻上头.冷的连手都懒得动,就随便翻翻书,也没有更新博客,如今年已过,开始投入到正常的工作状态中,趁现在需求还没有来,把C#基础知识梳理一下,其实一直以来就想这样做的,对于 ...
- js异步计时器
js中同步和异步的区别: 1.同步会阻塞代码执行,而异步不会 2.alert 是同步,setTimeout 是异步 何时需要异步 1.在可能发生等待的情况 2.等待过程中不能像 alert 一样阻塞程 ...
- Mysql相关技术细节整理
一.错误日志相关 1.mysql错误日志所在位置 windows下,错误日志文件一般在安装目录下的data目录下.扩展名是.err的文件,也可以打开安装目录下的my.ini文件检查一下linux下,错 ...
- Linux基础命令---忽略挂起信号nohup
nohup nohup可以使程序能够忽略挂起信号,继续运行.用户退出时会挂载,而nohup可以保证用户退出后程序继续运行.如果标准输入是终端,请将其从/dev/null重定向.如果标准输出是终端,则将 ...
- vue-i18n国际化插件
vue-i18n国际化插件 安装,到项目目录下执行:npm install vue-i18n 配置在src\main.js里面引入vue-i18n // 语言包插件import VueI18n fro ...
- 2018年Android面试题含答案--适合中高级
1.java中==和equals和hashCode的区别 基本数据类型的==比较的值相等. 类的==比较的内存的地址,即是否是同一个对象,在不覆盖equals的情况下,同比较内存地址,原实现也为 = ...
- Chrome插件消息传递实例
首先吐槽"360极速浏览器应用开发平台"的开发文档,在消息传递(http://open.chrome.360.cn/extension_dev/messaging.html)一节中 ...
- Django框架----模板语法
Django模板系统 官方文档 一.什么是模板? 只要是在html里面有模板语法就不是html文件了,这样的文件就叫做模板. 二.模板语法分类 只需要记两种特殊符号: {{ }}和 {% %} 变量 ...
- vue -resource 文件提交提示process,或者拦截处理
this.$http.post('url',fd||data,{emulateJSON:true}).then(fn(res){},fn(res){}) process成功案例 _self.$http ...