Unity何时调用Inspector初始化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity何时调用Inspector初始化相关的知识,希望对你有一定的参考价值。
参考技术A 学习用球撞击墙的脚本, 我写好脚本后,将其作为控件添加至摄像机. 公共变量被自动识别出来. 后来我觉得发射速度慢了就去直接修改脚本中公共变量的值, 保存重新运行游戏,发现该值并不会更新到Inspector面板对应属性上.(只有第一次添加脚本至该游戏对象才显示.) 这种现象是正常的吗?而且我在声明时赋值,运行一次游戏后,再在脚本中改变这个赋值再运行游戏, 游戏并不会更新数据,依旧以未更新的面板数值为基准. 正常吗?
如果这种现象是正常的话,那是否公共变量的初始化都不应该放在外面 而应该放在Start()里面了.
那Inspector的对应属性面板不是没啥用途?.....
扩展Unity Inspector
Unity Editor下,可以在不改变原有布局的情况下扩展Inspect的界面。
在继承了Editor的类中,有两种实现方式:
using UnityEditor; [CustomEditor(typeof(CustomClass))] public class CustomClassEditor : Editor { public override void OnInspectorGUI() { // 自定义代码 base.OnInspectorGUI(); // 自定义代码 } }
和
using UnityEditor; [CustomEditor(typeof(CustomClass))] public class CustomClassEditor : Editor { public override void OnInspectorGUI() { // 自定义代码 DrawDefaultInspector(); // 自定义代码 } }
当然,这两种方式对开发者自定义的组件的显示是没有问题的,因为自定义的组件本身的绘制方式就是利用的Editor类中的OnInspectorGUI方法。
Unity内置的一些组件,比如说AudioSource这个组件,有的开发者发现扩展了它以后,显示在Inspector中的样式跟默认的有很大区别。
代码:
using UnityEngine; using UnityEditor; [CustomEditor(typeof(AudioSource))] public class CustomAudioSourceEditor : Editor { public override void OnInspectorGUI() { DrawDefaultInspector(); CreateEditor(targets, EditorGUILayout.HelpBox("我最牛逼!", MessageType.Info); } }
原始图片:
修改后图片:
造成这一问题的原因是Unity默认的大部分组件Unity官方代码也通过继承Editor的方式对其样式进行了自定义,因此我们需要得到AudioSource的Editor派生类,调用他的OnInspectorGUI方法。在这里我们通过反射进行调用CreateEditor(targets, typeof(Editor).Assembly.GetType("UnityEditor.AudioSourceInspector")).OnInspectorGUI();来解决样式不一致的问题。
完整代码:
using UnityEngine; using UnityEditor; [CustomEditor(typeof(AudioSource))] public class CustomAudioSourceEditor : Editor { public override void OnInspectorGUI() { CreateEditor(targets, typeof(Editor).Assembly.GetType("UnityEditor.AudioSourceInspector")).OnInspectorGUI(); EditorGUILayout.HelpBox("我最牛逼!", MessageType.Info); } }
如图所示:
更多地Unity技术问题我们可以在“Paws3D学习中心”进行讨论交流。
以上是关于Unity何时调用Inspector初始化的主要内容,如果未能解决你的问题,请参考以下文章
Unity 脚本中公共变量初始化值修改后,为啥Inpector面板的对应变量属性不更新?