我已经使用Unity很长时间了,但是从未尝试过使用编辑器。今天,我决定尝试制作一个EditorWindow来帮助我进行开发时使用快捷方式。
我想要的是单击“窗口”上的按钮以打开和关闭场景中的特定灯光。
在下面添加了代码和窗口的图像。
我对如何进行一无所知。任何帮助将不胜感激!
public class DevTools : EditorWindow
{
public Object workLight;
[MenuItem("Window/DevTools")]
public static void ShowWindow()
{
GetWindow<DevTools>("Development Tools");
}
private void OnGUI()
{
GUILayout.Label("This is the development tools.", EditorStyles.boldLabel);
workLight = EditorGUILayout.ObjectField(workLight, typeof(object), true);
if (GUILayout.Button("Working Light"))
{
if(workLight == null)
{
ShowNotification(new GUIContent("No light selected"));
}
else
{
}
}
}
}
答案 0 :(得分:0)
那么,您需要引用该对象才能继续打开和关闭该对象。您可以在编辑器中添加字段,然后从场景中手动选择对象,也可以通过GameObject.Find动态找到它。
答案 1 :(得分:0)
我不太了解Unity(从未使用过它),但是看起来很简单。
EditorFieldForObject
方法似乎采用了第二种类型参数,该参数指示您可以使用GUI中的字段选择哪些类型-我不确定是否可以将其设置为GameObject
,但基本上有两种方法应该可行:
按原样保留代码并投射对象(在OnGUI
方法中):
var gameObject = workLight as GameObject;
if(gameObject == null)
{
ShowNotification(new GUIContent("No light selected"));
}
else
{
var light = gameObject.GetComponent<Light>();
if(light == null)
{
ShowNotification(new GUIContent("Selected object is not a light"));
return;
}
// Not sure if this is the correct way to disable a light but you can figure it out
light.enabled = false;
// or light.enabled = !light.enabled to toggle state
}
另一种方法是使编辑器GUI框首先查找GameObject实例:
public GameObject workLight;
....
workLight = EditorGUILayout.ObjectField(workLight, typeof(GameObject), true);
但是我不确定这是否可行(正如我说过的,我不了解Unity)
编辑:显然,您需要使用GameObject.SetActive(boolean)
来切换
对象的状态
由于要切换,因此可以使用GameObject.activeSelf
字段,该字段为您提供当前对象上的有效true / false标志
所以这应该起作用:
light.SetActive(!light.activeSelf);
答案 2 :(得分:0)
非常感谢Charleh!
稍加重写,这似乎奏效。不知道它是否进行了完美的优化,但是可以正常使用(pm):
public class DevTools : EditorWindow
{
Object workLight = default;
[MenuItem("Window/DevTools")]
public static void ShowWindow()
{
GetWindow<DevTools>("Development Tools");
}
private void OnGUI()
{
GUILayout.Label("This is the development tools.", EditorStyles.boldLabel);
if (GUILayout.Button("Working Light"))
{
if (workLight == null)
{
ShowNotification(new GUIContent("No light selected"));
}
else
{
var light = GameObject.Find("Work Light");
if (light == null)
{
ShowNotification(new GUIContent("Selected object is not a light"));
return;
}
else
{
light.gameObject.GetComponent<Light>().enabled = !light.gameObject.GetComponent<Light>().enabled;
}
}
}
}
}