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

разработка

Позднее Ctrl + ↑

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"); // вызов события

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

 Нет комментариев    2995   2016   unity   разработка

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 в котором можно передавать с сервера нужные данные, а в приложении соответственно обрабатывать их. В документации также можно найти пример с локальными уведомлениями.

 Нет комментариев    1335   2016   ios   unity   разработка