Скрипт иснпектора. Что не так со слоями?

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Скрипт иснпектора. Что не так со слоями?

Сообщение Raspad 25 сен 2017, 18:44

В общем есть у меня скрипт, для которого есть скрипт вида в инспекторе. Там есть 2 поля с типом "слой".
Установлено это поле через EditorGUILayout.LayerField. Все вроде бы работает.. но нет.

Выбирается тока один пункт, если включить отладочный режим(когда видны скрытые переменные и родной вид инспектора скрипта), то я вижу что выбраны на деле совсем другие пункты. Выбираю "Стена" которая самая подледная, при отладке она оказывается "игнорировать столкновение".

Как это исправить?
Аватара пользователя
Raspad
UNITрон
 
Сообщения: 221
Зарегистрирован: 28 мар 2013, 13:12

Re: Скрипт иснпектора. Что не так со слоями?

Сообщение samana 25 сен 2017, 21:13

Хорошо бы показать тот фрагмент кода, который касается этой проблемы.
А вы точно не забываете назначить выбранный слой тому объекту, на котором этот компонент? Может просто меняете переменную слоя в скрипте, но (псевдокод) gameObject.layer = мойСлой забыли?
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Скрипт иснпектора. Что не так со слоями?

Сообщение Raspad 26 сен 2017, 11:43

Дело не в самом коде скрипта.. А в коде "едитор" скрипта
Вот он.
Синтаксис:
Используется csharp
using System;
using UnityEditor;
using UnityEngine;


    [CustomEditor(typeof (PropertiesModul))]
        public class EditorPropertiesModul : Editor
    {
                PropertiesModul propertiesModul;
                private Texture iconGhost_off,iconGhost_on;
                private Texture iconMontah_off,iconMontah_on;

    private void OnEnable(){
                propertiesModul = (PropertiesModul)target;
               
                iconGhost_off=Resources.Load("Editor/PropertiesModul/iconGhost_off") as Texture;
                iconGhost_on=Resources.Load("Editor/PropertiesModul/iconGhost_on") as Texture;
                iconMontah_off=Resources.Load("Editor/PropertiesModul/iconMontah_off") as Texture;
                iconMontah_on=Resources.Load("Editor/PropertiesModul/iconMontah_on") as Texture;
    }


    public override void OnInspectorGUI(){
        serializedObject.Update();

                EditorGUILayout.BeginHorizontal(EditorStyles.helpBox);

                        EditorGUILayout.BeginVertical(EditorStyles.helpBox);
                                EditorGUILayout.LabelField("Ghost",GUILayout.Width(32));
                                if(propertiesModul.isGhost){
                                        GUI.DrawTexture(GUILayoutUtility.GetRect(16, 16),iconGhost_on,ScaleMode.ScaleToFit);
                                }else{
                                        GUI.DrawTexture(GUILayoutUtility.GetRect(16, 16),iconGhost_off,ScaleMode.ScaleToFit);
                                }
                        EditorGUILayout.EndVertical();
                        EditorGUILayout.BeginVertical(EditorStyles.helpBox);
                                EditorGUILayout.LabelField("Montah",GUILayout.Width(32));
                                if(!propertiesModul.montah){
                                        GUI.DrawTexture(GUILayoutUtility.GetRect(16, 16),iconMontah_off,ScaleMode.ScaleToFit);
                                }else{
                                        GUI.DrawTexture(GUILayoutUtility.GetRect(16, 16),iconMontah_on,ScaleMode.ScaleToFit);
                                }
                        EditorGUILayout.EndVertical();
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.BeginVertical(EditorStyles.helpBox);
                propertiesModul.name = EditorGUILayout.TextField("Name",propertiesModul.name);
                propertiesModul.icon = EditorGUILayout.ObjectField("Icon",propertiesModul.icon,typeof(Sprite), true) as Sprite;
                propertiesModul.tModul = (PropertiesModul.TupeModul)EditorGUILayout.EnumPopup("TupeModul:", propertiesModul.tModul);
                EditorGUILayout.EndVertical();

                EditorGUILayout.BeginVertical(EditorStyles.helpBox);
                propertiesModul.maskCollision = EditorGUILayout.LayerField("maskCollision:",propertiesModul.maskCollision);
                EditorGUILayout.EndVertical();

                if(propertiesModul.tModul==PropertiesModul.TupeModul.Component){
                        EditorGUILayout.BeginVertical(EditorStyles.helpBox);
                        propertiesModul.childer = EditorGUILayout.ObjectField("Childer",propertiesModul.childer,typeof(GameObject), true) as GameObject;
                        EditorGUILayout.EndVertical();
                }else if(propertiesModul.tModul==PropertiesModul.TupeModul.Accessory){
                        EditorGUILayout.BeginVertical(EditorStyles.helpBox);
                        propertiesModul.maskRay = EditorGUILayout.LayerField("maskRay:", propertiesModul.maskRay);
                        propertiesModul.mount = EditorGUILayout.TextField("Mount",propertiesModul.mount);
                        propertiesModul.isRotate = EditorGUILayout.Toggle("isRotate?",propertiesModul.isRotate);
                        propertiesModul.isSticks = EditorGUILayout.Toggle("isSticks?",propertiesModul.isSticks);
                        EditorGUILayout.EndVertical();
                }

                EditorGUILayout.BeginVertical(EditorStyles.helpBox);
                EditorGUILayout.LabelField("GhostChilders",GUILayout.Width(32));
                EditorGUILayout.PropertyField(serializedObject.FindProperty("GhostChilders").FindPropertyRelative("Array.size"));
                for (byte i=0;i<propertiesModul.GhostChilders.Length;i++) {
                        EditorGUILayout.BeginVertical(EditorStyles.helpBox);
                        propertiesModul.GhostChilders[i] = EditorGUILayout.ObjectField(propertiesModul.GhostChilders[i], typeof(GameObject), true) as GameObject;
                        EditorGUILayout.EndVertical();
                }

                EditorGUILayout.EndVertical();

        serializedObject.ApplyModifiedProperties();
        }

    }

Механика моего скрипта (для которого и написан скрипт внешности выше) в пускании луча в противоположную сторону от "лица" объекта, дабы проверить на что его ставят. А так как за это отвечает маска слоя.. то если он найдет объект с нужным нужным слоем, то разрешит установку, а если ни чего не нашел.. то нельзя ставить.
Аватара пользователя
Raspad
UNITрон
 
Сообщения: 221
Зарегистрирован: 28 мар 2013, 13:12

Re: Скрипт иснпектора. Что не так со слоями?

Сообщение samana 26 сен 2017, 16:35

Попробуйте обращаться с этим свойством напрямую, через сериализацию
Синтаксис:
Используется csharp
EditorGUILayout.PropertyField(serializedObject.FindProperty("maskCollision"), new GUIContent("maskCollision:"));

так должно работать правильно.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Скрипт иснпектора. Что не так со слоями?

Сообщение Raspad 26 сен 2017, 17:16

спасибо.. то что надо.
Аватара пользователя
Raspad
UNITрон
 
Сообщения: 221
Зарегистрирован: 28 мар 2013, 13:12


Вернуться в Почемучка

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

Сейчас этот форум просматривают: Google [Bot] и гости: 26