Работаем с Stencil в Unity3D ShaderLab

Приветы. Встала вот такая задача: сделать затемнение всего экрана, но в каком-то участке сделать как бы «дырку».

Как такое можно сделать?

1 Вариант — «Латать» экран
Заделываем экран кусками — тут думаю понятно) У нас есть одна текстура круга, а остальную часть мы заделываем кусками. Реализовывать дополнительно ничего не нужно, достаточно сверстать. НО! Как только понадобиться несколько «дыр», верстка усложнится. А если нужно динамически подсвечивать часть экрана?

Читать дальше →

Связываем C# с MySQL

Приветствую! Хочу расписать поподробнее тему подключения MySQL к вашему коду на C#.

1 Установка MySQL
Для начала нужно установить саму субд. Есть несколько вариантов:
1. поставить готовый веб сервер с настроенной субд
2. поставить с нуля

Второй способ требует больше телодвижений и опыта и используется обычно в продакшане(при выходе продукта на рынок).

Поэтому, поставим готовый веб сервер. Главное для нас — наличие MySQL. Для Windows можно использовать OpenServer(достаточно будет базовой редакции). Как установить и настроить можно прочесть тут

Достаточно будет запустить выбранный веб-сервер и бд готова к использованию.

Читать дальше →

Unity Tips: Code Templates (шаблоны кода)

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

Если вы хотите сократить время набора однообразного кода в несколько раз, то встречайте — Шаблоны Кода!(Code Templates)

Мы разберем шаблоны в IDE MonoDevelop, но они существуют и в других средах, например, Visual Studio.

И так, смотрим видео. И несколько шаблонов ниже я приведу в качестве примера.



Обработчик клика по кнопке:
private void On$btnName$Click(GameObject sender)
{

}

Получить компонент объекта:
$variable$.GetComponent<$type$>()

NGUI Unity: наследование прозрачности

На днях столкнулся с такой задачкой — нужно делать кнопку прозрачной при наведении, но иконку на ней оставлять не прозрачной. В NGUI альфа кумулятивная, т. е. у ребенка конечная альфа будет = parent.alpha * child.alpha. Чтобы не затрагивать альфу иконки, нужно перегруппировать элементы. Подробнее в видосе.

Уроки по Unity и StrangeIoC


Всем привет! Хочу поделиться с вами IoC-фреймворком под названием StrangeIoC. Он позволяет писать слабо связанный код, внедрять зависимости, использовать команды и другое. Можно почитать подробнее на офф сайте.

Я записал 6 уроков по основам, но фреймворк не ограничивается этим.

Урок 1
Урок 2
Урок 3
Урок 4
Урок 5
Урок 6

NGUI Unity обрабатываем нажатие на слово в тексте



Если вам нужно обработать нажатие на слово в тексте, то самый простой способ — использовать встроенные средства в NGUI 3.5.6+

вот скрипт:

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(BoxCollider))]
public class TapLabel : MonoBehaviour
{
	private UILabel _label;

	private string _text = "My cool text";

	// Use this for initialization
	void Start ()
	{
		_label = GetComponent<UILabel>();

		_label.text = _text;

		UIEventListener.Get(_label.cachedGameObject).onPress = OnLabelPress;
	}
	
	// Update is called once per frame
	private void OnLabelPress(GameObject sender, bool pressed)
	{
		_label.text = _text;

		if(!pressed)
			return;

		Vector2 screenPos = Input.mousePosition; //grab screen coords where you tapped
		Camera cam = NGUITools.FindCameraForLayer (gameObject.layer);
		Vector3 worldPos = cam.ScreenToWorldPoint (screenPos);//fancy unity convert screen coords to world coords

		var word = _label.GetWordAtPosition(worldPos);
		
		if(!string.IsNullOrEmpty(word))
		{
			_label.text = _text.Replace(word,"[u][ff0000]" + word + "[-][/u]");
		}
	}
}


Распаковка zip архива в Unity3D

Приветствую! Опишу свой опыт работы с zip архивами. На первый взгляд, казалось, тривиальнейшная задача. Андроид завелся мигом, а вот iOS(il2cpp) сразу выдал ошибки. Поэтому если хотите сэкономить пару часов разработки, внимайте:)

Задача — распаковать zip архив

Приступим

1. Инструмент — github.com/r2d2rigo/dotnetzip-for-unity (PC,Android,iOS)

Однако, мне не удалось нормально собрать либу, и один товарищ помог с этим, за что ему большое спасибо! Рекомендую скачать dll файл вот тут(прямая ссылка).

2. Кладем dll файл в папку Assets\Plugins\

3. Обертка над либой:

		public static void Unpack(string zipfilePath, string location)
		{
			// создаем папку куда будем распаковывать
			Directory.CreateDirectory(location);

			//распаковываем зип файл и начинаем читать файлы
			using (ZipFile zip = ZipFile.Read(zipfilePath))
			{
				var z = zip.GetEnumerator();
				
				while (z.MoveNext())
				{
					var t = z.Current;
					if (t == null) 
						continue;
					
					var path = location + "/" + t.FileName.Replace("\\", "/");
					
					using (FileStream s = File.Create(path))
					{
						t.Extract(s);
					}
				}
			}
		}


4. Теперь можно распаковывать:

...
Unpack(Path.Combine(Application.persistentDataPath,"myArchive.zip"),Path.Combine(Application.persistentDataPath,"outputDir"));
...


Итог — умеем распаковывать зипки)

Что нужно знать о сохранении данных в Unity3D


Привет! Очередные фичи были запилены, очередные баги были зафикшены. А возникли они почти на пустом месте.

И так, предисловие

Делаем мы значит проект. Для сохранения данных используем SQLite, стандатрный PlayerPrefs.

Покупки и баланс пользователя хранит Soomla.

И после очередного обновления вдруг выясняется, что игрок теряет весь прогресс прохождения, если обновиться до последней версии. Стали искать…

Читать дальше →

Unity3D, iOS и AOT: Что нужно иметь ввиду

Привет. На своем проекте пришлось переводить код c Android на iOS, который не был заранее под это дело рассчитан. В чем проблема?

AOT + Mono 2.6


Ahead of Time(AOT) компиляция — это когда компиляция выполняется всей программы перед ее использованием. Это значит, что все типы должны быть заранее известны.

Юнити использует версию Mono 2.6 + допилы с их стороны. В этой версии есть баги, которые делают разработку тем еще квестом.

Типичные факапы


0. Читаем офф справку

1. Interlocked.CompareExchange<>() — об этом можно прочесть тут.

Вариант решения — использовать перегрузку, которая принимает object тип.

2. Dictionary<ValueType,...>() — да-да. Если использовать в словаре значимый тип как ключ, то будет креш. Я с этим столкнулся при использовании json десериализатора. Проблема описана тут.

Вариант решения — реализовать интерфейс IEqualityComparerи подставить объект типа в конструктор словаря Dictionary<TKey, TValue> (объект).

3. PropertyInfo.GetValue() — «немного рефлексии не помешает» думаете вы. И получаете значение свойства… Фиг вам:) Краш! На эти грабли я вступил, когда мой JsonFX упал в попытках десериализовать класс из строки. Используйте JSON.NET for Unity

Вариант решения — использовать метод PropertyInfo.GetGetMethod().Invoke(obj,null); Говорят, что он в несколько раз медленнее, но что поделать.

4. LINQ — не все экстеншен методы работают гладко. Читаем коммент.

Вариант решения — использовать плагин.

5. Ran out of trampolines of type xxx — это когда много генериков у вас в коде, насколько я понял. Описано в офф справке.

Вариант решениячитать

Third Party


Очень рекомендую вам проверить, поддерживают ли ваши либы AOT. Так, мне пришлось выкинуть на своем проекте StackService(.NET), JsonFX.

Лучше сразу прощупайте почву и выберите правильный инструмент.

the end


Вот и все, чем я хотел с вами поделиться. Что продублировал из справки, чтобы показать вариант решения. Продуктивной разработки вам!

P.S. Если есть что добавить — прошу комменить. Спасибо AGulev за LINQ

Unity 5 UNET Chat Example Пример чата

Решил я попробовать написать что-нибудь на низком уровне, так называемом low-level UNET. Попытался смастерить на NetworkConnection-ах сервер и клиент, но не тут-то было… Клиент не отправляет данные и все тут. Начал копать глубже и оказалось, что канал сообщений не отправляется(флешится), т.к. метод этот internal и все тут. Пришлось искать что-то другое. И так я пришел к NetworkServer и NetworkClient.

Первый реализует логику сервера — прослушивает порт и обрабатывает события подключения, отключения, получения данных и их рассылку.

Второй класс — клиент. Подключаемся к серверу, работаем с ним, отключаемся.

В целом, выглядит все хорошо. Чат получилось сделать:)