需求
项目中有个需求是开发一个UI适配的脚本,根据游戏运行的平台显示不同类型的UI。根据需求,游戏在运行时自动适配就可以了。但是为了方便在编辑器中查看效果,需要可以在Inspector面板中修改属性值后直接在编辑器上执行相应的适配代码,显示效果。
解决方案
为了在Inspector面板中修改值,我们使用一个enum属性即可,这样对应在面板上就是一个下拉列表。注意这个属性在游戏运行时是根据所在的平台动态设置的,其实并不需要public出来,也不需要序列化。但是为了能在Inspector面板中临时修改并查看效果,我将其作为一个public属性开放出来,当然也可以private后加[SerializeField]
属性,效果一样。大概代码如下:
public enum Platform
{
Console,
PC,
Mobile
};
[DisallowMultipleComponent]
public class UIAdapter : MonoBehaviour
{
[Header("修改以下值只作用于编辑器中")]
public Platform CurrentPlatform = default;
}
这样在Inspector面板中就可以通过下拉列表修改CurrentPlatform这个属性了。那么问题来了,如何在编辑模式中响应这个属性的变化呢?经过多方查找,我发现最简单的方法是使用MonoBehaviour.OnValidate()
方法。这个方法的描述是:
This function is called when the script is loaded or a value is changed in the Inspector (Called in the editor only).
You can use this to ensure that when you modify data in an editor, that data stays within a certain range.
在UIAdapter中添加这个方法即可:
#if UNITY_EDITOR
private void OnValidate()
{
// Use CurrentPlatform here to update UI
}
#endif
需要注意的是,这个方法在脚本被载入时也会执行。
如果有更复杂的需求
在找到这个简单的方法之前,我也尝试了另外一个方法:Editor.OnInspectorGUI
使用这个方法其实是可以实现自定义的Inspector编辑UI,但同样因为这个方法是在Inspector UI需要重绘时调用,也可以用来刷新编辑器后的属性值,但调用频率会高很多,因此如果仅是上面的简单需求就没必要了。当然如果有更复杂的需求,需要自定义Inspector UI,那就需要使用这个方法。