Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/75: Рейтинг темы: голосов - 75, средняя оценка - 4.95
7 / 7 / 0
Регистрация: 05.04.2016
Сообщений: 410
1

Сделать переменную видимой в инспекторе

14.05.2019, 22:17. Показов 13744. Ответов 34
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Возможно ли сделать публичную переменную в классе, унаследованном от MonoBehaviour, хранящую кастомный тип, НЕ унаследованный от MonoBehaviour, видимой в инспекторе?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2019, 22:17
Ответы с готовыми решениями:

Скрыть переменную в инспекторе
Всем привет. В общем делаю список в инспекторе. Использую enum. Как мне сделать так, чтобы в...

Не могу сделать видимой переменную
Здравствуйте! Я пишу простое приложение на Node.js, express, ejs и т.д. Для сохранения данных я...

Сделать переменную видимой для других классов
Добрый вечер, возникла проблема с переменными. В public MainWindow() {...} есть код: bool...

Сделать переменную видимой для всех страниц
На главной странице создаётся переменная. Как сделать её видимой для всех страниц. Задача на...

34
3353 / 1769 / 1025
Регистрация: 26.10.2018
Сообщений: 5,198
14.05.2019, 22:30 2
Поля класса или структуры публичные?
Сам класс/структура имеет атрибут [System.Serializable]?
2
7 / 7 / 0
Регистрация: 05.04.2016
Сообщений: 410
14.05.2019, 22:44  [ТС] 3
Не знал про [System.Serializable] перед классом, проблема решилась добавлением этой строки, благодарю.

Добавлено через 4 минуты
Прошу прощения, юнити пролагнула и поле, почему то, на момент показалось в инспекторе, от того и написал ответ, на деле же всё равно не появляется, что с serializable перед классом, что нет.
Структура такая: есть (названия вымышленные) класс А от MonoBehaviour, в нём есть поле Public B b, где класс B - не унаследован от MonoBehaviour, и не могу заставить появиться эту переменную b в инспекторе, что бы была возможность её задавать через инспектор
0
3353 / 1769 / 1025
Регистрация: 26.10.2018
Сообщений: 5,198
14.05.2019, 22:56 4
Даже не знаю в чем проблема, может твой класс находится в другом проекте или сборке?
https://www.youtube.com/watch?... e=youtu.be
1
7 / 7 / 0
Регистрация: 05.04.2016
Сообщений: 410
14.05.2019, 23:04  [ТС] 5
Ну, исходя из этого видео могу предположить, что проблема в том, что мой не-унаследованный класс - абстрактный, ибо это класс предмета и я собираюсь от него наследовать конкретные предметы и их уже класть в переменную, разве что я ушёл от компа, пока проверить этот факт, что проблема в абстрактности, не могу

Добавлено через 1 минуту
Просто по логике, без вызова конструктора, в переменной не должно быть объекта, а на видео он в инспекторе сразу появляется готовый
0
3353 / 1769 / 1025
Регистрация: 26.10.2018
Сообщений: 5,198
14.05.2019, 23:08 6
Да, при сериализации ссылка не может быть null, экземпляр должен создаваться.
1
7 / 7 / 0
Регистрация: 05.04.2016
Сообщений: 410
14.05.2019, 23:11  [ТС] 7
Есть тогда идеи как это обойти? Как получить возможность выбрать какой объект будет лежать в переменной при запуске? С наименьшими затратами производительности и удобства использования
0
295 / 244 / 128
Регистрация: 24.12.2014
Сообщений: 708
14.05.2019, 23:29 8
Цитата Сообщение от Nordicus666 Посмотреть сообщение
Есть тогда идеи как это обойти?
да:
1) не использовать абстрактный класс;
2) использовать конкретный не абстрактный класс-наследник вместо базового;

Как по мне, то каждый раз настраивать предметы в инспекторе только лишняя трата времени.
0
7 / 7 / 0
Регистрация: 05.04.2016
Сообщений: 410
14.05.2019, 23:30  [ТС] 9
Если, допустим, написать енум со всеми объектами в формате item_box = typeof(Item_Box) и после чего в функции start унаследованного класса через Activator создавать и присваивать объект (самое удобное, что я придумал), то нужно будет так каждый написанный объект добавлять в перечисление, что не очень удобно, есть другие варианты?
0
3353 / 1769 / 1025
Регистрация: 26.10.2018
Сообщений: 5,198
14.05.2019, 23:43 10
ScriptableObject почему бы не использовать, раз уж в инспекторе хочешь настраивать?
1
7 / 7 / 0
Регистрация: 05.04.2016
Сообщений: 410
15.05.2019, 00:12  [ТС] 11
Потому что я только что узнал про него и прочитал пару статей как я понял, это тот же monobehaviour, только без возможности добавить его как компонент и без соответствующих этому функций, вроде update, start, ontriggerstay и т.п., верно?
0
3353 / 1769 / 1025
Регистрация: 26.10.2018
Сообщений: 5,198
15.05.2019, 00:16 12
Да, он не прикрепляется к объектам в отличии от монобеха.
1
7 / 7 / 0
Регистрация: 05.04.2016
Сообщений: 410
15.05.2019, 00:35  [ТС] 13
У меня, если кратко, есть скрипт Item_Dropped, хранящий в себе Item,который является абстрактным классом и от которого надо наследовать конкретные предметы, а после чего выставить на сцене объекты с Item_Dropped и просто перетащить в скрипты какой именно предмет в том или ином объекте я хочу, потому так не прокатит

Добавлено через 53 секунды
Это, если что, в ответ на пункты про «не использовать абстрактный класс», просто не нашёл как цитировать, сидя с телефона

Добавлено через 2 минуты
Учитывая очевидное удобство ScriptableObject в данной ситуации, тогда может есть какая то возможность ещё и запихнуть несколько таких объектов в один файл и выбирать в Юнити какой именно класс я хочу повесить в скрипт? (Что бы не создавать под сотню отдельных файлов под разные предметы, хотя, возможно, стоит так делать, потому пока просто интересуюсь)
0
3353 / 1769 / 1025
Регистрация: 26.10.2018
Сообщений: 5,198
15.05.2019, 00:37 14
Абстрактный класс ничем не отличается от обычного, кроме того что нельзя создать экземпляр, просто убери слово абстракт и наследуй дальше как от базового.

Добавлено через 1 минуту
Цитата Сообщение от Nordicus666 Посмотреть сообщение
Учитывая очевидное удобство ScriptableObject в данной ситуации, тогда может есть какая то возможность ещё и запихнуть несколько таких объектов в один файл и выбирать в Юнити какой именно класс я хочу повесить в скрипт?
Не понял, что куда запихнуть?
1
7 / 7 / 0
Регистрация: 05.04.2016
Сообщений: 410
15.05.2019, 01:26  [ТС] 15
Цитата Сообщение от 1max1 Посмотреть сообщение
Абстрактный класс ничем не отличается от обычного, кроме того что нельзя создать экземпляр, просто убери слово абстракт и наследуй дальше как от базового.
Знаю, что ничем не отличается, к счастью в ООП я не слаб (надеюсь :D), но класс абстрактный для невозможности случайно создать его экземпляр и для возможности объявления абстрактных методов и свойств в нем, а они нужны мне абстрактными для того что бы, при наследовании, не забыть их описать (а то бывало, забываешь, а потом пару дней разбираешься, почему без ошибок и работает не так код)

Добавлено через 3 минуты
Цитата Сообщение от 1max1 Посмотреть сообщение
Не понял, что куда запихнуть?
ну, по факту меня интересует возможность положить в переменную типа Item у скрипта Item_Dropped (лежащего в каком-либо объекте) тот или иной объект, унаследованный от этого самого Item, так вот можно, как я понимаю (учитывая, что Item унаследован от ScriptableObject), создавать по скрипту (по файлу) на каждый такой унаследованный от Item класс и затем, перетаскивая этот скрипт на соответствующее поле у Item_Dropped в инспекторе у объекта задавать что там будет лежать, но можно ли как то сделать так, что бы все классы, унаследованные от Item - были прописаны в одном файле? мне, просто, кажется так будет экономнее и удобнее, учитывая, что каждый индивидуальный предмет не слишком то и большим куском кода описывается

Добавлено через 13 минут
Хм. Попробовал сделать абстрактный класс Item унаследованным от ScriptableObject, поле этого типа действительно появилось в скрипте Item_Dropped, но вот не абстрактный Item_Box, унаследованный от Item (даже в отдельном файле с таким же именем Item_Box.cs) всё равно не получается перетащить на поле у скрипта, что бы положить туда именно этот объект

Добавлено через 4 минуты
Перейду к конкретике:
ItemContainer.cs:
C#
1
2
3
4
5
6
7
8
9
10
11
12
public class ItemContainer : InteractableObject
{
    public Item item;
    public override void interact(Player player)
    {
        if (item != null)
        {
            player.inventory.addItem(item);
            Destroy(gameObject);
        }
    }
}
InventorySystem.cs (отрывок):
C#
1
2
3
4
5
6
[System.Serializable]
public abstract class Item : ScriptableObject
{
    public abstract float weight { get; }
    public abstract float size { get; }
}
Item_Box.cs:
C#
1
2
3
4
5
public class Item_Box : Item
{
    public override float weight { get; } = 10f;
    public override float size { get; } = 10f;
}
в инспекторе появляется поле item из скрипта ItemContainer, даже со значением None, как и должно быть, но вот перетащить в него Item_Box не получается
0
3353 / 1769 / 1025
Регистрация: 26.10.2018
Сообщений: 5,198
15.05.2019, 01:55 16
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using UnityEngine;
 
abstract class Item : ScriptableObject
{
    public abstract float weight { get; }
    public abstract float size { get; }
}
 
[CreateAssetMenu(fileName = "Item_Box", menuName = "Items/Item_Box", order = 0)]
class Item_Box : Item
{
    public override float weight { get; } = 10f;
    public override float size { get; } = 10f;
}
C#
1
2
3
4
5
6
7
8
using UnityEngine;
 
class InteractableObject : MonoBehaviour { }
 
class ItemContainer : InteractableObject
{
    public Item item;
}
Всё работает, однако, свойства не будут отображаться в инспекторе, нужны публичные поля, ну или же с атрибутом [SerializeField].
Миниатюры
Сделать переменную видимой в инспекторе  
1
7 / 7 / 0
Регистрация: 05.04.2016
Сообщений: 410
15.05.2019, 02:01  [ТС] 17
Благодарю за подобное решение, мне как раз и не требуется, что бы свойства отображались, мне только что бы можно было указать конкретный объект. Мне б ещё только понять что происходит в
[CreateAssetMenu(fileName = "Item_Box", menuName = "Items/Item_Box", order = 0)]
0
3353 / 1769 / 1025
Регистрация: 26.10.2018
Сообщений: 5,198
15.05.2019, 02:05 18
Простой пункт меню для создания ассета. Но я тогда не понимаю зачем он нужен раз его не нужно настраивать в инспекторе
Миниатюры
Сделать переменную видимой в инспекторе  
1
3353 / 1769 / 1025
Регистрация: 26.10.2018
Сообщений: 5,198
15.05.2019, 02:13 19
Кажется понял...))
1
7 / 7 / 0
Регистрация: 05.04.2016
Сообщений: 410
15.05.2019, 03:17  [ТС] 20
Цитата Сообщение от 1max1 Посмотреть сообщение
Но я тогда не понимаю зачем он нужен раз его не нужно настраивать в инспекторе
что бы можно было распихать один и тот же скрипт ItemContainer по разным объектам, а затем в каждый из них положить свой конкретный предмет, т.е. объект, унаследованный от абстрактного Item, раз положить, значит это должен быть ассет (из ассетов же перетаскиваем, допустим, префаб, когда нужно скрипту указать что создавать), а поскольку предметов может быть очень много, пихать их в разные скрипты не очень, потому и нужен был способ, озвученный вами про автоматическое создание ассетов из скрипта
0
15.05.2019, 03:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.05.2019, 03:17
Помогаю со студенческими работами здесь

Можно ли сделать переменную видимой на нескольких формах?
Можно ли сделать переменную с типом Extended видимой на нескольких формах?

Как сделать переменную видимой для оператора goto
Доброго времени суток! Имеется такой кусок кода: void Func() { switch (Data.Block) ...

Как сделать кнопку видимой-не видимой?
Как сделать кнопку видимой-не видимой?

Как сделать свойство которое было бы видно в инспекторе объектов?
как при написании своего компонента сделать свойство которое было бы видно в инспекторе объектов


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru