Unity EditorWindow - переключать игровой объект из окна - PullRequest
0 голосов
/ 31 января 2019

Я использовал Unity уже довольно давно, но никогда не пробовал редактора.Сегодня я решил попробовать создать окно Editor, чтобы помочь мне с ярлыками в моей разработке.

Я хочу щелкнуть по кнопке в моем окне, чтобы включить или выключить определенный источник света в моей сцене.

Добавлен код и изображение окна ниже.

Я не знаю, как поступить.Любая помощь будет высоко оценена!

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
        {

        }
    }
}
}

Это мое текущее окно

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Я действительно не знаю 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);
0 голосов
/ 31 января 2019

Большое спасибо, Чарле!

Немного переписав, похоже, это работает.Не уверен, что он оптимизирован идеально, но он работает без помех (атм): стр.

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

}

0 голосов
/ 31 января 2019

Ну, вам нужна ссылка на объект, чтобы продолжить его включение и выключение.Вы можете либо добавить поле в редактор и вручную выбрать объект со сцены, либо найти его динамически через GameObject.Find.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...