经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 游戏设计 » 查看文章
Unity---Inspector面板自定义
来源:cnblogs  作者:小辉歌  时间:2019/2/25 9:10:33  对本文有异议

一. 参数自定义

一个含有成员的类Player

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class Player : MonoBehaviour
  5. {
  6. public int id;
  7. public string playerName;
  8. public string backStory;
  9. public float health;
  10. public float damage;
  11. public float weaponDamage1, weaponDamage2;
  12. public string shoeName;
  13. public int shoeSize;
  14. public string shoeType;
  15. void Start()
  16. {
  17. health = 50;
  18. }
  19. }

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

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

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEditor;
  5. //CustomEditor(typeof()) 用于关联你要自定义的脚本
  6. [CustomEditor(typeof(Player))]
  7. //必须要让该类继承自Editor,且不需要导入UnityEditor程序集
  8. public class PlayerInspector : Editor
  9. {
  10. Player player;
  11. bool showWeapons;
  12. void OnEnable()
  13. {
  14. //获取当前编辑自定义Inspector的对象
  15. player = (Player)target;
  16. }
  17. //执行这一个函数来一个自定义检视面板
  18. public override void OnInspectorGUI()
  19. {
  20. //设置整个界面是以垂直方向来布局
  21. EditorGUILayout.BeginVertical();
  22. //空两行
  23. EditorGUILayout.Space();
  24. EditorGUILayout.Space();
  25. //绘制palyer的基本信息
  26. EditorGUILayout.LabelField("Base Info");
  27. player.id = EditorGUILayout.IntField("Player ID", player.id);
  28. player.playerName = EditorGUILayout.TextField("PlayerName", player.playerName);
  29. //空三行
  30. EditorGUILayout.Space();
  31. EditorGUILayout.Space();
  32. EditorGUILayout.Space();
  33. //绘制Player的背景故事
  34. EditorGUILayout.LabelField("Back Story");
  35. player.backStory = EditorGUILayout.TextArea(player.backStory, GUILayout.MinHeight(100));
  36. //空三行
  37. EditorGUILayout.Space();
  38. EditorGUILayout.Space();
  39. EditorGUILayout.Space();
  40. //使用滑块绘制 Player 生命值
  41. player.health = EditorGUILayout.Slider("Health", player.health, 0, 100);
  42. //根据生命值设置生命条的背景颜色
  43. if (player.health < 20)
  44. {
  45. GUI.color = Color.red;
  46. }
  47. else if (player.health > 80)
  48. {
  49. GUI.color = Color.green;
  50. }
  51. else
  52. {
  53. GUI.color = Color.gray;
  54. }
  55. //指定生命值的宽高
  56. Rect progressRect = GUILayoutUtility.GetRect(50, 50);
  57. //绘制生命条
  58. EditorGUI.ProgressBar(progressRect, player.health / 100.0f, "Health");
  59. //用此处理,以防上面的颜色变化会影响到下面的颜色变化
  60. GUI.color = Color.white;
  61. //空三行
  62. EditorGUILayout.Space();
  63. EditorGUILayout.Space();
  64. EditorGUILayout.Space();
  65. //使用滑块绘制伤害值
  66. player.damage = EditorGUILayout.Slider("Damage", player.damage, 0, 20);
  67. //根据伤害值的大小设置显示的类型和提示语
  68. if (player.damage < 10)
  69. {
  70. EditorGUILayout.HelpBox("伤害太低了吧!!", MessageType.Error);
  71. }
  72. else if (player.damage > 15)
  73. {
  74. EditorGUILayout.HelpBox("伤害有点高啊!!", MessageType.Warning);
  75. }
  76. else
  77. {
  78. EditorGUILayout.HelpBox("伤害适中!!", MessageType.Info);
  79. }
  80. //空三行
  81. EditorGUILayout.Space();
  82. EditorGUILayout.Space();
  83. EditorGUILayout.Space();
  84. //设置内容折叠
  85. showWeapons = EditorGUILayout.Foldout(showWeapons, "Weapons");
  86. if (showWeapons)
  87. {
  88. player.weaponDamage1 = EditorGUILayout.FloatField("Weapon 1 Damage", player.weaponDamage1);
  89. player.weaponDamage2 = EditorGUILayout.FloatField("Weapon 2 Damage", player.weaponDamage2);
  90. }
  91. //空三行
  92. EditorGUILayout.Space();
  93. EditorGUILayout.Space();
  94. EditorGUILayout.Space();
  95. //绘制鞋子信息
  96. EditorGUILayout.LabelField("Shoe");
  97. //以水平方向绘制
  98. EditorGUILayout.BeginHorizontal();
  99. EditorGUILayout.LabelField("Name", GUILayout.MaxWidth(50));
  100. player.shoeName = EditorGUILayout.TextField(player.shoeName);
  101. EditorGUILayout.LabelField("Size", GUILayout.MaxWidth(50));
  102. player.shoeSize = EditorGUILayout.IntField(player.shoeSize);
  103. EditorGUILayout.LabelField("Type", GUILayout.MaxWidth(50));
  104. player.shoeType = EditorGUILayout.TextField(player.shoeType);
  105. EditorGUILayout.EndHorizontal();
  106. EditorGUILayout.EndVertical();
  107. }
  108. }

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

 

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

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

二. 编辑时运行

代码:

  1. [ExecuteInEditMode]
  2. public class Test : MonoBehaviour
  3. {
  4. // Update is called once per frame
  5. void Update()
  6. {
  7. transform.LookAt(Vector3.zero);
  8. }
  9. }

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

原文链接:http://www.cnblogs.com/xiaoahui/p/10420626.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号