Отчет за июнь и июль 2014г

Всем привет!

Каждый месяц я подвожу итоги о проделанной работе, но позапрошлый месяц я оставил без внимания, поэтому текущий отчет будет сдвоенным. Последние полтора месяца я был в разъездах, полторы недели июня в Москве и весь июль в Италии. Вот вернулся в Красноярск и собрался мыслями, чтобы написать в блог.

Не смотря на то, что я искал возможности работать везде, где только можно.

Минутки труда

Настрой на путешествия и не рабочая атмосфера сделали свое дело.

Однако, попробую поскрести по сусекам и найти результаты моей деятельности:

Continue reading “Отчет за июнь и июль 2014г”

Обертка для Invoke

API Unity часто подталкивает программистов к плохой практике хардкода имен функций. Один из таких скользких путей это использование функции Invoke у класса MonoBehaviour (Invoke, CancelInvoke, IsInvoking, InvokeRepeating).

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

public void Start()
{
    Invoke("ShowPanel", 2f);
}

private void ShowPanel()
{
    //show panel there
}

Continue reading “Обертка для Invoke”

Wrapper for Invoke

API Unity often pushes programmers to poor practice of hardcore function names. One of such slippery ways is the usage of Invoke function for MonoBehaviour class: Invoke, CancelInvokeIsInvokingInvokeRepeating.

Invoke function and co. are useful when we need to call another function from the initial one with a delay of a few seconds. For instance, after start of the level, to show the panel with bonuses, not immediately, but in two seconds:

public void Start()
{
    Invoke("ShowPanel", 2f);
}

private void ShowPanel()
{
    //show panel there
}

Or if it’s necessary to create a game object (bullet from a gun, a monster, running from behind the corner, etc.) regularly with a certain periodicity. For example, one second after the start of the level for the first time and every three seconds each following time:

public void Start()
{
    InvokeRepeating("SpawnMonster", 1f, 3f);
}

private void SpawnMonster()
{
    //Spawn monster there
}

And it’s convenient, but the hardcore functions names lead to problems, forcing to keep in mind unnecessary information and complicating support and refactoring of the code.

Let’s try to solve the issue taking advantages of the C# language and write the wrappers for Invoke functions and co.:

For a start we have to write a method which gets the name of the function out of the lambda expression, calling this function:

private string GetMethodName(Expression<Action> expr)
{
    return ((MethodCallExpression)expr.Body).Method.Name;
}

After that, write a wrapper for Invoke function, which takes on entry not the function name, but lambda, which calls the function, gets the name out of lambda and calls built-in Unity Invoke function:

protected void Invoke(Expression<Action> expr, float time)
{
    Invoke(GetMethodName(expr), time);
}

By analogy we wrap all other functions, we place the wrappers into the basic class and use. The foregoing examples will now look as follows:

public void Start()
{
    Invoke(() => ShowPanel(), 2f);
}

private void ShowPanel()
{
    //show panel there
}

and

public void Start()
{
    InvokeRepeating(() => SpawnMonster(), 1f, 3f);
}

private void SpawnMonster()
{
    //Spawn monster there
}

Now, any renaming of the function during refactoring will result in a compilation error, or all function calls will be automatically renamed by refactoring tools, if any are used.

You can find wrappings for Invoke here: UtilsExtensions.cs

Thank you for attention!

Отчет за май 2014г

Всем привет!

Каждый месяц я подвожу итоги и пишу небольшой отчет о проделанной работе. Настало время отчитаться за май.

Чем занимался:

1. Freelance.

Одна из игр, которой я занимался последние два месяца была доделана и опубликована на Google Play – Fat Piggy. Это клон Flappy Bird, но с множеством дополнительного функционала. На этой игре у меня сформировалась некая базовая архитектура небольших 2D игр на Unity, появились новые наработки и улучшились старые. Делать игру было приятно и интересно, да и заказчик хороший.

 

(Fat Piggy – геймплей)

Сейчас же занимаюсь несколькими новыми проектами (расскажу по мере завершения) и по чуть-чуть поддерживаю старые.

Continue reading “Отчет за май 2014г”

Отчет за апрель 2014г

Всем привет!

Настало время подвести итоги апреля и в первую очередь самому понять, что произошло за прошедший месяц и чего мне удалось сделать.

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

А теперь по теме. Что я сделал за прошедший месяц:

Continue reading “Отчет за апрель 2014г”

Отчет за март 2014г

Добро пожаловать в мартовский отчет! Тут вы услышите тысячу оправдании почему я не сделал, то что задумывал, и тысячу обещаний о том, что будет сделано в апреле!

Месяц март у меня прошел в напряженной работе. Так как мне поступало все больше задач для выполнения которых нужен был Mac, я решил вложиться и купил себе самую дешевую конфигурацию, которую смог найти в городе. При этом, поставил цель все затраты на него отработать в этом же месяце, чтобы в следующий вступить без долгов. В результате, в марте я очень много фрилансил.

У меня всегда была проблема расфокусировки, я постоянно берусь за новые интересные проекты и другие дела, пытаюсь многое делать параллельно, и хоть в каждом деле по не многу двигаюсь вперед, конечного результата мало. Весь месяц пытался избавляться от лишних дел, бросил курсы по clojure, не начинал разрабатывать другие игры и плагины, решил не писать статьи в блог “по графику”, а только по желанию и настроению (за исключением месячных отчетов).

Что же я сделал за месяц:

Continue reading “Отчет за март 2014г”

Отчет за февраль 2014г.

Каждый месяц я пишу отчет о своих достижениях, пассивном доходе и работе, проделанной для его увеличения. И вот настало время отчитаться за февраль.

Очень не хотелось писать этот отчет, даже было желание забить на все это, но решил не сдаваться. В отличие от позитивного января, февраль оказался не очень успешным месяцем, один неудачный фриланс проект, выход из проекта “Вишневое Казино”, отказ в публикации нового плагина в Unity Assets Store и много распылений по мелочам.

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

Что я сделал в течение месяца.

1. Фрилансил над четырьмя небольшими проектами. Один доделал (выйдет в апреле). Другой Proof of Concept с использованием облачного сервиса parse.com. Третий приостановился, ждем графики от китайцев. Четвертый потихоньку пилиться. В постоянном поиске новых проектов.

2. Работал над Crazy Bike.
Добавлял новую механику, дизайнил уровни, встраивал звуковые эффекты и аналитику, а так же новую графику от художника.
Первая версия игры из 15 уровней почти закончена.

Continue reading “Отчет за февраль 2014г.”

Настройка SortingLayer для любого объекта в Unity 2D.

Обновление: 31 декабря, 2018 года

Содержание статьи устарело. У Unity, с момента написания статьи, вышло огромное количество обновлений. И теперь можно настраивать SortingLayer во многих местах, включая системы частиц, например.


В Unity3D версии 4.3 появился долгожданный 2D фреймворк, принесший с собой механизм работы со спрайтами, за отображение которых отвечает “Sprite Renderer”. Как работать со спрайтами есть множество туториалов и видео в сети, я же хочу остановиться на двух важных настройках, которые есть в “Sprite Renderer”, и проблеме использования 3D объектов Unity в 2D играх.

Важные настройки это: “Sorting Layer” и “Order in Layer”:

Зачем нужны эти два параметра? Если кратко, в 2D фреймворке не используется z-координата, она никак не влияет на порядок отображения объектов в сцене. За порядок отображения отвечает другой механизм – механизм слоев. Можно управлять порядком отображения спрайтов в сцене путем назначения спрайту определенного слоя (“Sorting Layer”), а так же, при необходимости, порядок отображения внутри конкретного слоя можно настраивать с помощью параметра “Order in Layer”.

Continue reading “Настройка SortingLayer для любого объекта в Unity 2D.”

SortingLayer settings for any object in Unity 2D.

This article is obsolete now. Unity got many new features and it is possible to set SortingLayer now from many places.


In Unity3D 4.3 version there was a long-awaited 2D framework, which brought with itself the work mechanism with sprites, for display of which “Sprite Renderer” is responsible. There is a set of tutorial and video in a network how to work with sprites, I just want to stop on two important settings which are in “Sprite Renderer”, and on a use problem of 3D objects of Unity in 2D games.

Important settings are: “Sorting Layer” and “Order in Layer”:

Why these two parameters are necessary? In a nutshell in 2D framework z-coordinate isn’t used, it doesn’t effect on displaying order objects in a scene. For displaying order other mechanism is responsible – it’s mechanism of layers. It’s possible to operate displaying order of sprites in a scene by appointment of a certain layer (“Sorting Layer”) to sprite, and also, if necessary, displaying order internally of a concrete layer can be adjusted by means of “Order in Layer” parameter.

Displaying order of layers in a scene is adjusted in a window of editing layers:

But Unity3D comprises the mass of interesting functionality, which was made for 3D and which wants to be used in 2D. For example, particles system. Let’s say, in 2D scene you want to use effects from particles system and place one of effects on 2D scene. Here you receive a problem of incorrect displaying of effect (it can be expressed in different ways – partial displaying of effect, blinking, full invisibility and another). Manipulations with z-coordinate won’t lead to necessary result as at 2D displaying of scenes z-coordinate doesn’t effect on displaying order.

This problem is easily solved. “Sorting Layer” and “Order in Layer” properties were added not to class “SpriteRenderer”, but tо basic class “Renderer”, which other classes are inherited, and which are responsible for displaying, but as settings were taken out only for class “SpriteRenderer”, and in others aren’t available. Therefore, we need to write own component which will establish a layer and an order in layer for any renderer.

For myself I wrote such component which can be taken according to links: SortingLayerSettings (a component) and SortingLayerSettingsEditor (editor extension for parameters settings).

Added both scripts to the project, it is possible to add SortingLayerSettings component on any object and to adjust a displaying order of object in 2D scene. For example for “3D Text”:

And it is easy to operate displaying order:

Thus, we can easily use Unity3D objects in 2D scenes. Mechanism perfectly works! On personal experience I used system of particles and 3D text in several projects. I suppose with other types of objects there will be no problems.

Practically, SortingLayerSettings component doesn’t make sense after we specified the necessary layer for object. But at the time of application development there is a need in it, as it can be necessary in operating time of game to experiment with layers or to see, for which layer this or that object belong. But during game release there is a sense to remove all “SortingLayerSettings” from all objects.

Методы организации взаимодействия между скриптами в Unity3D.

Вступление.

Даже средний Unity3D проект очень быстро наполняется большим количеством разнообразных скриптов и возникает вопрос взаимодействия этих скриптов друг с другом.

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

Подход 1. Назначение через редактор Unity3D.

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

Назовем оба скрипта менеджерами: ScoresManager и HUDManager.
Каким же образом менеджеру, отвечающему за меню экрана можно получить текущее количество очков от менеджера, отвечающего за начисление очков?

Предполагается, что в иерархии объектов(Hierarchy) сцены существуют два объекта, на один из которых назначен скрипт ScoresManager, а на другой скрипт HUDManager.

Один из подходов, содержит следующий принцип:

В скрипте UIManager определяем переменную типа ScoresManager:

public class HUDManager : MonoBehaviour
{
	public ScoresManager ScoresManager;
}

Но переменную ScoresManager необходимо еще инициализировать экземпляром класса. Для этого выберем в иерархии объектов объект, на который назначен скрипт HUDManager и в настройках объекта увидим переменную ScoresManager со значением None.

Continue reading “Методы организации взаимодействия между скриптами в Unity3D.”