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.

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

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

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

Unity 5 UNET Урок 2: Синхронизация позиции

Во втором уроке по UNet рассмотрим синхронизацию позиции.

Для синхронизации данных используются переменные с атрибутом SyncVar. Такие переменные можно изменять только на сервере, и изменения рассылаются всем клиентам.

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

Команды — это методы, которые вызываются на стороне клиента, но исполняются на стороне сервера. Чтобы объявить команду нужно добавить префикс Cmd в названии и атрибут Command. Параметром может быть сколь угодно.

Кроме SyncVar можно использовать сообщения. О них мы поговорит в будущих уроках.

Зарабатываем на рекламе с Unity3D и Appodeal

Каждый хочет получить вознаграждение за проделанную работу. Кто-то монетизирует приложение через встроенные покупки, кто-то делает приложение платным, а кто-то добавляет рекламу. Последний случай очень геморойный — нужно выбрать площадки, с которых брать рекламу; проинтегрировать для каждой площадки СДК; заботиться о fill-rate(заполняемость рекламы). В итоге казалось бы тривиальная задача превращается в рутинный процесс на несколько дней, а то и недель.



К счастью, в последнее время, стали получать распространение площадки-агрегаты. Они сами подключают нужные вам рекламные сети и выдают рекламу через единственное API.

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