Запуск OnSceneGUI без выделения объектов

Программирование на Юнити.

Запуск OnSceneGUI без выделения объектов

Сообщение hromoyDron 24 сен 2018, 21:04

Добрый день.

Мне нужно, чтобы в SceneView, когда игра не запущена работали мои кастомные элементы.
Для этого все нужные действия обрабатываю в OnSceneGUI.

Но OnSceneGUI на объекте работает только тогда, когда в Иерархии выделяешь данный объект.

В сети предлагают следующее решение этой проблемы.
Синтаксис:
Используется csharp
SceneView.onSceneGUIDelegate += this.OnSceneGUI


С этой строчкой все работало бы без выделений, если бы инициализация объекта была бы возможна до выделения.
А так все Awake и OnEnalbe вызываются только после клика по объекту.
Следовательно, чтобы везде OnSceneGUI работало нужно прокликать каждый объект.

Есть какой-то выход из этой ситуации, чтобы не нужно было все прокликивать?
_Defentures - mid-core 2d defense strategy.
hromoyDron
UNец
 
Сообщения: 43
Зарегистрирован: 28 июн 2018, 19:10

Re: Запуск OnSceneGUI без выделения объектов

Сообщение Tolking 25 сен 2018, 00:36

в онсцен сначала проверить инициализацию, и если нет проинициализировать.
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2714
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Запуск OnSceneGUI без выделения объектов

Сообщение hromoyDron 25 сен 2018, 01:02

Tolking писал(а):в онсцен сначала проверить инициализацию, и если нет проинициализировать.


Не очень понимаю. Подписаться на SceneView.onSceneGUIDelegate я могу только из под самого скрипта CustomEditor.
Самые ранние события это Awake и OnEnable, которые в скриптах наследуемых от Editor вызываются при клике по объекту.

Как подписаться до клика не понимаю.
я же никак не могу получить ссылку на CustomEditor скрипт. Никакие GetComponent в данном случае не работают, если я ничего не путаю.


Обычный скрипт крепится на объект на сцене.
Синтаксис:
Используется csharp
using UnityEngine;

[ExecuteInEditMode]
public class VQ_Connector : MonoBehaviour {
        public VQ_Flow parentFlow;
}


К нему создан вот этот эдитор скрипт.
В SceneUpdate должно происходить все действо.

Синтаксис:
Используется csharp
using UnityEngine;
using UnityEditor;

[CustomEditor( typeof( VQ_Connector ) )]
public class VQ_Connector_Editor : Editor {

        void OnEnable()
        {
                SceneView.onSceneGUIDelegate += this.SceneUpdate;
        }

        void OnDisable()
        {
                SceneView.onSceneGUIDelegate -= this.SceneUpdate;
        }

        //void OnSceneGUI()
        void SceneUpdate(SceneView sceneView)
        {      
 
        }
}
 
_Defentures - mid-core 2d defense strategy.
hromoyDron
UNец
 
Сообщения: 43
Зарегистрирован: 28 июн 2018, 19:10

Re: Запуск OnSceneGUI без выделения объектов

Сообщение Tolking 25 сен 2018, 10:19

Извини не вник в вопрос вчера...

Если "когда игра не запущена работали мои кастомные элементы." то достаточно [ExecuteInEditMode].

onSceneGUIDelegate - используют для организации визуальной настройки объекта, например.
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2714
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Запуск OnSceneGUI без выделения объектов

Сообщение 1max1 25 сен 2018, 10:47

В ExecuteInEditMode Update будет работать только если на сцене что-то изменилось, если нужны постоянные обновы, тогда можно воспользоваться этим:
https://docs.unity3d.com/ScriptReferenc ... pdate.html
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Запуск OnSceneGUI без выделения объектов

Сообщение hromoyDron 25 сен 2018, 11:57

Tolking писал(а):Если "когда игра не запущена работали мои кастомные элементы." то достаточно [ExecuteInEditMode].
onSceneGUIDelegate - используют для организации визуальной настройки объекта, например.

1max1 писал(а):В ExecuteInEditMode Update будет работать только если на сцене что-то изменилось, если нужны постоянные обновы, тогда можно воспользоваться этим:
https://docs.unity3d.com/ScriptReferenc ... pdate.html


Мне это нужно для отрисовки Кривой Безье между несколькими объектами.
Нашел два скрипта. Один это делает через Handles в скрипте Editora
Другой через LineRenderer обычном Update.

В результате если кривых больше 20 ( а их планируется быть около 80) и я начинаю менять масштаб,
То метод с Handles рабоает нормально (даже при 80). Есть просадка кадров до 30, но все плавно.
А метод через LineRenderer тормозит очень сильно. Некоторые кадры отрисовываются за 150мс. Тормозит из-за SceneView.Repaint.

И мне надо понять. Либо все же возможно как-то без прокликивания объектов отображать все кривые через Handles
Либо придется как-то оптимизировать метод через LineRenderer.
_Defentures - mid-core 2d defense strategy.
hromoyDron
UNец
 
Сообщения: 43
Зарегистрирован: 28 июн 2018, 19:10

Re: Запуск OnSceneGUI без выделения объектов

Сообщение Tolking 25 сен 2018, 14:42

Если тебе эти безье нужны в игре то только через лайнрендер, Handles работет только в редакторе...
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2714
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Запуск OnSceneGUI без выделения объектов

Сообщение hromoyDron 25 сен 2018, 15:06

Tolking писал(а):Если тебе эти безье нужны в игре то только через лайнрендер, Handles работет только в редакторе...


Как раз в редакторе нужны.
_Defentures - mid-core 2d defense strategy.
hromoyDron
UNец
 
Сообщения: 43
Зарегистрирован: 28 июн 2018, 19:10

Re: Запуск OnSceneGUI без выделения объектов

Сообщение hromoyDron 26 сен 2018, 11:45

В итоге отображение Handles невозможно без прокликиваниях всех объектов?
_Defentures - mid-core 2d defense strategy.
hromoyDron
UNец
 
Сообщения: 43
Зарегистрирован: 28 июн 2018, 19:10

Re: Запуск OnSceneGUI без выделения объектов

Сообщение 1max1 26 сен 2018, 12:21

Синтаксис:
Используется csharp
[CustomEditor(typeof(GameObject))]
public class SceneGUITest : Editor
{
    [DrawGizmo(GizmoType.NotInSelectionHierarchy)]
    static void RenderCustomGizmo(Transform objectTransform, GizmoType gizmoType)
    {
        //Draw here
    }
}

p.s. еще можно убрать OnDisable метод вовсе и потом проконтролировать чтобы в OnEnable делегат добавился только один раз, к примеру так https://answers.unity.com/questions/185 ... ected.html
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Запуск OnSceneGUI без выделения объектов

Сообщение hromoyDron 26 сен 2018, 23:14

1max1 писал(а):
Синтаксис:
Используется csharp
[CustomEditor(typeof(GameObject))]
public class SceneGUITest : Editor
{
    [DrawGizmo(GizmoType.NotInSelectionHierarchy)]
    static void RenderCustomGizmo(Transform objectTransform, GizmoType gizmoType)
    {
        //Draw here
    }
}



Cпасибо, это помогло.
_Defentures - mid-core 2d defense strategy.
hromoyDron
UNец
 
Сообщения: 43
Зарегистрирован: 28 июн 2018, 19:10

Re: Запуск OnSceneGUI без выделения объектов

Сообщение jetyb 27 сен 2018, 07:32

Можно в самом скрипте писать выделение в методе OnDrawGizmos().
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11