Seaward.ru

Здравствуйте, гость ( Вход | Регистрация )

> Разработка на Unity, Неочевидные тонкости
ALexusB
сообщение Nov 30 2022, 19:22
Сообщение #1


Разработчик ВМЛ-КВЛ
*******

Seaward TeamЖелезный Профессор
Группа: Admin
Сообщений: 15,804
Регистрация: 2-November 04
Пользователь №: 3



Тема для всяко-разно по Unity
Как обмен опытом по полезным трюкам.
На сегодня много видео-уроков и книг на рус. это позволяет все освоить.

Но тонкости остаются все равно.
Полезный сайт визуального представления кривых анимации для ее редактирования в редакторе или из кода (DOTween)
https://easings.net/#

До этого только опытно подбирал, тут же можно прикинуть нужное поведение.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
 
Reply to this topicStart new topic
Ответов(1 - 15)
ALexusB
сообщение Dec 1 2022, 10:26
Сообщение #2


Разработчик ВМЛ-КВЛ
*******

Seaward TeamЖелезный Профессор
Группа: Admin
Сообщений: 15,804
Регистрация: 2-November 04
Пользователь №: 3



Юнити очень мощная система, но не очевидная, когда работаешь первый раз и еще нет "резиновых ручек на граблях".
Вот казалось бы - 2Д игра, нужен текст.
На Canvas есть UI Text - добавляется понятным "добавить".
А вот на саму игру? Нет текста в 2Д элементах....
Нужно или догадываться или гуглить, что в 2Д нужно добавить 3Д текст, но так что он был к камере ровно без углов.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ALexusB
сообщение Dec 3 2022, 19:22
Сообщение #3


Разработчик ВМЛ-КВЛ
*******

Seaward TeamЖелезный Профессор
Группа: Admin
Сообщений: 15,804
Регистрация: 2-November 04
Пользователь №: 3



Как из квадратика вырезать круг или иную фигуру.

Задача обычная, есть портреты кораблей/НПС они квадрат, но на HUD нужно вывести их кружками.

Делается через Маску (добавить компонент).
А далее тонкости
- сама фигура для маски должна быть картинкой отдельно, нет готового кружка или квадратика, то есть рисуем в редакторе нужного размера и переносим в ресурсы.
Исходная картинга должна быть подчинена спрайту с маской (а не наоборот, как бы логичнее было).

Рамку из-за этого нужно делать отдельно от этого "бутерброда", т.к. если рамку маске подчинить, ее порежет тоже.
Тогда нужно еще это все обернуть в групповой пустой объект, чтоб хоть таскать эту кучу по общим координатам.

Но далее наступают другие грабли, что управлять размером этого всего в сборе можно только через Scale родителя-группы, а не высота и ширина, то есть по пикселям размер не задать точно, нужно методом тыка его находить масштаба на "мажик нум", какие-то 0.384 например.
Альфа канала или цвета у родителя нет.
Если нужно такую иконку сделать прозрачнее, то... тут есть решение - добавить на родителя КанвасГрупп и там будет прозрачность для всего.

А вот цвет задать всей пачке уже нельзя - нужно задавать по отдельности или крутить рекурсивный вызов по детям группового объекта.

Ну и на закуску - канвас групп есть только для UI объектов, добавить его на просто спрайт на экране (под канвасом) нельзя!

Ну и вы поняли всю боль - как сделать анимацию потопления кораблика, если это группа из кучи элементов. Нужен ее ресайз и смена цвета.

А еще на групповой объект нельзя добавить 2Д Бокс колайлер для отлова нажатий, т.к. он пустой

Нужно сперва добавить туда картинку спрайта, по ее размеру колайдер, потом картину сделать прозрачной, чтоб не мешала.
Ну или ловить клики на одном из подчиненных.

На этом фоне в Адоб Флаш - все было в разы проще и работало сразу без раскопок "...мать, мать... как это сделать!!"
Но.... когда привыкаешь в Юнити штаны через голову надевать - то как бы нормально, как так и надо.

Просто разные поколения делали продукты... Флаш условные BB/X поколение
А Юнити как бы Y/Z - и это прям заметно в философии подхода к архитектуре.

User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ALexusB
сообщение Dec 5 2022, 14:12
Сообщение #4


Разработчик ВМЛ-КВЛ
*******

Seaward TeamЖелезный Профессор
Группа: Admin
Сообщений: 15,804
Регистрация: 2-November 04
Пользователь №: 3



Еще одна фича

Есть Канвас, на нем кнопки, они пропускают клики далее на игровую сцену.
То есть если под кнопкой у меня корабль, то он стрельнет.

Обход - проверять клики, что они прошли не прямо, а через что-то и игнорировать.


private void OnMouseDown()
{

if (!EventSystem.current.IsPointerOverGameObject())
{
gameEngine.PlayAudio("click");
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ALexusB
сообщение Dec 6 2022, 19:32
Сообщение #5


Разработчик ВМЛ-КВЛ
*******

Seaward TeamЖелезный Профессор
Группа: Admin
Сообщений: 15,804
Регистрация: 2-November 04
Пользователь №: 3



Еще неочевидность с канвасом.
Если на него добавить что-то из перфаба в коде. То задать координаты нужно от якоря, а не обычные
И вообще добавить что-то на канвас - это нужно родителя канвас найти и сетПарент
// find canvas
GameObject canvas = GameObject.Find("Canvas");
// clone your prefab
GameObject text = Instantiate(entry, new Vector3(x, y, 0), Quaternion.identity);
// set canvas as parent to the text
text.transform.SetParent(canvas.transform, false);




text.GetComponent<RectTransform>().anchoredPosition = new Vector3(тут отступы от края);


User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ALexusB
сообщение Dec 15 2022, 17:03
Сообщение #6


Разработчик ВМЛ-КВЛ
*******

Seaward TeamЖелезный Профессор
Группа: Admin
Сообщений: 15,804
Регистрация: 2-November 04
Пользователь №: 3



Для записи сайва и загрузки параметров игры из ресурсов можно использовать JSON
В него можно сконвертировать таблицу Ехель через CSV
Но Юнити не умеет работать с массивами простых типов и многомерными массивами.

То есть, если есть задача записать матрицу int[,], то нужно делать одномерный массив из класса, на котором есть сеарилизация и всего одно поле типа int
И вот его уже можно записать.
Ну ли костыли и череp XML туда-сюда перегрузку. Но это не универсально в одну строку, а уже по месту под нужный тип данных.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ALexusB
сообщение Dec 18 2022, 18:43
Сообщение #7


Разработчик ВМЛ-КВЛ
*******

Seaward TeamЖелезный Профессор
Группа: Admin
Сообщений: 15,804
Регистрация: 2-November 04
Пользователь №: 3



Очередная тонкость.

Есть кнопка, у нее анимация нажатия Scale. То есть при нажатии она как бы плющится.
Все ок
Но теперь нужно на клик сделать выделение этой кнопки каким-то режимом.
Если делать размером - то не работает, т.к. анимация управления размером и перекрывает настройку в коде.

Вывод - отключить анимацию, если нужно задать размер или выбрать неконфликтующие опции на клик и выделение (цвет/размер/иконка).
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ALexusB
сообщение Dec 23 2022, 16:53
Сообщение #8


Разработчик ВМЛ-КВЛ
*******

Seaward TeamЖелезный Профессор
Группа: Admin
Сообщений: 15,804
Регистрация: 2-November 04
Пользователь №: 3



Прошёл квесты публикаций
- Яндекс.Игры (с учетом монетизации трех видов и тонкостей сохранения на сервер)
- RuStore
- Google с рекламой Яндекс.SDK

Если, как говорят психологи, "вы хотите об этом поговорить?"
То я могу smile.gif

Есть неочевидные места, все решается, но первый раз сложно.

User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ALexusB
сообщение Dec 25 2022, 18:51
Сообщение #9


Разработчик ВМЛ-КВЛ
*******

Seaward TeamЖелезный Профессор
Группа: Admin
Сообщений: 15,804
Регистрация: 2-November 04
Пользователь №: 3



Опытным путем узнал, что для WebGL не работает сейв в файл по пути как для Андройд или Виндовс

savePath = Application.persistentDataPath + "/saveload.xml";
Debug.LogFormat("LoadGameTurns from {0}", savePath);
if (File.Exists(savePath)) - файла всегда нет, записать File.WriteAllText(savePath, его не создает

=== + 5 коп.
А при этом вилы - размер PlayerPrefs.SetString лимитирован. и формула там 20 + (n/2)*4 байт на символ строки, где-то видел инфу, что на всю игру весь PlayerPrefs не должен превышать 1Мб.

То есть условные х2 на строку еще.
У меня сайв на 25 ходов в ХМЛ + JSON в полях тегов весит 75Кб - это 150Кб размера.

Для локальной игры (на ПК и Андройд) есть файловая система - и нет лимита на размер там (ну сам диск устройства). А вот для веба... лимит есть.
Можно передавать на сервер и хранить там
Но сам факт получения и передачи он асинхронный.
То есть после метода Load() ничего в переменных еще нет и нужно подвесить игру и ждать или как-то ловить прерывания.
И чем больше размер передаваемого, тем это все дольше и проблемнее из-за обрыва связи.

Я пока сам сайв игры храню локально, а вот глобальные переменные прогресса игрока (монетки, покупки и тп) - на сервере Яндекса (это требование для публикации там).
Саму сессию игры можно и новую начать, а вот прогресс он сквозной по всем устройствам, можно играть на разных ПК, телефоне и будет единый счет в игре.

Сообщение отредактировал ALexusB - Dec 27 2022, 09:47
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ALexusB
сообщение Dec 28 2022, 10:06
Сообщение #10


Разработчик ВМЛ-КВЛ
*******

Seaward TeamЖелезный Профессор
Группа: Admin
Сообщений: 15,804
Регистрация: 2-November 04
Пользователь №: 3



Делаю игры по урокам Яндекс.Игры
Про покупки и монетизацию
https://www.youtube.com/watch?v=A2TlLC1HFS0

И вот с ними проблемы... третья итерация модерации пошла. А дело в том, что это видео и даже документация на сайте противоречит правилам и модерацию НЕ пройдет! smile.gif Вот так вот - сапожник без сапог.
В поддержку писал с просьбой документацию поправить, но ответ их... сча цитата "разработчик должен самостоятельно встроить функцию так, чтобы вызов авторизации соответствовал требованиям."
То есть код из уроков и с сайта копипастить нельзя! Пишите свой! А какой? Это же SDK как бы, кто его должен знать?
if (_player.getMode() === 'lite') {
// Игрок не авторизован.
ysdk.auth.openAuthDialog().then(() => { - вот этого быть не должно!
Теперь конкретика. Есть правила https://games-requirements.yandex.ru/
1.13.3 Прогресс игры или работы с WebApp сохраняется на сервере и доступен для одного пользователя с разных устройств.
Ок. Делаем сохранения на сервере, но им то как раз нужна авторизация, как в уроке, то есть с запросом авторизации, иначе как это сохранить еще?
Получаем отказ. Теперь, п 1.2
1.2.1 Авторизация производится только при запросе пользователя (нажатие на кнопку авторизации), желании пользователя выполнить действие, для которого авторизация необходима (покупка), или после окончания внутриигрового обучения.
1.2.2 Реализован гостевой вход или возможность использования без авторизации. Внутренний прогресс при этом должен сохраняться.
И тут уже взрывается мозг. Как это сделать одновременно?
Допустим, выкашиваем все вопросы SDK - там еще нужно параметр false передать в первое обращение, т.к. табличку Принять/Отклонить доступ к ФИО и аватару тоже нужно гасить.
Но при этом переменная player будет пустой и выдавать ошибку на сохранении и загрузке, это отсекаем if (player).
А вот пункт 1.2.2 - это как?
Я сделал оба типа сохранений и в PlayerPrefs и через SDK - если загрузка не пройдет, то будет локально, как просят. Но тут далее вилы.
Если пользователь авторизируется первый раз, то его прогресс локальный станет серверным и далее будет уже он. Но если он где-то войдет не авторизировано в др месте, то будет новый процесс и вот если он там авторизируется не сразу, то его процесс тут же затрется на тот, что был на сервере. Это нормально? Игровые покупки при этом авторизации НЕ требуют! Там можно указать левый емей и оплатить карточкой и запроса на войти в свой аккаунт нет! Такие покупки будут только в PlayerPrefs и ясно не сквозными по устройствам и потеряются, если игрок войдет под собой. Что-то тут фигня какая-то в SDK и правилах.
Собственно - я это уже заслал на третий виток модерации (шла 3я неделя публикации готовой игры... которую я сделал быстрее, чем опубликовать ее).
Так же наблюдение - что игры с покупками требуют акта, о чем написано в документации, но вот самого акта там нет, его пришлют ссылкой после недели модерации №1 и потом +1 неделя на одобрение покупок уже с актом.
То есть игры с покупками - это 2-3 недели на публикацию, а без можно с 1 раза проскочить.
Попутно прохожу квест с публикацией в HUAWEI и Xiaomi App Store - там реакция в течении дня, а не недели. Там хоть 3 недели ждать не нужно.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
InkyFreeman
сообщение Jan 26 2023, 20:38
Сообщение #11


Символ Пиратизма
*******

Ветеран Форума
Группа: форумчанин
Сообщений: 1,248
Регистрация: 27-September 05
Из: сам не знаю!
Пользователь №: 1,270



На ДтФ сегодня появилась статья о том как можно сгенерировать карту! Вот ссылка Сайт DTF
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ALexusB
сообщение Jan 27 2023, 10:52
Сообщение #12


Разработчик ВМЛ-КВЛ
*******

Seaward TeamЖелезный Профессор
Группа: Admin
Сообщений: 15,804
Регистрация: 2-November 04
Пользователь №: 3



Спасибо. Это интересная статья - как процедурно генерить карту уровней (лабиринты для ранера или типа ХСОМ). Может для какой-то новой игры применю.

Для пиратиков карта будет хэнд-мэйд по клеткам, чтоб баланс был ручной. Пока же задача ее красиво нарисовать по схеме из клеток (в целом сама схема-карта уже готова, в теме игры ее привел).
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ALexusB
сообщение Jan 31 2023, 16:14
Сообщение #13


Разработчик ВМЛ-КВЛ
*******

Seaward TeamЖелезный Профессор
Группа: Admin
Сообщений: 15,804
Регистрация: 2-November 04
Пользователь №: 3



Стать разработчиком СТИМ это тот еще квест.
И он осложняется запретом покупки игры из РФ.
А для регистрации нужно купить слот публикации игры на свой аккаунт
И если игру купить можно с кошелька СТИМ, а его можно пополнить в тенге через киви, но оплатить с него нельзя.. нужно карта не в РФ и привязка аккаунта в др стране.
Причем получать денежки за игру в РФ как раз можно, но только на банки вне санкций (по сути один такой, красавчик).

Если кто знает (или имеет уже), как карту вирутальную отрыть в др стране - пишите в ЛС.
Пока копаю тему и есть готовые решения даже с физической картой Казахстана, но там оно не бесплатно, понятно. Мне же на 1 раз нужно.

== эмоциональный и политический ответ про почему эти санкции и от этого проблемы я прочел и потер, тут это офтопик
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
InkyFreeman
сообщение Feb 2 2023, 07:54
Сообщение #14


Символ Пиратизма
*******

Ветеран Форума
Группа: форумчанин
Сообщений: 1,248
Регистрация: 27-September 05
Из: сам не знаю!
Пользователь №: 1,270



Уникальная статья , читать и запоминать Сайт
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Leviafan
сообщение Feb 2 2023, 08:00
Сообщение #15


боцман
****


Группа: форумчанин
Сообщений: 260
Регистрация: 16-June 07
Из: Красноярск
Пользователь №: 10,715



Цитата(ALexusB @ Jan 31 2023, 20:14) *

Если кто знает (или имеет уже), как карту вирутальную отрыть в др стране - пишите в ЛС.
Пока копаю тему и есть готовые решения даже с физической картой Казахстана, но там оно не бесплатно, понятно. Мне же на 1 раз нужно.



1) https://pst.net/

2) Приложение Bitfree

Выпускают виртуальные карты с пополнением через криптовалюту

PST проходит везде, где пробовал; Bitfree удобнее как сервис, но не везде его карта принимается
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
InkyFreeman
сообщение Feb 2 2023, 16:58
Сообщение #16


Символ Пиратизма
*******

Ветеран Форума
Группа: форумчанин
Сообщений: 1,248
Регистрация: 27-September 05
Из: сам не знаю!
Пользователь №: 1,270



Цитата(Leviafan @ Feb 2 2023, 09:00) *

1) https://pst.net/

2) Приложение BitfreeСайт ДТФ

Выпускают виртуальные карты с пополнением через криптовалюту

PST проходит везде, где пробовал; Bitfree удобнее как сервис, но не везде его карта принимается
unsure.gif
Есть ещё статья как люди карты создаютСайт
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 28th March 2023 - 20:38

Блок рекламы
Яндекс цитирования Rambler's Top100
Rambler's Top100