Реакция на изменение свойств в редакторе.

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

Реакция на изменение свойств в редакторе.

Сообщение AndrewSt 08 фев 2010, 12:12

Занялся созданием компонентов для редактора и споткнулся.
Собственно вопрос.
Как заставить компоненты мгновено реагировать на изменения свойств в GUI?
Самый простой пример с галочкой по скритию гизмы.

Код скрипта:
Код: Выделить всё
using UnityEngine;
using System.Collections;

public class OtherObj : MonoBehaviour
{
   public bool hideGizmos = false;
   public float radiusGizmos = 5;

   void OnDrawGizmos()
   {
      if (hideGizmos)
         return;

      Gizmos.color = Color.white;
      Gizmos.DrawSphere(transform.position, radiusGizmos);
   }

   void OnDrawGizmosSelected()
   {
      if (hideGizmos)
         return;

      Gizmos.color = Color.yellow;
      Gizmos.DrawSphere(transform.position, radiusGizmos);
   }

}


Код скрипта едитора:
Код: Выделить всё
using UnityEngine;
using UnityEditor;
using System.Collections;

[CustomEditor(typeof(OtherObj))]
public class OtherObjEditor : Editor
{
   OtherObj targetObject;
   SerializedObject serializedObject;

   void OnEnable()
   {
      targetObject = target as OtherObj;
      serializedObject = new SerializedObject(target);
   }

   public override void OnInspectorGUI()
   {
      serializedObject.Update();
      GUILayout.BeginHorizontal();
      GUILayout.Label("Hide Gizmos");
      targetObject.hideGizmos = EditorGUILayout.Toggle(targetObject.hideGizmos);
      GUILayout.EndHorizontal();

      targetObject.radiusGizmos = EditorGUILayout.FloatField("  Gizmos Radius: ", targetObject.radiusGizmos);

      serializedObject.ApplyModifiedProperties();
      Repaint();
   }
}

AndrewSt
UNIт
 
Сообщения: 72
Зарегистрирован: 10 дек 2009, 13:36
Откуда: СПБ
  • ICQ

Re: Реакция на изменение свойств в редакторе.

Сообщение Neodrop 08 фев 2010, 16:26

GUI.changed работает странновато. Я просто запоминаю параметры до прорисовки и сравниваю их после. :-?
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Реакция на изменение свойств в редакторе.

Сообщение AndrewSt 08 фев 2010, 16:58

С данной проблемой я уже разобрался.
В самом конце OnInspectorGUI() надо добавить строку:
EditorUtility.SetDirty(targetObject);

Возник новый вопрос.

Допустим с процессе редактированя с помощью своего скрипта я задая свои параметры, или устанавливаю различные связи между объектами.
Как мне их сохранять?
При сохранении сцены мои данные не сохраняются.
AndrewSt
UNIт
 
Сообщения: 72
Зарегистрирован: 10 дек 2009, 13:36
Откуда: СПБ
  • ICQ

Re: Реакция на изменение свойств в редакторе.

Сообщение Neodrop 08 фев 2010, 17:08

Нет, это значит при каждом открытии инспектора, объект будет маркироваться как изменённый. Чего же в этом хорошего?
Чтобы запоминанть изменения переменных, используйте SerializedObject
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Реакция на изменение свойств в редакторе.

Сообщение AndrewSt 08 фев 2010, 17:30

Ну тогда надо проверять на изменения свойств и вызывать EditorUtility.SetDirty(targetObject);
Без этого у меня свойства не применяются пока я фокус на другой объект не перенесу.


Да но как то он странно работает SerializedObject.
Использую так:
Код: Выделить всё
   public override void OnInspectorGUI()
   {
      serializedObject.Update();
      ...
      ...
      ...
      serializedObject.ApplyModifiedProperties();
   }

Он сохраняет только public свойства.
Так и должно быть?
Если сделать все свойства public то они ведь будут отображаться в редакторе свойств, что не приемлемо. :(
AndrewSt
UNIт
 
Сообщения: 72
Зарегистрирован: 10 дек 2009, 13:36
Откуда: СПБ
  • ICQ

Re: Реакция на изменение свойств в редакторе.

Сообщение Neodrop 08 фев 2010, 17:41

В Редакторе они никогда не отобразятся, если вы их сами не прорисуете. Вы же переопределили своим классом внешний вид Инспектора.
Apply так же как и SetDirty желательно вызывать не постоянно, как вы всё время делаете, а только когда что-то реально изменилось.

Менять не public поля тоже можно, равно как и сохранять. Читаем внимательнее методы SerializedObject
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Реакция на изменение свойств в редакторе.

Сообщение AndrewSt 08 фев 2010, 18:21

Так в томто и дело что я отрисовываю. В коде из первого поста если я посталвю галку не показывать гизмо, то гизмо исчезает только когда я сменю фокус или вызову SetDirty.
AndrewSt
UNIт
 
Сообщения: 72
Зарегистрирован: 10 дек 2009, 13:36
Откуда: СПБ
  • ICQ

Re: Реакция на изменение свойств в редакторе.

Сообщение AndrewSt 09 фев 2010, 10:45

И все таки я не понимаю как объект SerializedObject может получить доступ к приватным членам класса, если для создания SerializedObject мы передаем ссылку на объект.
AndrewSt
UNIт
 
Сообщения: 72
Зарегистрирован: 10 дек 2009, 13:36
Откуда: СПБ
  • ICQ

Re: Реакция на изменение свойств в редакторе.

Сообщение Neodrop 09 фев 2010, 17:10

Что за заблуждения? :-? Для создания, Serialized object мы передаём ссылку на target скрипта, наследованного от Editor и являющегося CustomInspector.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Реакция на изменение свойств в редакторе.

Сообщение AndrewSt 09 фев 2010, 17:18

Ну да про таргет немного тупанул. Но все равно не могу понять как можно сохранять приватные члены класса.
AndrewSt
UNIт
 
Сообщения: 72
Зарегистрирован: 10 дек 2009, 13:36
Откуда: СПБ
  • ICQ

Re: Реакция на изменение свойств в редакторе.

Сообщение Neodrop 09 фев 2010, 17:20

Через Property класса SerializedObject

Код: Выделить всё
[CustomEditor(typeof(Transform))]
public class TransformInspector : Editor {

SerializedObject m_Object;
SerializedProperty m_Property;

void OnEnable () {
m_Object = new SerializedObject (target);
m_Property = m_Object.FindProperty ("m_LocalPosition.x");
}

void OnInspectorGUI () {
// Grab the latest data from the object
m_Object.Update ();

// Editor UI for the property
EditorGUILayout.PropertyField (m_Property);

// Apply the property, handle undo
m_Object.ApplyModifiedProperties ();
}
}
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Реакция на изменение свойств в редакторе.

Сообщение Neodrop 09 фев 2010, 17:36

Правда, вообще, должен заметить, в EditorGUI классах глюк на глюке. Особенно с лайоутами. ;(
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Реакция на изменение свойств в редакторе.

Сообщение AndrewSt 09 фев 2010, 17:41

Да с этим примером я знаком из справки. Но в томто и дело что
m_Property = m_Object.FindProperty ("m_LocalPosition.x");
Находит только паблик свойства, если свойство m_LocalPosition.x будет private, то m_Property=null. Другого способа видимо нет. :(
Или я опять туплю.
Вот код теста.
Код: Выделить всё
public class MyObj : MonoBehaviour
{
   private float m_property1 = 2.0f;
   public  float  m_property2 = 2.0f;
}

[CustomEditor(typeof(MyObj))]
public class MyObjEditor : Editor {

SerializedObject m_Object;
SerializedProperty m_Property1;
SerializedProperty m_Property2;

void OnEnable () {
m_Object = new SerializedObject (target);
m_Property1 = m_Object.FindProperty ("m_property1");
Debug.Log(m_Property1);
m_Property2 = m_Object.FindProperty ("m_property2");
Debug.Log(m_Property2);
}

void OnInspectorGUI () {
// Grab the latest data from the object
m_Object.Update ();

// Editor UI for the property
if(m_Property1 != null)
    EditorGUILayout.PropertyField (m_Property1);
if(m_Property2 != null)
    EditorGUILayout.PropertyField (m_Property2);

// Apply the property, handle undo
m_Object.ApplyModifiedProperties ();
}
}
AndrewSt
UNIт
 
Сообщения: 72
Зарегистрирован: 10 дек 2009, 13:36
Откуда: СПБ
  • ICQ

Re: Реакция на изменение свойств в редакторе.

Сообщение Neodrop 09 фев 2010, 17:43

Хм. НУ чёрт его знает. Я для CustomInspector использую public переменные и не парюсь.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Реакция на изменение свойств в редакторе.

Сообщение AndrewSt 09 фев 2010, 18:04

Да я изучил уже твои исходники. Спасибо хочу сказать гораздо быстрее освоился в написании скриптов для редактора. :ymapplause: .
Есть пару новых проблем.
1. Способ востановления фокуса работает не стабильно.Правдо воспользовался твоим способом созданием редактора для Transform. Может есть более правильный способ.
2. При отрисовке Гизмо у меня так получается что некоторые объекты рисуются несколько раз. Можно ли как нибудь определить порядок отрисовки или установить использовать z-буфер.
3. Не поулучается отловить нажатие правой кнопки мыши. код не работает :(.
Код: Выделить всё
   void OnSceneGUI()
   {
      if (Event.current.type == EventType.mouseDown)
      {
         if(Event.current.button == 2)
         {

         }
}
AndrewSt
UNIт
 
Сообщения: 72
Зарегистрирован: 10 дек 2009, 13:36
Откуда: СПБ
  • ICQ

След.

Вернуться в Editor

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

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