Как в иерархии скриптов не дублировать родителя?
| |
alexsilent | Дата: Пятница, 24 Сентября 2021, 15:44 | Сообщение # 1 |
почти ветеран
Сейчас нет на сайте
| Я совсем не разбираюсь в понятиях программирования, просто 10 лет программирую по методу тыка, "эту штуку сюда, а этот прибамбас туда" даже не знаю как по научном спросить, а то может быть и справшивать бы не пришлось, хватило бы гугла.
В общем, я недавно попробовал иерархию проводить у скриптов подсмотрев в Game Maker 2, и это работает и тут, только вот непонятно, как сделать так чтобы родительский скрипт не дублировался:
Код using System.Collections; using System.Collections.Generic; using UnityEngine;
public class Exit : Interactive { ... }
то есть тут вместо обычного MonoBehaviour я поставил Interactive (название родительского скрипта), но когда попробовал сделать родителя ещё одному скрипту и эти два скрипта повесил на объект, то у объекта получилось 2 Interactive и каждый со своими параметрами, так что пока пришлось отказаться от идеи повсеместно использовать такую фичу.
|
|
| |
Robinzon787 | Дата: Пятница, 24 Сентября 2021, 16:03 | Сообщение # 2 |
Construct'орщик
Сейчас нет на сайте
| Цитата alexsilent ( ) я недавно попробовал иерархию проводить у скриптов подсмотрев в Game Maker 2 Я не знаю ничего про Game Maker 2. Попробуй объяснить большим количеством кода. Что значит Цитата alexsilent ( ) иерархию проводить у скриптов ?
Переустановил ос - начал жизнь с чистого листа.
Сообщение отредактировал Robinzon787 - Пятница, 24 Сентября 2021, 16:03 |
|
| |
alexsilent | Дата: Пятница, 24 Сентября 2021, 16:44 | Сообщение # 3 |
почти ветеран
Сейчас нет на сайте
| Цитата Robinzon787 ( ) Попробуй объяснить большим количеством кода. Что значит
Окей! Допустим у меня есть скрипты: 1) Exit - это различные двери и выходы на другие уровни
Код [code]using System.Collections; using System.Collections.Generic; using UnityEngine;
public class Exit : Interactive { // здесь просто инициализация обычных переменных и функции, но их слишком много, и не в них дело }
2) Character - это персонажи с которыми можно поговорить
Код [code]using System.Collections; using System.Collections.Generic; using UnityEngine;
public class Character : Interactive { // здесь просто инициализация обычных переменных и функции, но их слишком много, и не в них дело }
И мне нужно в обоих скриптах использовать эти объекты, то есть при наведения курсора объект подсвечивался, а при нажатии активировался бы. Поэтому добавил третий скрипт, хотя раньше бы я просто каждому скрипту одинаковые строки бы повесил.
3) Interactive - этот скрипт для того чтобы объект подсвечивался при наведении, а при нажатии активировался.
Код [code]using System.Collections; using System.Collections.Generic; using UnityEngine;
public class Interactive : MonoBehaviour { // здесь просто инициализация обычных переменных и функции, но их слишком много, и не в них дело }
Скрипты очень большие, не уверен что они сюда поместятся, но в этом не суть. Суть в том, что если на объект повесить сразу и Exit и Character, то на объекте будет 2 скрипта Interactive, и у каждого свои настройки переменных, а хотелось бы чтобы скрипт Interactive не дублировался.
Добавлено (24 Сентября 2021, 16:48) --------------------------------------------- PS Конечно, есть просто вариант вешать на все объекты дополнительнй скрипт Interactive, а у тех скриптов убрать родителя:
Код public class Exit : MonoBehaviour { // убрал иерархию //... }
Код public class Character : MonoBehaviour { // убрал иерархию //... }
Но тогда придётся руками добавлять Interactive, а так он автоматически бы встроился.
Добавлено (24 Сентября 2021, 17:01) --------------------------------------------- Вообще бесят эти отдельные скрипты, из-за этого у меня на каждом объекте висит тонна отдельных скриптов, и не дай бог забыл какой-то скрипт повесить,в идеале хотелось бы чтобы на 1 объект - был 1 скрипт, но это нереально. А не вот эта лента тонны скриптов:
Так бы хоть убрал Interactive как отдельный скрипт, немного бы пространство почистилось в инспекторе.
Сообщение отредактировал alexsilent - Пятница, 24 Сентября 2021, 17:08 |
|
| |
manonedge | Дата: Пятница, 24 Сентября 2021, 17:54 | Сообщение # 4 |
почетный гость
Сейчас нет на сайте
| Для этого используют интерфейсы - interface. https://www.youtube.com/watch?v=_YgyvapIvSY
|
|
| |
Robinzon787 | Дата: Пятница, 24 Сентября 2021, 18:40 | Сообщение # 5 |
Construct'орщик
Сейчас нет на сайте
| Цитата alexsilent ( ) Вообще бесят эти отдельные скрипты - Это называется компонентно-ориентированое программирование)
Цитата alexsilent ( ) Суть в том, что если на объект повесить сразу и Exit и Character, то на объекте будет 2 скрипта Interactive, и у каждого свои настройки переменных, а хотелось бы чтобы скрипт Interactive не дублировался. - То есть ты хочешь чтобы начальные данные были одни и те же у разных игровых объектов? Посмотри про ScriptableObjects в unity.
Вообще, если я правильно понял твою ситуацию, то тебе как и написал manonedge, можно создать интерфейс IInteractive, который, например будет содержать в себе метод Interact. В свою очередь Exit и Character будут реализовать этот интерфейс - каждый по своему.
Цитата alexsilent ( ) и не дай бог забыл какой-то скрипт повесить, Ну повесь на основной скрипт [RequireComponent(typeof(Interactive))], тогда если Interactive это MonoBehavior, то он сам будет вешаться в пару к основному скрипту.
Переустановил ос - начал жизнь с чистого листа.
|
|
| |
drcrack | Дата: Пятница, 24 Сентября 2021, 21:29 | Сообщение # 6 |
старожил
Сейчас нет на сайте
| Цитата Вообще бесят эти отдельные скрипты, из-за этого у меня на каждом объекте висит тонна отдельных скриптов у сложного проекта в любом случае будет сложная архитектура, ты никак этого не избежишь
Цитата Это называется компонентно-ориентированое программирование) и уже используется в тысячах игр
подумай, какая вообще у тебя цель — сделать игру, или чтобы инспектор выглядел красиво?..
|
|
| |
alexsilent | Дата: Суббота, 25 Сентября 2021, 09:15 | Сообщение # 7 |
почти ветеран
Сейчас нет на сайте
| manonedge, Robinzon787, Спасибо!
>>подумай, какая вообще у тебя цель — сделать игру, или чтобы инспектор выглядел красиво?.. drcrack, Тоже верно, просто ещё раздражает такая вещь как получение доступа к скрипту, через GetComponent всегда на старте скриптов, получается паутина доступа к компонентам, и таких скриптов, которым нужно получить доступ становится всё больше с увеличением кода, а так с такой фишкой, компонент уже внутри без лишних строк кода:
Код public class Exit : Interactive {...}
Сообщение отредактировал alexsilent - Суббота, 25 Сентября 2021, 09:17 |
|
| |
drcrack | Дата: Суббота, 25 Сентября 2021, 10:27 | Сообщение # 8 |
старожил
Сейчас нет на сайте
| alexsilent, по-моему ты озадачился какой-то ерундой, это не просто не проблема, а вообще самая легкая часть разработки, ведь юнити уже все сделала за тебя. если ты думаешь что сможешь придумать архитектуру лучше чем команда профессиональных разрабов с опытом, ну окей, можешь попробовать, но повторю, на твоем месте я бы оставил все как есть и занялся чем-нибудь, что действительно важно
+почитай про ООП и наследование в частности чтобы хотя бы знать что ты делаешь, возможно тогда придет понимание что это не тот инструмент который тебе нужен для этой задачи (если это вообще можно назвать задачей)
Сообщение отредактировал drcrack - Суббота, 25 Сентября 2021, 10:29 |
|
| |
|