当前位置:   article > 正文

Unity Editor编辑器实用扩展_unity listtopopup

unity listtopopup

目录

备忘:Unity编辑器常用路径

1.MenuItem使用方法

 .Unity编辑器工具栏扩展;

   .Inspector工具栏扩展;

   .Hierarchy工具栏扩展;

   .Project工具栏扩展。

2.ContextMenu和ConTextMenuItem:

3.Selection类

4.编辑器实用方法汇总

5.inspector 扩展GM工具

6.Inspector_PopList

7.MenuTool查找预制中的中文

8.unity 检测 资源导入


备忘:Unity编辑器常用路径

   // System.Environment.CurrentDirectory : 在Unity中指工程的跟目录,即与Assets目录是平级的。

  1. ex:
  2. BuildPipeline.BuildPlayer(scenes, System.Environment.CurrentDirectory+"xcode", BuildTarget.iOS, BuildOptions.None);

1.MenuItem使用方法

♦ 参数

MenuItem("Tools/Test", true, 23):

1.菜单路径,以/分割;

2.是否为验证函数,默认为false;

3.菜单的优先级,数字越小显示在越上方。并且俩相邻菜单间差距为11以上的优先级会被分为两组,即菜单间会多个分隔线。默认为1000。

♦ 菜单的快捷键

单独的一个按键以“空格 + 下划线 + 想要的按键”增加在路径后缀,空格千万不要忘记。

“Tools/Test _g”,即在Unity中按下g就可以直接执行该菜单。

以“Tools/Test %&g”表示按住ctrl和alt,再按下g就能触发。特殊符号:%(ctrl/cmd)、#(shift)、&(alt)。

其他支持的按键:LEFT、RIGHT、UP、DOWN、F1..F12、HOME、END、PGUP、PGDN。

当然也支持类似#LEFT是左shift之类的按键。

♦ 菜单使用注意

1.创建GameObject时,使用GameObjectUtility.SetParentAndAlign方法设置父节点,可以重置坐标;

2.使用类似于Undo.RegisterCreatedObjectUndo方法注册撤销操作(这个我们之后在讨论)。

 .Unity编辑器工具栏扩展;

  1. [MenuItem("Tools/Test", false, 23)]
  2. public static void Test()
  3. {
  4. Debug.Log("Test");
  5. }
  6. [MenuItem("Tools/Test", true, 23)]
  7. public static bool ValidateTest()
  8. {
  9. return true;
  10. }

   .Inspector工具栏扩展;

为脚本右键添加菜单

  1. [MenuItem("CONTEXT/Transform/Test4")]
  2. public static void Test4()
  3. {
  4. Debug.Log("Test4");
  5. }

   .Hierarchy工具栏扩展;

Hierarchy窗口下的右键菜单就是GameObject菜单栏中的部分菜单

  1. [MenuItem("GameObject/Test2", false, 11)]
  2. public static void PasteTRValue()
  3. {
  4. Debug.Log("Test2");
  5. }

   .Project工具栏扩展。

Project中的是Assets所有的。

  1. [MenuItem("Assets/Test3", false)]
  2. public static void Test3()
  3. {
  4. Debug.Log("Test3");
  5. }

2.ContextMenu和ConTextMenuItem:

Inspector窗口中添加菜单,但与MenuItem不同的是写在本身Component脚本中,也就是隶属于UnityEngine

♦ ContextMenuItem参数

ContextMenuItem("Add Hour", "AddHour", order = 1):

1.菜单的名称;

2.菜单执行的方法,要求脚本中必须有;

3.按钮的先后顺序。

  1. using UnityEngine;
  2. public class Clock : MonoBehaviour
  3. {
  4. //在右键变量名称时添加菜单
  5. [ContextMenuItem("Add Hour", "AddHour", order = 1)]
  6. public int Hour = 10;
  7. public void AddHour()
  8. {
  9. Hour += 1;
  10. }
  11. [ContextMenu("Sub Hour", false, 10)]
  12. public void SubHour()
  13. {
  14. Hour -= 1;
  15. }
  16. }

3.Selection类

通过Selection类可以在编辑器下对选择的物体进行操作

  1. using UnityEngine;
  2. using UnityEditor;
  3. public class SelectionTest : EditorWindow
  4. {
  5. [MenuItem("Tool/DebugSelected")]
  6. private static void Test()
  7. {
  8. Debug.Log(Selection.activeObject);//返回当前在面板上选择的游戏物体Object,未选择则返回Null。可以选择Project文件夹下的任意资源(选择多个则返回第一个选择的游戏物体)
  9. Debug.Log(Selection.activeGameObject);//返回当前在面板上选择的游戏物体GameObject,未选择则返回Null。可以选择Project文件夹下的游戏物体(选择多个则返回第一个选择的游戏物体)
  10. Debug.Log(Selection.activeTransform);//返回当前在面板上选择的游戏物体的Transform,未选择则返回Null(选择多个则返回第一个选择的游戏物体)
  11. Debug.Log(Selection.gameObjects.Length); //返回当前在面板上选择的游戏物体GameObject数组,未选择则返回Null。可以选择Project文件夹下的游戏物体
  12. Debug.Log(Selection.transforms); //返回当前在面板上选择的游戏物体Transform数组,未选择则返回Null
  13. Selection.Contains(Selection.instanceIDs[0]);
  14. Selection.Contains(Selection.gameObjects[0]);
  15. Selection.selectionChanged += OnSelectionChange;//委托,选择的物体变化时调用
  16. }
  17. /// <summary>
  18. /// 选择的物体变化时调用的委托
  19. /// </summary>
  20. private static void OnSelectionChange()
  21. {
  22. Debug.Log("OnSelectionChange");
  23. }
  24. }

4.编辑器实用方法汇总

  1. //1.编辑器内物体查找(指定路径下搜索类型是scene/object.. ,并且名字中包含unity的文件)
  2. var mlist = new List<string>(AssetDatabase.FindAssets("unity t:scene", new string[] { "Assets/path" }));
  3. //2. 定位
  4. EditorGUIUtility.PingObject(AssetDatabase.LoadAssetAtPath("filePath",typeof(UnityEngine.Object)));
  5. //3.搜集编辑器引用
  6. AssetDatabase.GetDependencies("pathName");
  7. EditorUtility.CollectDependencies("Objects[]");
  8. //4.选中查找 只有Object类型好使
  9. UnityEditor.Selection.GetFiltered(typeof(Object),SelectionMode.DeepAssets)
  10. //持续更新中... ...

5.inspector 扩展GM工具

使用方法:

将Inspector_GMOrder 放到编辑器目录下。

将GM_Order 挂载到游戏对象上

  1. public class GM_Order : MonoBehaviour {
  2. // Use this for initialization
  3. void Start () {
  4. }
  5. // Update is called once per frame
  6. void Update () {
  7. }
  8. }
  9. [CustomEditor(typeof(GM_Order))]
  10. public class Inspector_GMOrder : Editor
  11. {
  12. string gm_value = "";
  13. public override void OnInspectorGUI()
  14. {
  15. gm_value = GUILayout.TextField(gm_value);
  16. if (GUILayout.Button("获得指定车辆"))
  17. {
  18. for (int i = 1; i < 15; i++)
  19. {
  20. PassionSpeedMgrData.inst.SavePrefs(i);
  21. }
  22. //Hero.Inst.HeroReLive();
  23. }
  24. if (GUILayout.Button("暂定"))
  25. {
  26. //UserInfo.GetInst().myDiamond = 99;
  27. }
  28. }
  29. }

6.Inspector_PopList

将指定文件目录内资源条目已pop类型展示在inspector面板中

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEditor;
  5. using UnityEngine;
  6. //自定义Tset脚本
  7. [CustomEditor(typeof(BossBulletManager))]
  8. public class Inspector_PopList : Editor
  9. {
  10. static public string DrawList(string field, string[] list, string selection, params GUILayoutOption[] options)
  11. {
  12. if (list != null && list.Length > 0)
  13. {
  14. int index = 0;
  15. if (string.IsNullOrEmpty(selection)) selection = list[0];
  16. // We need to find the sprite in order to have it selected
  17. if (!string.IsNullOrEmpty(selection))
  18. {
  19. for (int i = 0; i < list.Length; ++i)
  20. {
  21. if (selection.Equals(list[i], StringComparison.OrdinalIgnoreCase))
  22. {
  23. index = i;
  24. break;
  25. }
  26. }
  27. }
  28. // Draw the sprite selection popup
  29. //EditorGUILayout.BeginHorizontal(EditorStyles.toolbarPopup);
  30. index = string.IsNullOrEmpty(field) ?
  31. EditorGUILayout.Popup(index, list) :
  32. EditorGUILayout.Popup(field, index, list);
  33. //EditorGUILayout.EndHorizontal();
  34. return list[index];
  35. }
  36. return null;
  37. }
  38. //在这里方法中就可以绘制面板。
  39. public override void OnInspectorGUI()
  40. {
  41. //得到Test对象
  42. var test = (BossBulletManager)target;
  43. test.bossBulletType = DrawList("", ThreeToOneManager.Inst.ListToEnum("/Resources/BossBullet/ShotPattern/"), test.bossBulletType);
  44. if (GUILayout.Button("播放当前子弹类型"))
  45. {
  46. BossBulletManager.Inst.AddBossBullet(test.bossBulletType);
  47. }
  48. if (GUILayout.Button("增加当前子弹类型"))
  49. {
  50. BossBulletManager.Inst.AddBulletType(test.bossBulletType);
  51. }
  52. if (GUILayout.Button("演示队列子弹类型"))
  53. {
  54. BossBulletManager.Inst.PalyBulletTypeList();
  55. }
  56. base.OnInspectorGUI();
  57. for (int i = 0; i < test.bulletTypeList.Count; i++)
  58. {
  59. test.bulletTypeList[i] = DrawList("", ThreeToOneManager.Inst.ListToEnum("/Resources/BossBullet/ShotPattern/"), test.bulletTypeList[i]);
  60. }
  61. }
  62. }

获取文件夹条目方法:

  1. public string[] ListToEnum(string _path)
  2. {
  3. var path = UnityEngine.Application.dataPath + _path;//"/Resources/BossBullet/ShotPattern/";
  4. var paras = Directory.GetFiles(path, "*.prefab")
  5. .Select(s => s.Substring(s.LastIndexOf('/') + 1, s.Length - s.LastIndexOf('/') - 1))
  6. .Select(b=> b.Substring(0,b.LastIndexOf('.')) ).ToArray();
  7. return paras;
  8. }

7.MenuTool查找预制中的中文

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEditor;
  5. using System.Text.RegularExpressions;
  6. using TMPro;
  7. using System.IO;
  8. using System;
  9. public class UiPrefabs
  10. {
  11. [MenuItem("Tools/检查预设中文并且生成路径")]
  12. static void CheckChinesePrefabsAndSerialization()
  13. {
  14. string[] prefabPaths = GetAllPrefabs("Assets/Prefab");
  15. if (prefabPaths == null)
  16. {
  17. return;
  18. }
  19. List<string> text = new List<string>();
  20. for (int i = 0; i < prefabPaths.Length; i++)
  21. {
  22. string prefabPath = prefabPaths[i];
  23. GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(prefabPath);
  24. if (prefab == null)
  25. {
  26. continue;
  27. }
  28. //UIText或者是其它文本组件
  29. TextMeshProUGUI[] uiLabels = prefab.GetComponentsInChildren<TextMeshProUGUI>(true);
  30. for (int j = 0; j < uiLabels.Length; j++)
  31. {
  32. TextMeshProUGUI uiLabel = uiLabels[j];
  33. if (IsIncludeChinese(uiLabel.text))
  34. {
  35. Debug.LogError(string.Format("路径:{0} 预设名:{1} 对象名:{2} 中文:{3}", prefabPath, prefab.name, uiLabel.name, uiLabel.text));
  36. text.Add(uiLabel.text);
  37. }
  38. }
  39. //进度条
  40. float progressBar = (float)i / prefabPaths.Length;
  41. EditorUtility.DisplayProgressBar("检查预设中文", "进度 :" + ((int)(progressBar * 100)).ToString() + "%", progressBar);
  42. }
  43. EditorUtility.ClearProgressBar();
  44. AssetDatabase.Refresh();
  45. Debug.Log("完成检查预设中文并且生成路径");
  46. }
  47. //string path = "Assets/UI/Prefab";
  48. static string[] GetAllPrefabs(string directory)
  49. {
  50. if (string.IsNullOrEmpty(directory) || !directory.StartsWith("Assets"))
  51. throw new ArgumentException("folderPath");
  52. string[] subFolders = Directory.GetDirectories(directory);
  53. string[] guids = null;
  54. string[] assetPaths = null;
  55. int i = 0, iMax = 0;
  56. foreach (var folder in subFolders)
  57. {
  58. guids = AssetDatabase.FindAssets("t:Prefab", new string[] { folder });
  59. assetPaths = new string[guids.Length];
  60. for (i = 0, iMax = assetPaths.Length; i < iMax; ++i)
  61. {
  62. assetPaths[i] = AssetDatabase.GUIDToAssetPath(guids[i]);
  63. }
  64. }
  65. return assetPaths;
  66. }
  67. public static bool IsIncludeChinese(string content)
  68. {
  69. string regexstr = @"[\u4e00-\u9fa5]";
  70. if (Regex.IsMatch(content, regexstr))
  71. {
  72. return true;
  73. }
  74. else
  75. {
  76. return false;
  77. }
  78. }
  79. }

8.unity 检测 资源导入

用途:当向Unity导入 纹理资源、音效、fbx 等所有Unity支持格式的资源,想通过代码来修改或者验证资源命名是否合乎规范,如果已经在Unity中了则可以在 Assets 文件夹内鼠标右键 然后点击 Reimport,也会执行下面的逻辑

创建一个 Editor 文件夹,然后在Editor 文件夹中随便创建一个脚本,脚本命名随意
添加 using UnityEditor;
继承 AssetPostprocessor

  1. using UnityEngine;
  2. using UnityEditor;
  3. public class TextureAssetCheck : AssetPostprocessor
  4. {
  5. // 纹理导入之前调用
  6. public void OnPreprocessTexture()
  7. {
  8. // 可以修改一些属性或者使用代码验证纹理的命名是否合乎规范
  9. TextureImporter textureImporter = assetImporter as TextureImporter;
  10. Debug.LogError("Pre Texture:" + textureImporter.assetPath);
  11. }
  12. // 纹理导入之后调用
  13. public void OnPostprocessTexture(Texture2D texture)
  14. {
  15. TextureImporter textureImporter = assetImporter as TextureImporter;
  16. Debug.LogError("Post Texutre:" + assetPath.ToLower());
  17. Debug.LogError("Post Texture:" + texture.width + " " + texture.height);
  18. }
  19. // 所有资源导入都会调用这里
  20. public void OnPreprocessAsset()
  21. {
  22. //目录信息也会被获取到
  23. //Debug.LogError("Asset:" + assetImporter.assetPath);
  24. }
  25. /// <summary>
  26. /// 在任意数量的资源导入完成后调用
  27. /// 此函数必须声明为 static
  28. /// </summary>
  29. /// <param name="importedAssets"></param>
  30. /// <param name="deletedAssets"></param>
  31. /// <param name="movedAssets"></param>
  32. /// <param name="movedFromAssetPaths"></param>
  33. static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
  34. {
  35. foreach(var asset in importedAssets)
  36. {
  37. Debug.LogError("import:" + asset);
  38. }
  39. foreach (var asset in deletedAssets)
  40. {
  41. Debug.LogError("delete:" + asset);
  42. }
  43. foreach (var asset in movedAssets)
  44. {
  45. Debug.LogError("move:" + asset);
  46. }
  47. foreach (var asset in movedFromAssetPaths)
  48. {
  49. Debug.LogError("moveFromAsset:" + asset);
  50. }
  51. }
  52. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/115325
推荐阅读
相关标签
  

闽ICP备14008679号