phylife.ru

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

Просмотров: 514Комментарии: 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