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

unity

Позднее Ctrl + ↑

Unity native camera

Как получить изображение с камеры или из галереи с помощью Unity?

Если загуглить этот запрос, то на первых местах в выдаче скорее всего будут Unity Answers и Stackoverflow. И если походить по ссылкам, то они зачастую ссылаются друг на друга и в итоге, кто-нибудь кинет ссылку на Unity Asset Store.

В Asset Store на самом деле, много отличных плагинов которые справляются с этой задачей, и платных, и бесплатных. Но мало, которые бы «точечно» решали одну задачу, а не были большими паками, например как плагины от Stan. Ведь часто в приложении необходимо работать только с PUSH уведомлениями или получать картинку с камеры, а все остальное не требуется...

В общем, читаем предыдущую заметку, гуглим код получения и сохранения картинки для Android (надо отрефакторить конечно, в примере вырезанный откуда-то фрагмент :) и получаем плагин для работы с камерой в Unity.

Не забываем добавить в манифест необходимые разрешения.

Исходники на GitHub

 Нет комментариев    868   2016   android   camera   plugin   unity

Unity Android plugin

Как часто можно встретить на stackoverflow вопросы, про доступ к галереи картинок, или как получить снимок с камеры, или как показать браузер, или как работать с Play Services... Да что уж, я и сам задавал такие вопросы. А всё потому, что к сожалению, в Unity нет (пока) многих специфичных функций, которые зависят от платформы. Но есть возможность подключать нативные плагины, что очень хорошо. С помощью плагинов, можно организовать любое взаимодействие которое поддерживается платформой.

Раньше, плагины можно было компилировать в JAR файлы, закидывать в папку Assets/Plugins/Android и использовать. В общем-то, так можно делать и сейчас, но это подойдет для самых простых плагинов, не использующих ресурсы, которые нужно сохранять в папку res. А на такие вещи Unity стала ругаться и выдавать сообщение в консоль:

OBSOLETE — Providing Android resources in Assets/Plugins/Android/res is deprecated, please move your resources to an Android Library. See «Building Plugins for Android» section of the Manual.

Короче, надо делать Android Library. Если интересует, как сделать плагин по «старой технологии», могу рассказать, а пока — как надо.

Шаг 1.

Скачиваем Android Studio и Android SDK. Тут особых проблем возникнуть не должно.

Шаг 2.

Создаем новый Android Project. Далее, создаем новый модуль: File → New → New Module → Android Library

Шаг 3.

Скопируем JAR файл с классами Unity в папку libs нового модуля. И добавим в раздел с зависимостями Gradle файла строку с классами Unity. Где искать файл classes.jar можно прочитать в документации.

dependencies {
    provided files('libs/classes.jar')
    ...
}

Шаг 4.

Для примера сделаем плагин который показывает всплывающие сообщения, тосты (Toast). Создадим новый класс Plugin и добавим туда один метод show с параметром message. Не самый удачный пример, потому что не используются ресурсы, но самый простой.

package com.mycompany.toast;

import com.unity3d.player.UnityPlayer;
import android.widget.Toast;

public class Plugin {
	// Показать сообщение
	static void show(final String message) {
		UnityPlayer.currentActivity.runOnUiThread(new Runnable() {
			@Override
			public void run() {
				Toast.makeText(UnityPlayer.currentActivity, message, Toast.LENGTH_SHORT).show();
			}
		});
	}	
}

Шаг 5.

В Android Studio, справа в меню Gradle, ищем название модуля которое задали при создании и далее: Tasks → build → assembleRelease. Модуль скомпилируется в AAR файл, то что и нужно.

Шаг 6.

Копируем AAR плагин в папку Assets/Plugins/Android с Unity проектом. И пишем небольшой интерфейс для вызова функции show.

using UnityEngine;
using System.Collections;

public class Toast : MonoBehaviour {

	// Показываем всплывающее сообщение
	public static void Show (string message) {
		#if UNITY_ANDROID
			using (var plugin = new AndroidJavaClass("com.mycompany.toast.Plugin")) {
				plugin.CallStatic("show", message);
			}
		#endif
	}

Шаг 7.

Закидываем приложение на Android устройство и проверяем. Все должно работать.

Это конечно не самый интересный пример, в следующей заметке напишу как получить изображение с камеры или альбома и использовать его в Unity. Или как отобразить HTML страницу в браузере...

 Нет комментариев    2421   2016   android   plugin   unity

Unity Event Manager с параметрами

Обновлено 4.12.2017
Немного обновил этот пример — теперь в параметры и их количество могут быть любыми

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

Модернизируем немного пример с сайта:

using UnityEngine;
using UnityEngine.Events;
using System.Collections;
using System.Collections.Generic;
using System;

public class EventManager : MonoBehaviour {

	[Serializable]
	public class GameEvent : UnityEvent <string> {};	// Наше новое событие с параметром			
	private static EventManager _eventManager;								
	private Dictionary <string, GameEvent> _eventDictionary;				

	public static EventManager instance {
		get {
			if (!_eventManager) {
				_eventManager = FindObjectOfType (typeof (EventManager)) as EventManager;
				if (!_eventManager) 
					 Debug.LogError ("There needs to be one active EventManger...");
				else 
					_eventManager.Init (); 
			}
			return _eventManager;
		}
	}

	void Init () {
		if (_eventDictionary == null)
			_eventDictionary = new Dictionary<string, GameEvent>();
	}

	public static void StartListening (string eventName, UnityAction <string> listener) {
		GameEvent thisEvent = null;
		if (instance._eventDictionary.TryGetValue (eventName, out thisEvent))
			thisEvent.AddListener (listener);
		else {
			thisEvent = new GameEvent ();
			thisEvent.AddListener (listener);
			instance._eventDictionary.Add (eventName, thisEvent);
		}
	}
		
	public static void StopListening (string eventName,  UnityAction <string> listener) {
		if (_eventManager == null) 
			return;
		GameEvent thisEvent = null;
		if (instance._eventDictionary.TryGetValue (eventName, out thisEvent))
			thisEvent.RemoveListener (listener);
	}

	public static void SendEvent (string eventName, string param = null) {
		GameEvent thisEvent = null;
		if (instance._eventDictionary.TryGetValue (eventName, out thisEvent))
			thisEvent.Invoke (param);	// Вызов и передача параметра
	}
}

Вместо UnityEvent будем работать с GameEvent у которого теперь есть string. Таким же образом преобразуем UnityAction и функцию вызова события.

Пример использования такой же:

void OnEnable () {
	EventManager.StartListening ("event_name", MyFunction);
}

void OnDisable () {
	EventManager.StopListening ("event_name", MyFunction);
}

void MyFunction (string param) {
	Debug.Log (param); // переданный параметр
}

...

EventManager.SendEvent ("event_name", "param_string"); // вызов события

Собственно, параметров можно сделать несколько и других типов, всё зависит от потребностей.

Push-уведомления для iOS в Unity

Используя Unity для мобильной разработки, часто возникает необходимость добавить push-уведомления в свою игру или приложение. И если вы планируете выпускать игру для платформы iOS, то в Unity уже есть средства для работы с уведомлениями. Для Android нужно будет писать нативный плагин, об этом в другой раз.

И так, предположим серверная часть у вас уже готова, настроены сертификаты и т. д. Осталось сделать реализацию для приложения.

Первое, что нужно сделать — объявить, что вы хотите получать уведомления:

using NS = UnityEngine.iOS.NotificationServices;
using RN = UnityEngine.iOS.RemoteNotification;
...
void Awake () {
   NS.RegisterForNotifications(NotificationType.Alert|NotificationType.Badge|NotificationType.Sound);
   isTokenSent = false;
   isErrorAlert = false;
}

Так как, коллбеков никаких нет, что печально кстати, то проверяем все наши действия в Update:

void Update () {
   if (NS.registrationError != null && !isErrorAlert) { // проверяем есть ли ошибки
      Debug.Log (NS.registrationError);
      // что-то пошло не так
      _isErrorAlert = true;
   } else if (NS.deviceToken != null && !isTokenSent && !isErrorAlert) { // проверяем есть ли токен и отправлен ли он
      string token = Convert.ToBase64String (NS.deviceToken);
      SendTokenToServer (token); // отправляем токен на свой сервер
      _isTokenSent = true;
   }	
   if (_isTokenSent && !isErrorAlert && NS.remoteNotificationCount > 0) { // проверяем если есть токен, нет ошибок, и есть уведомления, то берем их
      RN push = NS.GetRemoteNotification (NS.remoteNotificationCount - 1);
      // делаем с нашим уведомлением что хотим и очищаем
      NS.ClearRemoteNotifications ();
   }
}

У объекта push есть свойство UserInfo в котором можно передавать с сервера нужные данные, а в приложении соответственно обрабатывать их. В документации также можно найти пример с локальными уведомлениями.

Unity и Git

Как настроить Unity для работы с Git? Как настроить Git, чтобы в репозиторий не попадали ненужные файлы?

Из всех файлов и папок в Unity проекте, нас интересует всего две папки: Assets и ProjectSettings. В первой папке хранятся все скрипты, спрайты, анимации и прочее. Во второй — настройки проекта. Все остальные файлы можно исключить из репозитория, их сгенерирует Unity, MonoDevelop или VisualStudio.

Добавим исключения в файл .gitignore

/[Ll]ibrary/
/[Tt]emp/
/[Oo]bj/
/[Bb]uild/
/[Bb]uilds/
/Assets/AssetStoreTools*

# Autogenerated VS/MD solution and project files
ExportedObj/
*.csproj
*.unityproj
*.sln
*.suo
*.tmp
*.user
*.userprefs
*.pidb
*.booproj
*.svd

# Unity3D generated meta files
*.pidb.meta

# Unity3D Generated File On Crash Reports
sysinfo.txt

# Builds
*.apk
*.unitypackage

# OS generated
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db

Кстати, на GitHub есть коллекция полезных .gitignore файлов, вроде, постоянно обновляется и пополняется.

Осталось настроить Unity:

  • Устанавливаем Hidden Meta Files:
    Editor → Project Settings → Editor → Version Control → Mode
  • Устанавливаем Force Text:
    Editor → Project Settings → Editor → Asset Serialization → Mode
  • Сохраняем проект

Теперь можно запушить свой Unity проект. Также, можно поставить расширение Git LFS, оно позволяет работать с большими файлам, даже по несколько гигабайт.

 Нет комментариев    1843   2016   git   unity