об играх, разработке на Unity и личном опыте

Buffer icon Проекты
Позднее 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"); // вызов события

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

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, оно позволяет работать с большими файлам, даже по несколько гигабайт.

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

Обо мне

Добрый день, меня зовут Игорь Лопатин.

Лопатин Игорь

Лопатин Игорь

Лопатин Игорь

Это мой персональный блог. В основном он посвящен разработке на Unity и играм. Этим я занимаюсь последние несколько лет. Почти всё время уделяю мобильным платформам (iOS и Android), знаю как спроектировать, разработать, выпустить и продвинуть приложение в AppStore и Google Play. Также имеют опыт портирования мобильных Unity игр на WebGL.

Большой опыт в разработке клиент-серверных приложений и игр, в том числе realtime, умею писать расширения редактора Unity и плагины для Android и iOS (iCloud, Google Sign-in, Sign-in with Apple, Firebase Push Service, Browser, Sharing, Mail, Images, Review, NativeInput, Huawei Purchases, Huawei Push Kit...). Работаю с Git (Flow, Submodules). Пользуюсь профайлером и memory профайлером. Знаю как работают многопользовательские онлайн игры (>50k online), настольные, сессионные, 2D. Могу интегрировать рекламные и другие SDK в Unity приложение: AppMetrica, AdMob, Unity Ads, Huawei Ads, FB, Twitter, Firebase, GA, OneSignal, etc.

Один год отдал стартапам и все что с ними связано, проработав руководителем IT-инкубатора: customer development, lean startup, agile, unit-экономика, аналитика, инвестиции, презентации (как давно это было :) — все это знаю, умею и при необходимости — применяю.

Со мной можно связаться по почте, в Телеграм или найти в Фейсбуке.

 2314   2016   блог