phylife.ru

Первый проект. Быки и коровы.

Просмотров: 412Комментарии: 0
Работа и бизнесПрограммированиеНаши игры

Это - моя первый проект на Unity.

Простая 2D-игра. "Быки и коровы". Создана по мотивам известной студенческой игры: два чувака садятся друг напротив друга, загадывают четырёхзначное число (все цифры разные). Задача - угадать число у противника. На первый взгляд кажется сложно, но в 6 ходов можно уложиться. Мозг тренируется - будь здоров как.

Как автору - она мне не особо нравится. Тут - косяк, там - косяк... (думаю, это нормально: каждый автор знает, где он накосячил по-полной.) При этом я потратил на неё почти целый месяц. Сам-то алгоритм был написан за вечер (консольную такую игру мы сделали с одним моим родственником на Java за 2 часа!), а всё остальное время ушло на подгонку, на понимание механизмов Unity, на игру с панелями, на отрисовку (казалось бы, что там рисовать! А вот не работал я до этого с редакторами вроде Фотошоп и GIMP! На это у меня тоже ушел где-то месяц. По паре часов в день) Звуки - частично взял бесплатный ассет, частично - покопался в стандартных звуках винды.

С какими проблемами столкнулся:

1. Как передать данные между сценами?

Делается дополнительный класс, вешаем его на какой-нибудь Empty Object на нулевой сцене (обычно это меню). НО! Если этим и ограничиться, при каждой загрузке этой нулевой сцены (игрок закончил играть, вышел в меню) - получим дубль объекта. Сколько раз игрок будет заходить в нулевую сцену - столько раз и получим дубль.

Задачу решает паттерн проектирования Синглтон: если такой объект уже создавался, новый уничтожим. Т.е. вот примерный код этого класса:

using UnityEngine;
using System.Collections;
public class Settings : MonoBehaviour
{
public static Settings instance;
public static bool sound;
public static bool hint;
// Use this for initialization
void Start()
{
sound = true;
hint = true;
}
void Awake()
{
if (!instance)
{
instance = this;
DontDestroyOnLoad(transform.gameObject);
}
else
{
Destroy(gameObject);
}
}
}

2. Анимация в меню: как загрузить следующую панель, чтобы всё отработало правильно: и анимация закрытия текущей панели, и анимация открытия следующей?

Сделал через код. Для каждого окна есть свой скрипт, и там есть флаг, который выставляем перед вызовом следующей панели в true. Для сцены есть глобальный скрипт, и в методе Update мы проверяем все панели: какая из них закрывается? При этом событии запускаем корутину, делаем задержку в 0.7 секунды, и только тогда активизируем следующую панель.

3. Как получить у объекта компонент Animator.

Целая эпопея с этим аниматором. Пришлось делать скрипт для объекта, заносить в него поле типа Animator, а потом из этого скрипта получать.

4. Как у UI Toggle поменять картинки?

Банально. В бэкграунде и чекмарке есть картинки. Рисуем в фотошопе новые и вставляем на их место новые.

5. Как получить неактивную панель (объект)?

Они есть в дереве, но достучаться к ним тяжело. Вот такая конструкция помогает:

GameObject.Find("Canvas").transform.Find("Наш объект").transform.gameObject;

6. Вместо массива часто ГОРАЗДО удобнее использовать коллекции. Это ОЧЕНЬ удобный механизм. И нагляднее, и геморроя меньше с индексами.

7. При разработке всё было просто отлично, но при билде пропали все русские буквы. Запятые там остались... двоеточия... А национальные символы исчезли. Оказалось, что стандартный шрифт Юнити в билд не подтягивает. Пришлось положить в Ассеты шрифт (взял из системной папки со шрифтами) и все текстовые элемены на Сцене перебить на этот шрифт.

8. Все .PSD-файлы (графика Фотошопа) сделал PNG-шными (я бы их в JPG конфертнул, но он не поддерживает прозрачность). Этим сэкономил мегабайта четыре в итоговом билде. Т.е. сделал загрузку в 2 раза легче.

9. Первым делом я решил выложить игру на свой сайт (вообще, её надо где-то хранить, чтобы на странице выложить ссылку). На тестовых пусках всё работало хорошо, но после заливки на сайт игра начала валиться с ошибкой

An error occured running the Unity content on this page. See your browser's JavaScript console for more info. The error was:
uncaught exception: incorrect header check

Тут дело в следующем: когда мы билдим Unity-проект под WebGL (Unity Player деприкейтед), она нам делает несколько архивов (с расширениями .datagz, .jsgz, .memgz). Но сервер сайта с ними работать не умеет. Нужно подкорректировать .htaccess-файл. Добавить туда:

AddType application/octet-stream .data
AddType application/octet-stream .mem
AddType application/octet-stream .unity3d
AddType application/octet-stream .datagz
AddType application/octet-stream .memgz
AddType application/octet-stream .jsgz
AddType application/octet-stream .unity3dgz

Так сделали мне. Сами разработчики Юнити советуют добавить файл web.config в папку с игрой (у меня такое не сработало):

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <staticContent>
           <mimeMap fileExtension=".mem" mimeType="application/octet-stream" />
            <mimeMap fileExtension=".data" mimeType="application/octet-stream" />
            <mimeMap fileExtension=".unity3d" mimeType="application/octet-stream" />
            <mimeMap fileExtension=".memgz" mimeType="application/octet-stream" />
            <mimeMap fileExtension=".datagz" mimeType="application/octet-stream" />
            <mimeMap fileExtension=".unity3dgz" mimeType="application/octet-stream" />
            <mimeMap fileExtension=".jsgz" mimeType="application/octet-stream" />
        </staticContent>
    </system.webServer>
</configuration>

Самое прикольное, что на момент вот этого "совета" в мануалах разработчики ничего об таких проблемах не писали. Хотя и знали. А народ мучился.

С другой стороны, Юнька всё равно бесплатная (на халяву и хлорка - творожок), да и всё равно мало кто на ней из инди-разработчиков делает игры под Веб (только если в учебных целях. А так - все под Андроид клепают).

10. Если бы у меня не было этого сайта, пришлось бы искать другое место. Раньше народ использовал для таких целей Google Drive, но там прикрыли эту лавочку недавно. Есть ещё сайты вроде itch.io, и я обязательно попробую его с одним из следующих проектов. Ну и github некоторые советуют.

Сам проект я просто положил на сайт. Создал папку и залил в неё. Так же пришлось малость подкорректировать index.html и style.css, которые Unity сбилдила автоматически, под эту CMS-ку (прописал пути), и пришлось в TemplateData/UnityProgress.js прописать пути на картинки с лого, прогрессбаром и фуллбаром.

В общем, всё решается.

Только времени придётся больше провести на Unity-форумах.

Unity WebGL Player | Bulls and Cows

Unity WebGL Player | Bulls and Cows

Fullscreen
Bulls and Cows
Оставьте комментарий!

grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question