Архитектура приложения Unity3D (StrangeIoC)

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

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

Я выработал свой подход, и вот основные моменты:

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

Всю логику можно поделить на стейты, сервисы и библиотеки. Каждый стейт несет свое бремя в жизни приложения. Типичный пример: есть приложение, в нем есть меню, сама игра и окно выигрыша/проигрыша. Все эти экраны можно представить как состояния, поэтому получится 4 состояния в вашем приложении: меню, игра, выигрыш, проигрыш. Осталось только связать их переходами.
test
Читать дальше →

Фиксим Unity Scroll Drag Threshold

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

Решение оказалось простым и элегантным, которое можно оформить в маленький скрипт:
//
// Coded by afrokick 2016
// https://devby.ru/afrokick/2016/05/11/fiksim-unity-scroll-drag-threshold.html
//
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;

/// <summary>
/// Use it in new unity UI system for fix drag threshold in different scale factor.
/// </summary>
public class DragThresholdFixer : MonoBehaviour
{
	[SerializeField]
	private EventSystem myEventSystem;

	[SerializeField]
	private Canvas myCanvas;

	[SerializeField]
	private float pixelDragThreshold = 5;

	// Use this for initialization
	void Awake()
	{
		myEventSystem.pixelDragThreshold = (int)(pixelDragThreshold * myCanvas.scaleFactor);
	}
}


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

Удачи!

Быстрый Unity UI Scroll с бесконечным числом элементов

Привет! Записал урок по скроллу. Задача была сделать скролл с большим количеством элементов внутри и чтобы не тормозило. «Бесконечное» естественно конечно, но по сути лишь память вам ограничитель, ну и размер Int32:)

В основе лежит принцип разделения данных(model) и представления(view). У нас есть шаблон элемента, которым выглядит одинаково, но данные в нем разные.

Так же стоит учесть, что внутри скролла одновременно мы видим небольшое количество элементов, а не все сразу.

Связываем 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$>()

Уроки по 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.

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

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

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

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

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

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

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