Unity EditorWindow-从窗口切换游戏对象

时间:2019-01-31 12:43:55

标签: c# visual-studio unity3d

我已经使用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
        {

        }
    }
}
}

This is my current Window

3 个答案:

答案 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;
            }
        }
    }
}

}