|
Общие вопросы вопросы не попадающие ни в один из доступных разделов |
03.11.2019, 18:41
|
#166
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,359
Написано 2,473 полезных сообщений (для 6,856 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
Сообщение от EvilOkta
Когда кол-во классов становится большим становится сложно в голове удерживать какие методы они реализуют, интерфейсы наследуют и какими свойствами обладают.
|
Мне кажется, что тут скорее проблема проектирования и никакие документации не помогут. Стоит посмотреть на SOLID,
как на некий набор общепринятых практик по написанию легко поддерживаемого кода.
Естественно всё и сразу не надо пытаться исполнять, начать можно с "SRP",
а "DI" оставить до лучших времён, когда он действительно тебе будет нужен.
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
05.11.2019, 08:04
|
#167
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
Сообщение от EvilOkta
Спасибо ) энтерпрайз дорого (я ж не зарабатываю программированием), идея с partial интересная. Параллельно в Excel заношу публичные методы классов и их сигнатуры, на всякий случай.
|
Есть полезное окно, в котором всю структуру проекта можно посмотреть. Называется Обозреватель объектов (Вид => Обозреватель объектов). Там все можно подсмотреть. А если есть XML комментарии, то и их можно посмотреть в удобном формате.
Сообщение от Антихрист
Конкретно к этому примеру - выглядит не очень. В первую очередь за счет цикла с сравнением строк внутри гетера. Добавь одну переменную и закэшируй туда индекс.
protected static readonly string[] Monthes = { "января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря" };
protected byte monthIndex; protected string monthName;
protected byte MonthIndex { get => monthIndex; set { if (value <= 0 || value > 12) return; monthIndex = (byte) (value - 1); monthName = Monthes[monthIndex]; } }
protected string MonthName => monthName;
|
Вообще хранить название месяца в отдельной переменной не надо. Зачем память тратить. Используй свойство, если есть индекс.
protected string MonthName => Mounthes[monthIndex];
или
protected byte monthIndex = -1; protected string MonthName => monthIndex == -1 ? null : Mounthes[monthIndex];
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
05.11.2019, 23:23
|
#168
|
Разработчик
Регистрация: 20.01.2007
Сообщений: 485
Написано 182 полезных сообщений (для 412 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
Сообщение от pax
Есть полезное окно, в котором всю структуру проекта можно посмотреть. Называется Обозреватель объектов (Вид => Обозреватель объектов). Там все можно подсмотреть. А если есть XML комментарии, то и их можно посмотреть в удобном формате.
Вообще хранить название месяца в отдельной переменной не надо. Зачем память тратить. Используй свойство, если есть индекс.
protected string MonthName => Mounthes[monthIndex];
|
Согласен, если monthIndex не может быть изменен в другом месте выйдя за рамки массива.
protected byte monthIndex = -1; protected string MonthName => monthIndex == -1 ? null : Mounthes[monthIndex];
|
Вроде С# не позволит впихнуть в byte отрицательное значение.
Как вариант
protected byte? monthIndex = null;
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
07.11.2019, 20:52
|
#169
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
Сообщение от Антихрист
Вроде С# не позволит впихнуть в byte отрицательное значение.
Как вариант
protected byte? monthIndex = null;
|
Да, писал прям сюда, поэтому ошибся. Можно sbyte в данном случае использовать.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
07.11.2019, 21:48
|
#170
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
Сообщение от Антихрист
Согласен, если monthIndex не может быть изменен в другом месте выйдя за рамки массива.
|
Хорошая идея! Можно сделать, это действительно лучше
Сообщение от pax
Есть полезное окно, в котором всю структуру проекта можно посмотреть. Называется Обозреватель объектов (Вид => Обозреватель объектов). Там все можно подсмотреть. А если есть XML комментарии, то и их можно посмотреть в удобном формате.
|
Вот! Как раз таки подобное я искал, спасибо!
Сообщение от Randomize
Мне кажется, что тут скорее проблема проектирования и никакие документации не помогут. Стоит посмотреть на SOLID,
как на некий набор общепринятых практик по написанию легко поддерживаемого кода.
Естественно всё и сразу не надо пытаться исполнять, начать можно с "SRP",
а "DI" оставить до лучших времён, когда он действительно тебе будет нужен.
|
SOLID только начал разбираться, но мне уже не понравилось "Каждый класс должен иметь одну и только одну причину для изменений" - у меня в голове это выглядит как огромная куча классов, каждый из который использует единственный публичный метод, который делает что-то. Я больше привык когда класс описывает поведение в заданных рамках, чтобы не нарушать принципа бритвы Оккама.
Чтобы не заниматься ответом на цитаты, вопрос для понимания - в каком формате лучше использовать и хранить БД в Unity?
Или вообще без разницы?
upd конкретизирую вопрос - для проекта нужно подкачивать массивы информации в текстовом виде, в чем их лучше хранить и динамически при необходимости загружать - csv, txt, xml, xls и т.п.?
Последний раз редактировалось EvilOkta, 10.11.2019 в 11:29.
|
(Offline)
|
|
31.10.2020, 14:45
|
#171
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
И снова здравствуйте! Понимаю, что людей тут мало осталось, но вдруг кто поможет:
private void ResetBoolState(params bool[] ResetState)
{
foreach (bool rs in ResetState)
{
rs = false;
}
}
Такая конструкция не работает, так как IEnumerable не может изменять элемент коллекции. Есть ли варианты чтобы смог?
Задача - передать несколько bool параметров в метод и сбросить их состояния.
|
(Offline)
|
|
31.10.2020, 15:06
|
#172
|
Бывалый
Регистрация: 26.07.2009
Сообщений: 785
Написано 362 полезных сообщений (для 995 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
Сообщение от EvilOkta
И снова здравствуйте! Понимаю, что людей тут мало осталось, но вдруг кто поможет:
private void ResetBoolState(params bool[] ResetState)
{
foreach (bool rs in ResetState)
{
rs = false;
}
}
Такая конструкция не работает, так как IEnumerable не может изменять элемент коллекции. Есть ли варианты чтобы смог?
Задача - передать несколько bool параметров в метод и сбросить их состояния.
|
Никак, чтобы поменять значение примитивного типа вроде bool тебе надо его с ref передавать. А ref не стыкуется с params.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
31.10.2020, 17:45
|
#173
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,359
Написано 2,473 полезных сообщений (для 6,856 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
Сообщение от EvilOkta
Задача - передать несколько bool параметров в метод и сбросить их состояния.
|
Можно собрать все булы в 1 большой инт.
Примеры тут: https://alemil.com/bitmask
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
31.10.2020, 17:58
|
#174
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
Сообщение от Randomize
|
Хорошая идея! Возьму на заметку. Я, правда, уже решил задачу, но более топорным способом. Енумы соответствуют названиям булевых переменных в аниматоре
foreach (AnimatorControllerParameter parameter in NPCAnimator.parameters) { NPCAnimator.SetBool(parameter.name, false); } NPCAnimator.SetBool(Enum.GetName(typeof(enState), (int)CurrentAnimationState), true);
Последний раз редактировалось EvilOkta, 01.11.2020 в 00:09.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
14.11.2020, 23:21
|
#175
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
Созрел новый вопрос.
Есть лист объектов, который заполняется при старте игры.
public static List<GameObject> WorkPoints = new List<GameObject>();
На каждом объекте в сцене висит скрипт TableIsBusy с одним и тем же методом IAmBusy()
Есть событие на которое нужно подписать все эти методы с каждого объекта.
Делегат и событие создано, но никак не могу понять как получить имя метода с объекта в листе, для подписки. Копаю в эту сторону, но дает ошибку - явно не так.
foreach (GameObject WorkPlace in GameLogicInit.WorkPoints) { PlaceIsBusy += WorkPlace.GetComponent<TableIsBusy>().GetComponent("IAmBusyNow"); }
Как все таки правильно такие штуки делать? Интересует, потому что такие списки могут быть сформированы в рантайме и тогда необходимо получать список методов объектов в листе на ходу.
|
(Offline)
|
|
15.11.2020, 01:06
|
#176
|
Бывалый
Регистрация: 26.07.2009
Сообщений: 785
Написано 362 полезных сообщений (для 995 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
Сообщение от EvilOkta
Созрел новый вопрос.
Есть лист объектов, который заполняется при старте игры.
public static List<GameObject> WorkPoints = new List<GameObject>();
На каждом объекте в сцене висит скрипт TableIsBusy с одним и тем же методом IAmBusy()
Есть событие на которое нужно подписать все эти методы с каждого объекта.
Делегат и событие создано, но никак не могу понять как получить имя метода с объекта в листе, для подписки. Копаю в эту сторону, но дает ошибку - явно не так.
foreach (GameObject WorkPlace in GameLogicInit.WorkPoints) { PlaceIsBusy += WorkPlace.GetComponent<TableIsBusy>().GetComponent("IAmBusyNow"); }
Как все таки правильно такие штуки делать? Интересует, потому что такие списки могут быть сформированы в рантайме и тогда необходимо получать список методов объектов в листе на ходу.
|
Нет юнити под рукой, чтобы проверить, но чисто на сишарпе должно сработать что-то вроде:
PlaceIsBusy += WorkPlace.GetComponent<TableIsBusy>().IAmBusy;
В подписку ты должен сам метод передать, а не вызов метода, соответственно без скобок ().
Ну и IAmBusy это же метод, а не тип, как ты его через GetComponent получать собрался?
И конечно же сигнатура метода IAmBusy должна подходить под делегат в твоём событии, но это, я думаю, ты и так понимаешь.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
15.11.2020, 02:09
|
#177
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
Сообщение от Andvrok
Нет юнити под рукой, чтобы проверить, но чисто на сишарпе должно сработать что-то вроде:
PlaceIsBusy += WorkPlace.GetComponent<TableIsBusy>().IAmBusy;
В подписку ты должен сам метод передать, а не вызов метода, соответственно без скобок ().
Ну и IAmBusy это же метод, а не тип, как ты его через GetComponent получать собрался?
И конечно же сигнатура метода IAmBusy должна подходить под делегат в твоём событии, но это, я думаю, ты и так понимаешь.
|
Да, так заработало, спасибо! Сначала тупанул потому что вызываемый метод был private и соответственно был невидим для эвента.
По поводу EventSystem еще не разбирался что это за зверь такой, надо почитать. Пока тренируюсь на создании делегатов и эвентов, раньше и это было сложно - сейчас проще. Ну и как я понимаю эвенты и подписки создают слабую связность, что тоже хочется закрепить практикой )
|
(Offline)
|
|
15.11.2020, 02:31
|
#178
|
Бывалый
Регистрация: 26.07.2009
Сообщений: 785
Написано 362 полезных сообщений (для 995 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
Сообщение от EvilOkta
Да, так заработало, спасибо! Сначала тупанул потому что вызываемый метод был private и соответственно был невидим для эвента.
По поводу EventSystem еще не разбирался что это за зверь такой, надо почитать. Пока тренируюсь на создании делегатов и эвентов, раньше и это было сложно - сейчас проще. Ну и как я понимаю эвенты и подписки создают слабую связность, что тоже хочется закрепить практикой )
|
Покури на досуге https://habr.com/ru/post/527418/, может пару идей подкинет. Делегаты и события способ-то рабочий, но слишком «голый» и отчаянно требует сахара для удобств.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
15.11.2020, 15:23
|
#179
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
Кстати по поводу событий и прочего. Я знаю, что плохая практика в Update постоянно проверять кучу состояний для управления объектом, но возник следующий вопрос. Попробую объяснить.
Допустим есть NPC, у него есть методы, отвечающие за различные "действия" - идти, сесть, стоять и т.п. Все эти методы выведены под общую сигнатуру, для того чтобы ими можно было бы управлять через события и т.п.
Но в чем подвох. Например метод "идти" получает точку назначения и включает NavAgent типа так:
NPCPathFinder.SetDestination(Target.transform.position);
NPC начинает идти к цели - все отлично, но метод Walk по факту исполнен включением SetDestination, хотя NPC продолжает идти (я так и не разобрался, получается НавАгент работает асинхронно?). Допустим следующий метод после достижения цели должен быть "Стоять", и если формировать список методов для исполнения на основе делегата или списка методов, они сработают последовательно, т.е. установка цели -> метод Walk исполнен -> метод "стоять" (хотя NPC не дошел до цели). Это естественно неправильно.
Какие есть способы управления такими последовательностями?
У меня пока в голове только идея сделать какой-то промежуточный менеджер, который в апдейте каждую итерацию (что уже заставляет задуматься) проверяет достиг ли активный метод цели и если да, то активировать следующий в цепочке метод. Это нормальная практика, или костыли?
Надеюсь правильно объяснил задачу.
|
(Offline)
|
|
16.11.2020, 19:53
|
#180
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Проблемы разработки от EvilOkta
Тебе нужно копать в сторону State Machine (машина состояний). В Unity есть встроенная в Animator'е. Её иногда можно приспособить для логики. Вот пример:
Можешь найти готовую машину состояний, на ассет сторе много разного. Поищи например так: https://assetstore.unity.com/?q=Beha...rees&orderBy=1
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:14.
|