提问人:Darren 提问时间:5/16/2023 最后编辑:derHugoDarren 更新时间:5/16/2023 访问量:101
例如,为什么我在 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?
问:
好的,已经有一段时间了,我正在尝试制作一个自定义编辑器。还尝试了自定义编辑器窗口。我有三个按钮,可以修改另一个脚本上的属性等,很简单,对吧?问题是,在自定义编辑器中,所有事件都在我执行任何操作的情况下触发。我放置了调试语句来测试“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();
}
}`
我已经尝试了我能想到的一切。没有意义。我还尝试了自定义编辑器窗口。当我将鼠标悬停在窗口上方的任何地方时,它也会做同样的事情。我敢肯定这很简单,但啊!!!把我逼疯了。
答:
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
评论