#блог

об играх, разработке и личном опыте

Избранное Все заметки GitHub icon Мой Github Обо мне

Unity на Linux

Оно работает!

Всмысле не оболочка Unity, а редактор Unity :)
На выходных решил проверить, как там Ubuntu и всё «вот это вот с ней»... Оказалось, что всё хорошо-то. Всё работает, обновляется, есть куча разного софта, Unity в конце концов.

Последний раз я ставил какой-то Linux года 3-4 назад, но как-то не пошло. Даже не знаю почему. Потом пересел на MacOS и забыл про Linux и Windows. И вот — Ubuntu 16.04 LTS. Полёт нормальный. Оборудование на ноутбуке определилось, тачпад, камера, звук и т. д. Конечно, я сразу загуглил «ubuntu после установки» и проделал несколько настроек, но в целом — всё норм. Почему Ubuntu? Я не разбираюсь в 100500 дистрибутивах, да и не охота как-то, поэтому выбрал, тот что на слуху.

Так вот, по поводу Unity. Оказывается сборки под линукс делаются регулярно. И последняя версия которую я скачал и установил Unity-2017.3.0p2, вполне себе работает. Правда, я пока ничего не пробовал на ней сбилдить, но обязательно проверю :) Версия под линукс всё ещё в бете, поэтому возможны косяки. Но я к этому готов.

VSCode тоже есть под линукс и отлично работает. Думал ещё SourceTree поставить, но разработчики не планируют её выпускать для линукса. Жаль конечно, но на форуме где обсуждалось (и осуждалось) это решение, я нашёл пост про GitKraken. И, он очень даже хорош! Также есть аналог маковского homebrew — linuxbrew.

В общем, линукс — это не страшно и не больно :_) На нём даже игры делать можно...

21 января   linux   unity   инструменты   мысли

Как добавить фреймворк в секцию Embedded в XCode

Этой возможности не было до Unity 2017. Надо было вручную или сторонними средствами после билда проекта добавлять нужные фреймворки. ORLY?
Теперь же, с помощью AddCopyFilesBuildPhase это сделать можно. Последний параметр говорит об этом:

The «subfolder spec». The following usages are known: «10» for embedding frameworks; «13» for embedding app extension content; «16» for embedding watch content.

Готовый пример

А ещё можно подключить UnityEditor.iOS.Xcode.Extensions и использовать AddFileToEmbedFrameworks.

Но, они до сих пор так и сделали возможность добавлять нужные локализации в XCode проект... :(

19 января   ios   iphone   unity

Библия free2play

Почитал библию free2play. Определенно есть полезная информация. Для тех кто только начинает делать игры — must read, потому что там не только про f2p. Например:

  • с чего начать
  • основное правило: LTV должен быть больше CPI
  • «дефолтные» показатели ретеншн и монетизации
  • игровой цикл: action → reward → investment → trigger
  • игровые сессии и их продолжительность
  • экономика игры

Главы небольшие, читается легко + в каждой главе есть ссылки на другие интересные и полезные статьи, книги и видео на Youtube.

17 января   аналитика   мысли   ссылки

PopClip для Mac OS

Эта небольшая утилита для Mac OS добавляет к выделенному тексту контекстное меню, как на iPhone. Есть огромное количество расширений — уже больше 100. Например:

  • копирование/вставка/изменение регистра/форматирование текста
  • конвертация из Markdown в HTML
  • поиск в различных поисковых системах
  • перевод текста в разных переводчиках
  • сохранение текста в различные сервисы, приложения и todo-списки (Trello, OneNote, OmniFocus, Wunderlist, etc)
  • сокращалка url
  • взаимодействие с приложения (отправка почты, поиска на картах, поиск музыки, звонок в Skype)
  • поиск в Google картинках, IMDb, Amazon, и ещё куча других
  • и многое другое
    Кроме того, если есть желание — можно сделать своё расширение!
    Приложение платное ($9.99), но оно того стоит.

Также оно прекрасно работает в редакторах кода и IDE — оборачивание в скобки, кавычки, запуск команд в терминале. Я использую именно так :)

http://pilotmoon.com/popclip/

Unity & ECS

Тут Leopotam новый ECS для Unity запилил

Предлагаю тестить и пробовать что-нибудь сделать https://github.com/Leopotam/ecs
Обсуждение на Reddit
Чатик на gitter.im

Что такое ECS и зачем он нужен?

Подробно на примере другого фреймворка https://habrahabr.ru/post/197920/

Unity тоже делают свой ECS

Когда-нибудь в 2018 доделают :) Там же и про штатный DI https://www.youtube.com/watch?v=tGmnZdY5Y-E

27 декабря   ecs   unity   разработка   с#
26 декабря   видео   игры   ссылки   уроки

Unity 2017.3

Вышла новая версия Unity 2017.3. Последний релиз в этом году. Кроме привычных улучшений графики и производительности (ага), есть пара интересных вещей:

  • Панорамные видео 360/180
  • Улучшение системы частиц
  • Пользовательские сборки
    Теперь можно определять свои сборки, чтобы они каждый раз не компилировались, экономя время. Актуально для больших проектов.
  • Поддержка Mono .NET 2.0 в Managed Memory Profiler
  • Обновление библиотеки сжатия Crunch
    Теперь в 2,5 раза быстрее DXT и есть ETC_RGB4 и ETC2_RGBA8
  • Улучшение графики
  • Улучшение света
  • Поддержка Xbox One X
  • Поддержка Xiaomi Store
    На Хабре уже мануал написали как подготовиться к публикации в Xiaomi Store.

Подробнее в блоге Unity (анг.): https://blogs.unity3d.com/ru/2017/12/19/unity-2017-3-is-here/

20 декабря   unity   ссылки

Движки онлайн игр на Node.js

Когда читаешь форумы и паблики по Unity, часто встречаются вопросы/ответы: как сделать онлайн игру, как сделать мультиплеер, что лучше unet, photon, etc. И часто люди советуют друг другу, как раз решение от самой Unity — UNet или другой вариант — Photon.

Что с одной стороны понять можно — есть документация, примеры, готовый мультиплеер и матчмейкинг, не нужен свой сервер и т. д. Только за это надо платить, когда сервер не твой, то нет полного контроля и гибкости + на тарифе Unity Pro — лимит всего 200 игроков онлайн! У Photon тоже есть ограничения и тоже платная подписная модель. Поэтому если есть вероятность, что игра выстрелит (все же на это надеются :), стоит задуматься о собственном сервере.

Много плюсов в сторону своего сервера и движка. Минимум — это дешевле и есть полный контроль. Из минусов — всё надо настраивать и писать самому. Ну почти всё... Для одинокого разработчика, это может стать проблемой, тем более если нет опыта серверной разработки.

Вариант №1

Можно заморочиться, написать клиент и сервер на Unity с использованием UNet и запустить его на своём сервере в режиме Headless Mode. Не пробовал, не знаю.

Вариант №2

Написать свой онлайн движок. Или использовать чей-то.
Тут есть место где развернуться, есть много серверных языков и фреймворков. Есть и готовые движки для онлайн игр и ничто не мешает их использовать вместе с Unity. Я рассматривал только Node.js, потому что имел с ним дело и могу разобраться, но уверен, есть и другие, на других языках.

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

Pomelo

В Google он найдется одним из первых. Написан китайцами, давно не поддерживается и заброшен. Достаточно наворочен и имеет хорошую подробную документацию и примеры, можно расширять плагинами, вообще стоит посмотреть на его архитектуру. Есть готовый клиент для Unity и других платформ.

Colyseus

Этот движок обновляется, последний апдейт был пару недель назад. Позиционируется как движок для HTML5 игр. Работает через вебсокеты, данные сжимаются msgpack, есть встроенный матчмейкинг и компенсация лагов. Хорошая документация и примеры. Есть официальные клиенты на JS, Unity и CoronaSDK.

Lance

Уже полгода не обновлялся. Также работает на вебсокетах, есть сжатие, компенсация лагов, предсказание и т. д. Пишут, что подходит для любых игр и жанров. Есть документация и пару примеров на JS.

Для начинающих можно ещё посмотреть эти два репозитория:
https://github.com/bonsaiden/maple.js
https://github.com/huytd/node-js-game-server

Если ещё погуглить, можно найти много примеров на Socket.IO, но мне он почему-то не понравился. Хотя сделать на нём простое онлайн взаимодействие вполне легко.

7 декабря   nodejs   игры   мысли   разработка

Unity EventManager 2.0

Меня спрашивали про простой менеджер событий Unity, как передавать разные параметры и количество, а то строки неудобно. В общем-то, это был пример, но если кому-то оказалось нужно — то вот немного улучшенная версия:

using UnityEngine;
using UnityEngine.Events;
using System.Collections.Generic;
using System;

public class EventManager : MonoBehaviour {

    [Serializable]
    public class GameEvent : UnityEvent<object[]> { };

    private static EventManager _instance;
    private Dictionary<string, GameEvent> _eventDictionary;

    void Awake () {
        if (_instance != null)
            return;
        _instance = GetComponent<EventManager> ();
        if (_eventDictionary == null)
            _eventDictionary = new Dictionary<string, GameEvent> ();
    }

    /// <summary>Добавляем "слушателя" для события</summary>
    /// <param name="eventName">Название события</param>
    /// <param name="listener">Метод-обработчик события</param>
    public static void Subscribe (string eventName, UnityAction<object[]> listener) {
        GameEvent thisEvent;
        if (_instance._eventDictionary.TryGetValue (eventName, out thisEvent))
            thisEvent.AddListener (listener);
        else {
            thisEvent = new GameEvent ();
            thisEvent.AddListener (listener);
            _instance._eventDictionary.Add (eventName, thisEvent);
        }
    }

    /// <summary>Удаляем "слушателя" из списка</summary>
    /// <param name="eventName">Название события</param>
    /// <param name="listener">Метод-обработчик события</param>
    public static void Unsubscribe (string eventName, UnityAction<object[]> listener) {
        if (_instance == null)
            return;
        GameEvent thisEvent;
        if (_instance._eventDictionary.TryGetValue (eventName, out thisEvent))
            thisEvent.RemoveListener (listener);
    }

    /// <summary>Отправить событие</summary>
    /// <param name="eventName">Название события</param>
    /// <param name="parameters">Параметр массив</param>
    public static void SendEvent (string eventName, params object[] parameters) {
        GameEvent thisEvent;
        if (_instance._eventDictionary.TryGetValue (eventName, out thisEvent)) {
            thisEvent.Invoke (parameters);
        }
    }
}

Теперь количество параметров динамическое и любого типа. Для простого взаимодействия, вполне работоспособно. Пример использования:

void OnEnable () {
	EventManager.Subscribe ("event_name", MyFunction);
}

void OnDisable () {
	EventManager.Unsubscribe ("event_name", MyFunction);
}

void MyFunction (object[] parameters) {
	Debug.Log (parameters.Length); // количество параметров -> 3 в примере
	Debug.Log (parameters[1]);        // выведет -> 1 
}

...

EventManager.SendEvent ("event_name", "param_string", 1, 2); // вызов события
1 декабря   unity   разработка   с#

Турбо-страницы для Эгеи

Яндекс недавно запустил турбо-страницы, но с Эгеей они не дружат, потому что RSS лента формируется без нужных ключей и соответственно не проходит валидацию.

Чтобы это исправить, нужно отредактировать шаблон RSS, он находится по такому пути:

your_site_root/system/default/rss/rss.tmpl.php

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

<?= '<?xml version="1.0" encoding="utf-8"?>' ?> 
<rss version="2.0">

<channel>

<title><?= htmlspecialchars ($content['title'], ENT_NOQUOTES, HSC_ENC); ?></title>
<link><?= $content['home_page_url'] ?></link>
<description></description>
<generator><?= $content['_e2_ua_string'] ?></generator>
<language>ru</language>
<yandex:analytics id="<YOUR_METRIKA_ID>" type="Yandex"></yandex:analytics>

<?php foreach ($content['items'] as $item) { ?>
<item turbo="true">
<title><?= htmlspecialchars ($item['title'], ENT_NOQUOTES, HSC_ENC); ?></title>
<guid isPermaLink="<?= $item['_rss_guid_is_permalink'] ?>"><?= $item['_rss_guid'] ?></guid>
<link><?= $item['url'] ?></link>
<comments><?= $item['url'] ?></comments>
<description><?= htmlspecialchars ($item['content_html'], ENT_NOQUOTES, HSC_ENC) ?></description>
<pubDate><?= $item['_date_published_rfc2822'] ?></pubDate>
<turbo:content><?= htmlspecialchars ($item['content_html'], ENT_NOQUOTES, HSC_ENC) ?></turbo:content>
<author><?= @$content['blog']['author'] ?></author>
</item>

<?php } ?>

</channel>
</rss>

Я ещё добавил Яндекс.Метрику, но это необязательный параметр, также как язык и автор.
После этого, заходим в Яндекс.Вебмастер и активируем турбо-страницы. Всё должно работать.

23 ноября   блог
Ранее Ctrl + ↓