Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Unity > Общие вопросы

Общие вопросы вопросы не попадающие ни в один из доступных разделов

Ответ
 
Опции темы
Старый 03.11.2019, 18:41   #166
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,354
Написано 2,470 полезных сообщений
(для 6,850 пользователей)
Ответ: Проблемы разработки от 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (10.11.2019)
Старый 05.11.2019, 08:04   #167
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 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 <= || 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 == -null Mounthes[monthIndex]; 
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (06.11.2019)
Старый 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 == -null Mounthes[monthIndex]; 
Вроде С# не позволит впихнуть в byte отрицательное значение.
Как вариант
protected bytemonthIndex null
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (06.11.2019)
Старый 07.11.2019, 20:52   #169
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Проблемы разработки от EvilOkta

Сообщение от Антихрист Посмотреть сообщение
Вроде С# не позволит впихнуть в byte отрицательное значение.
Как вариант
protected bytemonthIndex null
Да, писал прям сюда, поэтому ошибся. Можно sbyte в данном случае использовать.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (07.11.2019)
Старый 07.11.2019, 21:48   #170
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Проблемы разработки от EvilOkta

Сообщение от Антихрист Посмотреть сообщение
Согласен, если monthIndex не может быть изменен в другом месте выйдя за рамки массива.
Хорошая идея! Можно сделать, это действительно лучше

Сообщение от pax Посмотреть сообщение
Есть полезное окно, в котором всю структуру проекта можно посмотреть. Называется Обозреватель объектов (Вид => Обозреватель объектов). Там все можно подсмотреть. А если есть XML комментарии, то и их можно посмотреть в удобном формате.
Вот! Как раз таки подобное я искал, спасибо!

Сообщение от Randomize Посмотреть сообщение
Мне кажется, что тут скорее проблема проектирования и никакие документации не помогут. Стоит посмотреть на SOLID,
как на некий набор общепринятых практик по написанию легко поддерживаемого кода.
Естественно всё и сразу не надо пытаться исполнять, начать можно с "SRP",
а "DI" оставить до лучших времён, когда он действительно тебе будет нужен.
SOLID только начал разбираться, но мне уже не понравилось "Каждый класс должен иметь одну и только одну причину для изменений" - у меня в голове это выглядит как огромная куча классов, каждый из который использует единственный публичный метод, который делает что-то. Я больше привык когда класс описывает поведение в заданных рамках, чтобы не нарушать принципа бритвы Оккама.

Чтобы не заниматься ответом на цитаты, вопрос для понимания - в каком формате лучше использовать и хранить БД в Unity?
Или вообще без разницы?
upd конкретизирую вопрос - для проекта нужно подкачивать массивы информации в текстовом виде, в чем их лучше хранить и динамически при необходимости загружать - csv, txt, xml, xls и т.п.?
__________________
Области Хаоса - мой новый Youtube проект

Последний раз редактировалось EvilOkta, 10.11.2019 в 11:29.
(Offline)
 
Ответить с цитированием
Старый 31.10.2020, 14:45   #171
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Проблемы разработки от EvilOkta

И снова здравствуйте! Понимаю, что людей тут мало осталось, но вдруг кто поможет:
  private void ResetBoolState(params bool[] ResetState)
    {
        foreach (bool rs in ResetState)
        {
            rs = false;
        }
    }
Такая конструкция не работает, так как IEnumerable не может изменять элемент коллекции. Есть ли варианты чтобы смог?
Задача - передать несколько bool параметров в метод и сбросить их состояния.
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 31.10.2020, 15:06   #172
Andvrok
Бывалый
 
Регистрация: 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (31.10.2020)
Старый 31.10.2020, 17:45   #173
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,354
Написано 2,470 полезных сообщений
(для 6,850 пользователей)
Ответ: Проблемы разработки от 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (31.10.2020)
Старый 31.10.2020, 17:58   #174
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Проблемы разработки от EvilOkta

Сообщение от Randomize Посмотреть сообщение
Можно собрать все булы в 1 большой инт.
Примеры тут: https://alemil.com/bitmask
Хорошая идея! Возьму на заметку. Я, правда, уже решил задачу, но более топорным способом. Енумы соответствуют названиям булевых переменных в аниматоре
foreach (AnimatorControllerParameter parameter in NPCAnimator.parameters)
        {
            
NPCAnimator.SetBool(parameter.namefalse);
        }
        
NPCAnimator.SetBool(Enum.GetName(typeof(enState), (int)CurrentAnimationState), true); 
__________________
Области Хаоса - мой новый Youtube проект

Последний раз редактировалось EvilOkta, 01.11.2020 в 00:09.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Randomize (31.10.2020)
Старый 14.11.2020, 23:21   #175
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Проблемы разработки от EvilOkta

Созрел новый вопрос.
Есть лист объектов, который заполняется при старте игры.
public static List<GameObjectWorkPoints = new List<GameObject>(); 
На каждом объекте в сцене висит скрипт TableIsBusy с одним и тем же методом IAmBusy()
Есть событие на которое нужно подписать все эти методы с каждого объекта.
Делегат и событие создано, но никак не могу понять как получить имя метода с объекта в листе, для подписки. Копаю в эту сторону, но дает ошибку - явно не так.
foreach (GameObject WorkPlace in GameLogicInit.WorkPoints)
        {
            
PlaceIsBusy += WorkPlace.GetComponent<TableIsBusy>().GetComponent("IAmBusyNow");
        } 
Как все таки правильно такие штуки делать? Интересует, потому что такие списки могут быть сформированы в рантайме и тогда необходимо получать список методов объектов в листе на ходу.
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 15.11.2020, 01:06   #176
Andvrok
Бывалый
 
Регистрация: 26.07.2009
Сообщений: 785
Написано 362 полезных сообщений
(для 995 пользователей)
Ответ: Проблемы разработки от EvilOkta

Сообщение от EvilOkta Посмотреть сообщение
Созрел новый вопрос.
Есть лист объектов, который заполняется при старте игры.
public static List<GameObjectWorkPoints = 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (15.11.2020)
Старый 15.11.2020, 02:09   #177
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Проблемы разработки от EvilOkta

Сообщение от Andvrok Посмотреть сообщение
Нет юнити под рукой, чтобы проверить, но чисто на сишарпе должно сработать что-то вроде:

PlaceIsBusy += WorkPlace.GetComponent<TableIsBusy>().IAmBusy
В подписку ты должен сам метод передать, а не вызов метода, соответственно без скобок ().
Ну и IAmBusy это же метод, а не тип, как ты его через GetComponent получать собрался?
И конечно же сигнатура метода IAmBusy должна подходить под делегат в твоём событии, но это, я думаю, ты и так понимаешь.
Да, так заработало, спасибо! Сначала тупанул потому что вызываемый метод был private и соответственно был невидим для эвента.
По поводу EventSystem еще не разбирался что это за зверь такой, надо почитать. Пока тренируюсь на создании делегатов и эвентов, раньше и это было сложно - сейчас проще. Ну и как я понимаю эвенты и подписки создают слабую связность, что тоже хочется закрепить практикой )
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 15.11.2020, 02:31   #178
Andvrok
Бывалый
 
Регистрация: 26.07.2009
Сообщений: 785
Написано 362 полезных сообщений
(для 995 пользователей)
Ответ: Проблемы разработки от EvilOkta

Сообщение от EvilOkta Посмотреть сообщение
Да, так заработало, спасибо! Сначала тупанул потому что вызываемый метод был private и соответственно был невидим для эвента.
По поводу EventSystem еще не разбирался что это за зверь такой, надо почитать. Пока тренируюсь на создании делегатов и эвентов, раньше и это было сложно - сейчас проще. Ну и как я понимаю эвенты и подписки создают слабую связность, что тоже хочется закрепить практикой )
Покури на досуге https://habr.com/ru/post/527418/, может пару идей подкинет. Делегаты и события способ-то рабочий, но слишком «голый» и отчаянно требует сахара для удобств.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (15.11.2020)
Старый 15.11.2020, 15:23   #179
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Проблемы разработки от EvilOkta

Кстати по поводу событий и прочего. Я знаю, что плохая практика в Update постоянно проверять кучу состояний для управления объектом, но возник следующий вопрос. Попробую объяснить.
Допустим есть NPC, у него есть методы, отвечающие за различные "действия" - идти, сесть, стоять и т.п. Все эти методы выведены под общую сигнатуру, для того чтобы ими можно было бы управлять через события и т.п.
Но в чем подвох. Например метод "идти" получает точку назначения и включает NavAgent типа так:
NPCPathFinder.SetDestination(Target.transform.position); 
NPC начинает идти к цели - все отлично, но метод Walk по факту исполнен включением SetDestination, хотя NPC продолжает идти (я так и не разобрался, получается НавАгент работает асинхронно?). Допустим следующий метод после достижения цели должен быть "Стоять", и если формировать список методов для исполнения на основе делегата или списка методов, они сработают последовательно, т.е. установка цели -> метод Walk исполнен -> метод "стоять" (хотя NPC не дошел до цели). Это естественно неправильно.
Какие есть способы управления такими последовательностями?
У меня пока в голове только идея сделать какой-то промежуточный менеджер, который в апдейте каждую итерацию (что уже заставляет задуматься) проверяет достиг ли активный метод цели и если да, то активировать следующий в цепочке метод. Это нормальная практика, или костыли?
Надеюсь правильно объяснил задачу.
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 16.11.2020, 19:53   #180
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Проблемы разработки от EvilOkta

Тебе нужно копать в сторону State Machine (машина состояний). В Unity есть встроенная в Animator'е. Её иногда можно приспособить для логики. Вот пример:


Можешь найти готовую машину состояний, на ассет сторе много разного. Поищи например так: https://assetstore.unity.com/?q=Beha...rees&orderBy=1
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (16.11.2020)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 20:38.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com