例如,为什么我在 Unity 中的自定义编辑器会不断运行按钮单击等事件?它也可以在窗口中的任何地方鼠标上执行此操作?

Why does my custom editor in Unity constantly run events like button clicks for example? It also does this on mouse over anywhere in window?

提问人:Darren 提问时间:5/16/2023 最后编辑:derHugoDarren 更新时间:5/16/2023 访问量:101

问:

好的,已经有一段时间了,我正在尝试制作一个自定义编辑器。还尝试了自定义编辑器窗口。我有三个按钮,可以修改另一个脚本上的属性等,很简单,对吧?问题是,在自定义编辑器中,所有事件都在我执行任何操作的情况下触发。我放置了调试语句来测试“1”、“2”、“3”等,它一遍又一遍地按顺序打印出来,就像在更新例程中一样。这是三个点击事件。把我逼疯了,谷歌搜索没用。我的代码

`

using UnityEngine;
   using UnityEditor;
   [CustomEditor(typeof(Modify))]
   [CanEditMultipleObjects]

    public class CloudsEditor : Editor
    {
        SerializedProperty powerSetting;
    string powerSettingText;
    private void OnEnable()
    {
        powerSetting = serializedObject.FindProperty("CloudsOnePowerSetting");
    }

    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();

        Modify myScript = (Modify)target;
        serializedObject.Update();
        GUILayout.BeginHorizontal();
        GUILayout.Label("Set Clouds Fade");
        if (GUILayout.Button("Fast")) GUILayout.Width(100);
        {
            powerSetting.floatValue = 0.001f;
            powerSettingText = "0.001f";
            Debug.Log("Test1");
        }
        if (GUILayout.Button("Medium")) GUILayout.Width(100);
        {
            powerSetting.floatValue = 0.0001f;
            powerSettingText = "0.0001f";
            Debug.Log("Test2");
        }
        if (GUILayout.Button("Slow")) GUILayout.Width(100);
        {
           powerSetting.floatValue = 0.00001f;
        }
       
        GUILayout.EndHorizontal(); 
        GUILayout.TextField(powerSettingText);



        serializedObject.ApplyModifiedProperties();
    }
    
}`

我已经尝试了我能想到的一切。没有意义。我还尝试了自定义编辑器窗口。当我将鼠标悬停在窗口上方的任何地方时,它也会做同样的事情。我敢肯定这很简单,但啊!!!把我逼疯了。

C# Unity-游戏引擎 Unity3D-编辑器

评论


答:

0赞 Mario 5/16/2023 #1

检查您是否正在关闭之前的所有 if。因此,您只在真正的 GuiLayout.Width 内部运行,下面的块始终运行一个不属于 if 的原因。

例:

if (GUILayout.Button("Medium", GUILayout.Width(100)))
{
    powerSetting.floatValue = 0.0001f;
    powerSettingText = "0.0001f";
    Debug.Log("Test2");
}
0赞 derHugo 5/16/2023 #2

所有这些

// without the wrapping "{ }" the if condition only is applied to the first expression after it
//                            | which is this!
//                            v 
if (GUILayout.Button("Fast")) GUILayout.Width(100);
// the scope below is always executed
{
    powerSetting.floatValue = 0.001f;
    powerSettingText = "0.001f";
    Debug.Log("Test1");
}

基本上等同于

 if (GUILayout.Button("Fast"))
 {
     GUILayout.Width(100);  
 }
 // code block below is in its own scope but still always executed
 {
     powerSetting.floatValue = 0.001f;
     powerSettingText = "0.001f";
     Debug.Log("Test1");
 }

我想你现在已经看到了这个问题;)

它应该是,例如

                             // this is supposed to be an argument to the Button call
if (GUILayout.Button("Fast", GUILayout.Width(100)))
{
    powerSetting.floatValue = 0.001f;
    powerSettingText = "0.001f";
    Debug.Log("Test1");
}

评论

0赞 Darren 5/16/2023
谢谢。这对我来说已经有一段时间了。几年后重新拾起一些东西。我会试一试。:)
0赞 Darren 5/18/2023
好吧,所以想通了......这就是问题所在..................if (GUILayout.Button(“快速”)) GUILayout.Width(100);.............它很容易被..........if (GUILayout.Button(“快速”, GUILayout.Width(100))) ...不知道为什么会导致这个问题,但无论哪种方式,问题都解决了。我的if语句没有错。这是正确的。
0赞 derHugo 5/22/2023
@Darren很好..不,你的陈述是错误的^^正如答案中所解释的那样,导致你的块总是被执行,所以行为几乎不符合你的意愿/想法;)if