Buffer icon Проекты
135 заметок с тегом

unity

Позднее Ctrl + ↑

Unit тесты в Unity

Что такое юнит-тестирование, зачем оно нужно, стоит ли покрывать весь код тестами — можно узнать из этой хорошей статьи. Я лучше сразу скажу, как создать тест в Unity. Открываем пункт меню Window → Editor Tests Runner. Если у вас ещё нет тестов, то увидите окно, как на скриншоте, если нет этого пункта меню — значит у вас старая версия Unity :)

При нажатии на кнопку — создастся пример теста. Все!
На самом деле — нет.

using UnityEngine;
using UnityEditor;
using NUnit.Framework;

public class NewEditorTest {

	[Test]
	public void EditorTest() {
		//Arrange
		var gameObject = new GameObject();

		//Act
		//Try to rename the GameObject
		var newGameObjectName = "My game object";
		gameObject.name = newGameObjectName;

		//Assert
		//The object has a new name
		Assert.AreEqual(newGameObjectName, gameObject.name);
	}
}

Как видно, у метода есть атрибут [Test], который и указывает, что это будет тестом. Если создать несколько тестов и запустить их через тот же Editor Tests Runner, можно увидеть какие тесты прошли, а какие нет:

В Unity для тестирования используется опенсорсная библиотека NUnit, которая предназначена для работы с .Net языками, в том числе и с C#. На Github есть обширная документация, где расписаны все атрибуты которые можно использовать.

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

Также, у Unity есть ещё специальный ассет для тестирования — Unity Test Tools, но как я понял они его перестали поддерживать.

Как начать использовать Vuforia в Unity

Vuforia — это платформа дополненной реальности. С её помощью можно делать такие приколюхи, например:

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

Про ARKit от Apple в следущий раз :) Плюс Vuforia — работает и на Android тоже.

 Нет комментариев    4502   2017   ar   unity   ссылки

Работа в фоне в iOS и Unity

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

-(void) startTask {
    [self endTask];
    if (bgTask == UIBackgroundTaskInvalid) {
        bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
            [[UIApplication sharedApplication] endBackgroundTask:bgTask];
            bgTask = UIBackgroundTaskInvalid;
        }];
    }
}

- (void) endTask {
    if (bgTask != UIBackgroundTaskInvalid) {
        [[UIApplication sharedApplication] endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }
    [UIApplication sharedApplication].idleTimerDisabled = NO;
}

А в Unity это вызывается на OnApplicationFocus:

void OnApplicationFocus (bool focusStatus) {								
    if (focusStatus) 
        Background.StopTask();
    else 
        Background.StartTask();
}

Ссылка на Github

 Нет комментариев    753   2017   git   ios   plugin   unity   разработка

10 полезных ассетов и библиотек для Unity

Небольшой список библиотек и ассетов которые я использую или использовал в разных проектах. Будет полезно новичкам в Unity, чтобы не выдумывать свои велосипеды. Так как я 3D почти не занимаюсь, то и ассеты будут соответствующие ;)

1. Библиотека скриптов от Leopotam [Ссылка]

Уже несколько раз я рекомендовал эту библиотеку и сделаю еще раз, потому что автор не забрасывает её и развивает. Куча отличных, оптимизированных скриптов.

2. Lean Touch [Ссылка]

Бесплатный ассет для работы с тач события на мобильных устроствах. Перемещение, тапы, мультитач, всё поддерживает и очень просто в использовании. Есть платная про версия.

3. NiceJson [Ссылка]

Один скрипт для работы с JSON. Полная поддержка спецификации RFC4627, прекрасно работает в Unity.

4. Google Play Resolver [Ссылка]

Если вы используете в своих играх Google сервисы — эта библиотека вам необходима. Вам нужно лишь указать какие сервисы вы хотите использовать и она подгрузить все необходимые файлы и плагины для iOS и Android, чтобы не было конфликтов.

5. UI Extensions [Ссылка]

Про эту бесплатную библиотеку скриптов я тоже как-то упоминал. Стандартный набор UI компонентов в Unity довольно скромен и если вы хотите сделать интерфейс более интересным, интерактивным и живым — посмотрите эту либу. Она тоже поддерживается и развивается.

6. DOTween [Ссылка]

Наверно, самый лучший ассет для анимации объектов. Куча настроек и возможностей: параллельное выполнение, циклы, колбеки, паузы и т. д. Есть платная про версия — там еще больше ништяков.

7. TexturePacker [Ссылка] [Плагин]

Это не ассет, а приложение + плагин для Unity, но оно подходит в общий список. Потому что встроенный упаковщик Unity не дает таких возможностей, как TexturePacker. Приложение платное, но оно того стоит.

8. AutoSaver [Ссылка]

Небольшой ассет который сохранит ваши время и нервы в порядке. Если у вас было, что редактор Unity зависал, а сцена не сохранена, вы поймете :) Ассет сохраняет сцену каждый раз когда вы нажимаете Play. Кстати, если после краша вы не успели снова запустить Unity, то восстановить сцену можно, она сохраняется в специальной папке

9. TextMesh Pro [Ссылка]

Лучший ассет для работы с текстом. Хорошо что Unity его приобрела и он теперь доступен всем. А пользователям которые покупали его, доступен исходный код, альфа и бета версии на сайте у автора.

10. Unity Assets [Ссылка]

Ну и на последок раздел с ассетами от Unity. Многие новички и не знают, сколько там полезного и готового есть. Готовые примеры игр, контроллеры, эффекты и т. д.

Решение проблемы с 3DTouch в Unity

Обновлено 24.07.2017

В Unity, даже в последних версиях есть баг с 3DTouch (Force Touch) в iOS. Заключается он в том, что левый край дисплея плохо реагирует на нажатия, если 3DTouch включен. Если его выключить — все работает как должно. В трекере этот баг есть и пока он не исправлен.

К сожалению, программно отключить 3DTouch для приложения нельзя. Хотя было бы неплохо... Но временное решение этой проблемы есть! Нужно немного «пропатчить» xCode проект.

Мы добавим обработчик тачей, который срабатывает и с включенным 3DTouch, в нем будем определять край экрана и «прокидывать» дальше начало нажатия (touchesBegan). Да, решение немного костыльное, но другого пока не нашел.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([[self traitCollection] forceTouchCapability] == UIForceTouchCapabilityAvailable) {
        CGPoint point= [touch locationInView:touch.view];
        if (point.x < 35) { // <-- тут коэффициент можно поправить
            NSSet *set = [NSSet setWithObjects:touch, nil];
            UnitySendTouchesBegin(set, NULL);
        }
    }
}

На гитхаб выложил скрипт, который автоматически патчит нужные файлы после билда. Проверен в версии 5.5.3f1.

Ссылка на Github

Запуск билда Unity в симуляторе iOS

Если у вас возникли проблемы с запуском билда в симуляторе iOS, в то время как на устройстве и редакторе все работает — следует проверить пару моментов:

  • Если у вас есть нативные плагины, которые используют сервисы недоступные в симуляторе (in-app, push, keychain, etc) — их нужно отключить/закомментировать.

  • Возможно, вы забыли поменять Target SDK при компиляции на Simulator SDK.
  • А еще, Unity мог неправильно выставить Build Settings в xCode проекте и их нужно поправить вручную, например так:

После этого, все должно заработать ;)

Unity, iOS и IPv6

С 1 июня 2016 года, все отсылаемые приложения в AppStore должны уметь работать по IPv6.

Unity вроде как решили все эти вопросы еще в прошлом году. Но если погуглить, то оказывается, что некоторые получают отказы до сих пор, по тем или иным причинам связанным с IPv6. Чтобы проверить работает ли ваше приложение в сетях IPv6, Apple написали специальную статью с мануалом. Я ей воспользовался и обнаружил, что приложение не коннектится к серверу :(

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

...
private Socket _socket;
 
public static void Connect () {
    _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    _socket.BeginConnect("134.253.17.11", 10001, new AsyncCallback(OnEndConnect), null);
}
 
void OnEndConnect (IAsyncResult iar) {
    Debug.Log ("connected");
}
...

Собственно, сразу стало понятно в чем проблема — AddressFamily должен быть InterNetworkV6 если работаем по IPv6 или InterNetwork для IPv4.

Если подключаться к серверу по домену, то можно воспользоваться таким решением — передаем хост, указываем тип, в ответ получает IPv6 или «обычный» IP адрес.

Если же подключение осуществляется по IP адресу, то преобразование с помощью различных конвертеров в IPv6 (раз, два), не дало работающего результата — сокет просто не подключался.

Ответ был найден в том самом мануале от Apple (смотрим на подраздел Use System APIs to Synthesize IPv6 Addresses) и на одном китайском сайте :) Если все это объединить, то получится более-менее универсальное решение которое будет работать и по IPv6, и по IPv4, в iOS и Android.

Исходник на Github

 Нет комментариев    419   2017   git   ios   plugin   unity   разработка

Кликабельные ссылки в TextMeshPro

Как сделать чтобы ссылки в тексте, стали «ссылками» и при клике на них открывалась страница? Просто! Достаточно открыть примеры из TextMeshPro (TMP) и добавить немного кода.

Пускай у нас есть компонент ТМР с текстом, в котором встречаются ссылки на страницы в сети, например: http://mopsicus.ru, www.unity3d.com, и другие. И нужно чтобы это выглядело примерно так, и было кликабельно:

Для этого, находим ссылки в тексте с помощью регулярного выражения, сокращаем их (по желанию) и приводим к формату для обработки ТМР.

// Check links in text
void CheckLinks () {
	Regex regx = new Regex ("((http://|https://|www\\.)([A-Z0-9.-:]{1,})\\.[0-9A-Z?;~&#=\\-_\\./]{2,})" , RegexOptions.IgnoreCase | RegexOptions.Singleline); 
	MatchCollection matches = regx.Matches (textMessage.text); 
	foreach (Match match in matches) 
		textMessage.text = textMessage.text.Replace (match.Value, ShortLink(match.Value));     	
}

// Cut long url
string ShortLink (string link) {
	string text = link;
	int left = 9; 		
	int right = 16; 		
	string cut = "..."; 	
	if (link.Length > (left + right + cut.Length)) 
		text = string.Format ("{0}{1}{2}", link.Substring (0, left), cut, link.Substring (link.Length - right, right));
	return string.Format("<#7f7fe5><u><link=\"{0}\">{1}</link></u></color>", link, text);
}

Как установить подчеркивание, цвет текста и другое смотрите в документации ТМР. Осталось повесить обработчик нажатия и определить на какую ссылку кликнули:

// Get link and open page
public void OnPointerClick (PointerEventData eventData) {
	int linkIndex = TMP_TextUtilities.FindIntersectingLink (textMessage, eventData.position, eventData.pressEventCamera);
	if (linkIndex == -1) 
		return;
	TMP_LinkInfo linkInfo = textMessage.textInfo.linkInfo[linkIndex];
	string selectedLink = linkInfo.GetLinkID();
	if (selectedLink != "") {
		Debug.LogFormat ("Open link {0}", selectedLink);
		Application.OpenURL (selectedLink);        
	}
}

Исходник на Github

 1 комментарий    3656   2017   unity   разработка   с#

Баг в userInfo NotificationItem [iOS]

Если вы работаете с пуш уведомлениями в iOS и делаете это стандартными средствами Unity, то при обработке уведомления у вас могут возникнуть сложности с цифровыми значениями. Видимо Unity сам преобразует их в Int64. В тоже время, с текстовыми полями все в порядке.
Чтобы получить «нормальное» цифровое значение из пуша и преобразовать в Int, можно воспользоваться таким способом:

...
int my_int_value = 0;
object data = push.userInfo["my_int_value"];
if (data is Int64)
	my_int_value = ConvertInt64ToInt32((Int64)data);
...
// Convert function
int ConvertInt64ToInt32 (Int64 val) {
	return (int)(val & 0xFFFFFFFF);
}

Но как показывает практика, лучше использовать нативный плагин :)

 Нет комментариев    222   2017   ios   unity   с#

О Texture2D и памяти

Если погуглить на тему Unity Texture2D, memory leak, www.texture — то можно обнаружить кучу постов с вопросами о том, почему не освобождается память. И это на на самом деле так, если ничего не предпринимать.

Намучившись со всем этим, составил небольшой список мыслей/советов:

  • Создавайте, как можно меньше Texture2D, в идеале использовать пул. И обязательно делать Destroy, когда объект уже не будет использоваться, иначе память не освободится.
  • При использовании класса WWW, также нужно удалять www.texture и делать www.Dispose.
  • Сжатие «на лету» не работает, т. е. если вы например загружаете изображение из интеренетов и потом вставляете в Image, способом ниже, то на мобильном устройстве, картинка полностью развернется в память, без сжатия. И это печально.
// data is downloaded byte[]
...
Texture2D texture = null;
#if UNITY_ANDROID
	texture = new Texture2D(2, 2, TextureFormat.ETC2_RGBA8, false);
#elif UNITY_IOS
	texture = new Texture2D(2, 2, TextureFormat.PVRTC_RGBA4, false);
#endif
texture.LoadImage(data); 
Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(.5f, .5f)));
MyImage.sprite = sprite;
  • Используйте сжатие предназначенное под конкретную платформу. Для iOS — это PVRTC4, для новых моделей подойдёт ASTC, начиная с iPhone 6. Для Android — ETC. Подробнее про это можно прочитать в мануале Unity.
  • Кроме того, сжатие не будет работать в некоторых случаях, если размеры спрайтов и атласов не равны степени 2. Т. е. размеры должны быть 128x128, 2048x2048 и т. д.
Ранее Ctrl + ↓