EditorWindow рисуем на сцене.

Раздел, посвящённый всему, что связано с программированием для Редактора Юнити. Скрипты Редактора, Wizards и прочее.

EditorWindow рисуем на сцене.

Сообщение KingPeas 25 фев 2014, 14:04

Всем привет. :-h
Захотелось сделать небольшую рулетку, для измерения расстояния между объектами. Набросал простенький скрипт, задаешь объекты, получаешь расстояние между центрами transform-ов. Захотелось мне отрисовать линию чтобы видеть откуда до куда измерения ведутся. Добавил параметр и отрисовал. Но почему-то сия линия не стирается после отрисовки и висит артефактом когда меняешь объекты или начинаешь их двигать. Подскажите чего не так делаю?
Синтаксис:
Используется csharp
using UnityEngine;
using UnityEditor;

public class SL_Ruler : EditorWindow
{

    // Регистрируем пункт меню и функцию, выполняющую открытие окна
    [MenuItem("Window/SoftLab/Ruler")]
    public static void CreateWindow()
    {
        SL_Ruler window = GetWindow<SL_Ruler>();
        window.title = "Ruler Window";
    }

    public bool DrawLine = false;
    // объект для поворота
    public Transform source;
    // цель
    public Transform target;


    void Update()
    {
       
        if (DrawLine && (source != null) && (target != null))
        {
            Debug.DrawLine(source.position, target.position, Color.green);
        }
    }
    // Функция отрисовки окна
    public void OnGUI()
    {
        // поле для указания исходного объекта
        DrawLine = GUILayout.Toggle(DrawLine, "Draw line");
        GUILayout.Button(GUIContent.none, GUILayout.ExpandWidth(true), GUILayout.Height(3));
        GUILayout.BeginHorizontal();
        GUILayout.Label("Start:", GUILayout.Width(120));
        source = (Transform)EditorGUILayout.ObjectField(source, typeof(Transform));
        GUILayout.EndHorizontal();

        // поле для указания цели
        GUILayout.BeginHorizontal();
        GUILayout.Label("End:", GUILayout.Width(120));
        target = (Transform)EditorGUILayout.ObjectField(target, typeof(Transform));
        GUILayout.EndHorizontal();

        // запоминаем текущий цвет GUI для восстановления
        Color oldColor = GUI.color;

        if ((source != null) && (target != null))
        {
            GUI.color = Color.green;
            GUILayout.Label("Distance : " + Vector3.Distance(source.position, target.position));
            //if (DrawLine)
            //    Debug.DrawLine(source.position, target.position, Color.green);
        }
        else
        {
            GUI.color = Color.red;
            GUILayout.Label("Set Start and End!");
        }
        GUI.color = oldColor;
        GUI.enabled = true;
        GUILayout.Space(8);

    }
}

буду рад советам или идеям куда копать
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ...
Мой первый плагин PropertyDrawerCollection
Аватара пользователя
KingPeas
UNIт
 
Сообщения: 78
Зарегистрирован: 12 сен 2012, 12:34
Откуда: Новосибирск
Skype: evgeniygurlev
  • Сайт
  • ICQ

Re: EditorWindow рисуем на сцене.

Сообщение 2rusbekov 25 фев 2014, 14:55

А во время смены объектов активно окно game?
Still alive...
Аватара пользователя
2rusbekov
Адепт
 
Сообщения: 1409
Зарегистрирован: 06 апр 2012, 12:57
Откуда: Бишкек

Re: EditorWindow рисуем на сцене.

Сообщение Diab10 25 фев 2014, 15:25

Вот спасибо, пригодится :D
Аватара пользователя
Diab10
Адепт
 
Сообщения: 3401
Зарегистрирован: 17 мар 2011, 20:42
Откуда: 123 RUS
Skype: diab1023

Re: EditorWindow рисуем на сцене.

Сообщение KingPeas 26 фев 2014, 06:00

2rusbekov писал(а):А во время смены объектов активно окно game?

линии рисуются только в сцене. Вкладка конечно есть, но она не активна в этот момент. Стираются они как-то незакономерно, когда между окнами переключаешься или объекты выбираешь, и то не всегда... 8-x
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ...
Мой первый плагин PropertyDrawerCollection
Аватара пользователя
KingPeas
UNIт
 
Сообщения: 78
Зарегистрирован: 12 сен 2012, 12:34
Откуда: Новосибирск
Skype: evgeniygurlev
  • Сайт
  • ICQ

Re: EditorWindow рисуем на сцене.

Сообщение KingPeas 26 фев 2014, 06:50

Нашел решение.

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

public class SL_Ruler : EditorWindow
{

    // Регистрируем пункт меню и функцию, выполняющую открытие окна
    [MenuItem("Window/SoftLab/Ruler")]
    public static void CreateWindow()
    {
        SL_Ruler window = GetWindow<SL_Ruler>();
        window.title = "Ruler Window";
    }

    public bool DrawLine = false;
    // первый объект
    public Transform startTarget;
    // второй объект
    public Transform endTarget;
    private Vector3 closestPointStart = Vector3.zero;
    private Vector3 closestPointEnd = Vector3.zero;
        private bool isPhysX = false;


    void OnEnable()
        {
                SceneView.onSceneGUIDelegate += this.OnSceneGUI;
        }
       
        void OnDisable()
        {
                SceneView.onSceneGUIDelegate -= this.OnSceneGUI;
        }
       
        void OnSceneGUI(SceneView       sceneView)
    {
       
        if (DrawLine && (startTarget != null) && (endTarget != null))
        {
                        Color old = Handles.color;
                        Handles.color = Color.green;
                        Handles.DrawLine(startTarget.position, endTarget.position);
                        CalcPhysXPosition();
            if (isPhysX)
            {
                Handles.color = Color.red;
                                Handles.DrawLine(closestPointStart, closestPointEnd);
            }
                        Handles.color = old;
        }
    }
    // Функция отрисовки окна
    public void OnGUI()
    {
        // поле для указания исходного объекта
        DrawLine = GUILayout.Toggle(DrawLine, "Draw line");
        GUILayout.Button(GUIContent.none, GUILayout.ExpandWidth(true), GUILayout.Height(3));
        GUILayout.BeginHorizontal();
        GUILayout.Label("Start:", GUILayout.Width(120));
        startTarget = (Transform)EditorGUILayout.ObjectField(startTarget, typeof(Transform));
        GUILayout.EndHorizontal();

        // поле для указания цели
        GUILayout.BeginHorizontal();
        GUILayout.Label("End:", GUILayout.Width(120));
        endTarget = (Transform)EditorGUILayout.ObjectField(endTarget, typeof(Transform));
        GUILayout.EndHorizontal();

        // запоминаем текущий цвет GUI для восстановления
        Color oldColor = GUI.color;
        closestPointStart = Vector3.zero;
        closestPointEnd = Vector3.zero;

        if ((startTarget != null) && (endTarget != null))
        {
            GUI.color = Color.green;
            GUILayout.Label("Distance : " + Vector3.Distance(startTarget.position, endTarget.position));
            CalcPhysXPosition();
            if (isPhysX)
            {
                GUILayout.Label("Real distance : " + Vector3.Distance(closestPointStart, closestPointEnd));
            }
        }
        else
        {
            GUI.color = Color.red;
            GUILayout.Label("Set Start and End!");
        }
        GUI.color = oldColor;
        GUI.enabled = true;
        GUILayout.Space(8);

    }
       
        void CalcPhysXPosition()
        {
                isPhysX = false;
               
                if (startTarget == null || endTarget == null) return;

                Collider colliderStart = startTarget.GetComponent<Collider>();
                Collider colliderEnd = endTarget.GetComponent<Collider>();
                if (colliderStart && colliderEnd)
        {
            closestPointStart = colliderStart .ClosestPointOnBounds(endTarget.position);
            closestPointEnd = colliderEnd.ClosestPointOnBounds(startTarget.position);
                        isPhysX = true;
        }
        }
}
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ...
Мой первый плагин PropertyDrawerCollection
Аватара пользователя
KingPeas
UNIт
 
Сообщения: 78
Зарегистрирован: 12 сен 2012, 12:34
Откуда: Новосибирск
Skype: evgeniygurlev
  • Сайт
  • ICQ


Вернуться в Editor

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

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