Без конкретных примеров разобраться сложно. Не совсем понятно зачем что-то дублировать если можно в реализации метода/свойства интерфейса просто достать нужные данные из "обертки"?
Простецкий пример мусорки. При n - м количестве свойств, главный скрипт захламлен реализациями интерфейсов.
Код
using System.Collections; using System.Collections.Generic; using UnityEngine;
public class MainClass : MonoBehaviour, IInitDataForLogicTypeOne, IInitDataForLogicTypeTwo {
public Data data = new Data();
private LogicTypeOne logicOne = new LogicTypeOne(); private LogicTypeOne logicTwo = new LogicTypeOne();
public string valueA { get { return data.valueA; } } public string valueB { get { return data.config.valueB; } } public string valueC { get { return data.config.valueC; } }
Правильней нужные компоненту данные выделить в интерфейс и пусть разные MonoBehaviours их реализуют согласно своему внутреннему устройству, а компонент при создании получает ссылку на главный обьект в виде интерфейса и использует его. В целом то же самое что ты делаешь, только красиво и правильно
В какой-то статье на хабре читал, что класс не должен заниматься инициализацией данных, это не его обязанность, в принципе с чем я и согласен. Класс должен только обрабатывать данные и куда-то возвращать результат. По поводу интерфейсов, мне нравится идея и так у меня было реализовано ранее. Все хорошо, пока данные перечислены списком в интерфейсе из-за чего в главном классе, реализующем интерфейс была мусорка из данных. Как только я захотел обернуть данные в класс, это общие данные, которые нельзя приписать к какому-то конкретному компоненту, столкнулся со следующей проблемой. Главный класс содержит обертку из общих данных и списка компонентов. Если интерфейс реализующийся главным классом, захочет получить переменную из обертки, нужно будет тут-же в главном классе дублировать переменную - свойство, которое будет вытягивать данные из обертки. Я сново вернусь к мусорке. Можно заставить класс - обертку реализовать интерфейс, но тогда туда я должен записать ссылки на компоненты, если они потребуются для интерфейса.
Сообщение отредактировал urbemAngeli - Четверг, 22 Апреля 2021, 19:07
Почему нельзя в конструктор этого класса передать ссылку на сам MonoBehaviour и пусть он сам берет любые данные какие ему нужны?
Потому что главные классы MonoBehaviour для разных обьектов свои, и те классы (скажем компоненты), которым нужны исходные данные, нужно будет приводиться к конкретному главному классу, чтобы вытащить оттуда данные, как по мне - это не совсем правильно. Вместо этого, я из любого уголка в главном классе могу дергнуть данные и положить в компонент.
Всем привет. Пытаюсь построить часть архитектуры взаимодействия объектов следующим образом. В основном классе объекта (он MonoBehaviour) перечисляю классы (не MonoBehaviour) которые придают некое поведение объекта. Далее в эти классы закидываю все исходные данные, которые необходимые для их работы. В тех классах, для которых требуются данные, которые передаются по значению - они имеют ссылку на анонимный метод, где в базовом классе объекта вытягивает нужное поле из соответствующего класса. Это позволяет класс с поведением цеплять к разным объектам, лишь бы были инициализированы исходные данные. Может я слишком все усложняю и можно проще все сделать, насколько такой подход адекватный / или нет?
Название: FU!ball Жанр: спорт Платформа: Android Разработчик: DITWOG
Описание: Всем привет! Хочу поделиться с вами своей веселой игрой. FU!ball - это футбол со взрывами и расчлененкой. Уже звучит неплохо, не правда ли? Вам необходимо прыгать, да именно прыгать в футболе, и пытаться забить гол противнику. Вас будут окружать мины, которые помогут избавиться от лишней части тела. Ах да, еще при сильном ударе мяча в голову, ну вы поняли... Вы сможете играть как с друзьями так и с ИИ, который превосходит вас по IQ (военная разработка). Ну и разумеется, без этого никак, вы сможете делиться своими результатами со своими однокласниками. Есть еще много вещей, которые я не могу вам рассказать, так как они сказали, что я стану главным героем своей игры... П.С. И да, я ничего не курил! Но это не точно...
Всем привет! Подскажите пожалуйста, при загрузки игры в плей маркет стоит ли подключать сервис google play app signing. Как я понял, при его использовании, в версиях приложения скачанных вне маркета не будут работать внутриигровые платежи. Т.е. игра должна распространяться только через маркет, это больше + или -?
Всем привет! Столкнулся с такой проблемой. После запекания теней для карты и при загрузке этой карты из ресурсов, на ней отсутствуют тени и сама она темная. Слышал, что это баг юнити (у меня 5.6), так ли это?
drcrack, попробовал - та же история. Пришел к выводу, что проще написать скрипт который будет обрабатывать эту панель и далее передавать событие в нужные мне скрипты.
Всем привет! Столкнулся с такой дилеммой. Есть две кнопки, каждая на пол экрана и панель на весь экран (image), на которой висит скрипт с обработкой свайпа. В иерархии панель внизу и она перекрывает кнопки, в результате чего они не работают. Как мне сделать, чтобы кнопки и панель могли обрабатываться одновременно, не перекрывая друг друга?
InsaneSystems, Idle - это состояние, в котором отсутствует клип анимации. Мне это нужно, чтобы я мог перейти к следующему состоянию в любой момент. Также могу добавить, что это проблема не только конкретно с этим объектом (который анимируется). Пробовал анимировать изменение различных параметров объектов, а потом, опять таки, анимация не активна, но из скрипта/редактора изменить параметры, которые я ранее анимировал - не удается.
Всем привет! Ребят, ну что за бред. Есть анимация "Presentation_gift" в которой помимо прочего, я включаю/отключаю объект "Занавес". Когда у меня анимация в состоянии "Idle", каким то образом анимация "Presentation_gift" блокирует объект "Занавес", т.е. я вручную не могу никак включить/отключить этот объект. Я не могу понять, если анимация которая влияет на этот объект не активна, как она может блокировать его?
Всем привет! Ребят, кто добавлял контент для продажи в goole play стоимостью меньше 1 доллара. Проблема в том, что если я указываю стоимоть товара в месной валюте 14 грн ~ 0.5$, то его пересчет стоимости для других стран выполняется неправильно. Например для США стоимость составляет 0.99$. Если я указываю больше доллара, то расчет идет правильно. Можно и вручную для каждой страны указать цену, однако расчитывать 4 цены для 61 страны - это безумство. Как вы настраивали цены?
Всем привет. Интересует такой вопрос, насколько правильно я поступаю в следующем случае? Суть в том, есть некое событие и я на него подписываю различные методы. При вызове этого события в вызываемых методах я анализирую аргументы и при необходимости прерываю работу метода. В итоге, у меня в большинстве случаев полностью отрабатывает только 1 метод. Делаю так, потому что часто бывает так, когда происходит некое событие я получаю параметры которые описывают событие, и в зависимости от этих параметров мне нужно выполнить различную логику. Вместо того, чтобы плодить кучу событий с однотипными аргументами, я и использую событие "почти для всего".
Всем привет! При настройки игры с google play в unity возникла такая ошибка (на скрине видно). В гугле нашел, что ошибка связана с xml файлом. Однако почему она появляется и как ее решить в контексте настройки игры я ничего не нашел. Может кто в курсе, как решить данную проблему?
drcrack, вы похоже меня не поняли. Попробую по другому объяснить. На первом скрине показан игрок с исходной позицией. При его повороте против часовой стрелки угол должен увеличиваться от 0 к 360, при вращении по час. стрелки уменьшаться. Сейчас же у меня, где выделено синим угол "обнуляется", хотя должен быть 180 град. Так вот, как получить угол поворота игрока вокруг своей оси от 0 к 360 ?, если transPlayer.localEulerAngles.x не тот угол показывает. А ваш метод добавляет к текущему углу еще значение, чего мне не нужно
Сообщение отредактировал urbemAngeli - Суббота, 12 Мая 2018, 18:19
Всем привет! Не могу разобраться с углами объекта. На картинке показан игрок, который может вращаться по часовой или против часовой стрелки. Углы которые подписаны (на первом скрине), я получил при помощи transPlayer.localEulerAngles.x. Мне нужно получить углы как показаны на втором скрине. Как я только не пробовал рассчитывать эти углы, однако если угол поворота игрока был ниже горизонтальной оси, рассчитанный угол становился неправильным. Может есть у кого какие идеи, как получить результат согласно второму скрину? Скрин 1:
Скрин 2:
Вот решение, может кому-то пригодится:
public float Get360Angle(Vector3 a, Vector3 b) { float angle = Vector3.Angle(a, b); return Vector3.Cross(a, b).z <= 0.0f ? angle : 360.0f - angle; }
Сообщение отредактировал urbemAngeli - Воскресенье, 13 Мая 2018, 13:32
drcrack, рассматривал этот вариант, однако не понравилось как сталкивается этот объект с другими при вращении (проходит сквозь них), сейчас же через localRotation добился более "мягкого" столкновения с объектами, таким способом:
Сообщение отредактировал urbemAngeli - Пятница, 16 Февраля 2018, 14:47