using System.Collections; using System.Collections.Generic; using UnityEngine; [RequireComponent(typeof(Rigidbody))] [ExecuteInEditMode] //[AddComponentMenu("LessonMonoEditor")] [AddComponentMenu("Lesson/MonoEditor")] public class LessonMonoEditor : MonoBehaviour { [Header("玩家的信息")]//显示标题 [Space(10)] [Tooltip("玩家名字")]//鼠标悬停,显示信息 public string playerName; [Delayed()] public int id; [HideInInspector]//面板隐藏(可序列化) public int id1; [SerializeField]//面板显示(可序列化标识) private bool sex; [System.NonSerialized]//面板隐藏(不可序列化标识) public bool sex1; [Range(1, 1000)]//滑动条 public float hp; [Range(1, 50)] public int level; [Multiline(5)] public string message;//多行显示 [TextArea()] public string message1;//带滑动条的多行显示 [ContextMenuItem("function", "Test")] [TextArea(2, 5)] public string message2; // Use this for initialization void Start() { hp = 2000; 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;//一、引用命名空间 [CustomEditor(typeof(Player))]//三、关联该类扩展开发的脚本 public class PlayerEditor : Editor//二、继承Editor类 { public Player player; //四、利用OnEnable和OnDisable作一些初始化和清理的工做 private void OnEnable() { //五、利用Target来获取到你选择的物体上的LessonPlayer对象 player = (Player)target; Debug.Log("OnEnable:" + player.gameObject.name); } //六、重写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, 100, 5000); //针对float类型的 player.hp = EditorGUILayout.FloatField("玩家血量:", player.hp); //获取自动布局的位置信息,按照顺序日后的位置 Rect rect = GUILayoutUtility.GetRect(50, 50); //绘制一个进度条 EditorGUI.ProgressBar(rect, player.hp / player.maxHp, "玩家的血量"); //绘制提示信息 player.atk = EditorGUILayout.FloatField("攻击力", player.atk); if (player.atk > 100) { EditorGUILayout.HelpBox("攻击力过高了", MessageType.Error); } else if (player.atk < 10) { 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次方 { 分解师 = 1,//分解师,0,0001 炼金师 = 2,//炼金师,0,0010 采矿师 = 4,//采矿师,0,0100 锻造师 = 8,//锻造师,0,1000 } [System.Serializable] public class Pet { public string name; public float hp; } }
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor;//二、引用命名空间UnityEditor //一、先建立一个处理窗口的类 public class WindowEditor : EditorWindow//三、继承EditorWindow类 { [MenuItem("MyMenu/建立窗口")] static void CreateWindow() { //四、建立一个建立 EditorWindow.GetWindow<WindowEditor>(); } //五、利用OnEnable方法和OnDisable方法,实现初始化和清理工做 public void OnEnable() { Debug.Log("OnEnable"); } public GameObject obj; private Vector2 scrollPosition; //六、利用OnGUI方法实现对窗口内容的绘制 private void OnGUI() { //Debug.Log("OnGUI"); EditorGUILayout.LabelField("个人窗口"); //绘制一个进度条 Rect rect = GUILayoutUtility.GetRect(50,50); EditorGUI.ProgressBar(rect, 0.5f, "玩家血量"); //对于基类是Object类型的对象 obj = (GameObject)EditorGUILayout.ObjectField("GameObject", obj, typeof(GameObject), true); //绘制滚动窗口 scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition); for (int i = 0; i < 50; 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 = 24; GUILayout.Label("背包数据"); GUILayout.Space(20); scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition); for (int i = 0; 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 = 0; 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 = 0; 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 = 0; 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); } }