在编辑器中自动更改 OnValidate 的最佳替代方案是什么?

问题描述 投票:0回答:2

如果我想在编辑器中进行自动更改,我通常使用OnValidate。多年来我遇到了很多问题,所以我正在寻找替代方案。

示例:有一个梯形图对象,上面有梯形图脚本。当我更改梯子组件上的 Size 变量时,我希望它也更改设置为平铺模式的 SpriteRenderer 的大小。不幸的是,OnValidate 不喜欢你使用 SendMessage,你会得到奇怪的结果。

不是想要专门解决这个问题。我已经使用编辑器脚本来解决它。我只是在寻找一种无需使用 OnValidate 即可自动进行更改的方法,以便我拥有更多自由。

我认为也许编辑器脚本可以做到这一点,但我真的很想避免必须为每个案例单独执行此操作。也许有一种方法可以制作一个编辑器脚本来处理所有尝试执行此操作的脚本?也许是一个与界面一起使用的编辑器脚本?

编辑:更改帖子的标题和文本以使其更清晰。

c# unity-game-engine
2个回答
2
投票

我想出了一个解决方案。我创建了一个基类,游戏中的所有其他类都将继承该基类。看起来像这样:

public class BaseClass : MonoBehaviour {
    [HideInInspector] public bool NeedsAutoUpdate;
    protected void OnValidate() { NeedsAutoUpdate = !Application.isPlaying; }
    public virtual void AutoUpdate() { NeedsAutoUpdate = false; }
}

因此,只有在不处于播放模式时,它才会被设置为跟踪 OnValidate 何时发生。如果您希望它也以播放模式运行,只需将“!Application.isPlaying”替换为“true”即可。然后有一个虚拟的 AutoUpdate() 将其设置回 false。然后我做了一个编辑器脚本。

[CustomEditor(typeof(BaseClass),true), CanEditMultipleObjects]
public class BaseClassEditor : Editor {

    public override void OnInspectorGUI() {
        
        base.OnInspectorGUI();

        var Objs = serializedObject.targetObjects;
        foreach (var Obj in Objs) {

            var Base = Obj as BaseClass;
            if (Base == null) continue;

            EditorApplication.delayCall += () => {
                if (Base.NeedsAutoUpdate) { Base.AutoUpdate(); }
            };
            
        }

    }
    
}

这将检查从基类继承的任何内容是否需要自动更新,然后运行它。使用延迟调用可确保检查器在执行此操作之前得到完全更新,以避免 OnValidate 存在的问题。请注意,如果您有一个继承自 BaseClass 的类,但该类已经拥有自己的 CustomEditor,那么您需要让该自定义编辑器继承自 BaseClassEditor 而不是 Editor 才能使其工作。

最后,在我想要自动更新的任何类上,我确保它继承自 BaseClass(至少在某处)并添加自动更新的覆盖。

public override void AutoUpdate() {
    base.AutoUpdate();
    // Make changes here
}

0
投票

找到了解决此问题的一个非常简单的解决方法这里

private void OnValidate() => Invoke(nameof(OnValidateManual), 0);
private void OnValidateManual()
{ 
    if (!isActiveAndEnabled) return;
    ...
}
        

有了它,我可以添加/编辑 SpriteRenderer (这是垃圾邮件 SendMessage,在 OnValidate() 调用期间不允许这样做)

© www.soinside.com 2019 - 2024. All rights reserved.