Buffer icon Проекты

4 мая 2016-го

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

Unity iOS plugin

Так как тема мобильной разработки на Unity для меня сейчас актуальна, то продолжу про создание плагинов. Как сделать свой плагин для iOS? Что можно делать с помощью нативных плагинов? Например, показать стандартный ActionSheet или отобразить HTML, или синхронизироваться с iCloud, или получить доступ к галереи картинок опять же... Чтобы сделать простой плагин и xCode не обязателен, на самом деле.

Для примера, сделаем плагин который отображает браузер и загружает какую-нибудь страницу внутри Unity приложения. Плагин будет состоять всего из одного файла, с расширением .mm. В документации есть список форматов и описание сборки под iOS.

Для начала, объявим главный контроллер Unity приложения:

extern UIViewController *UnityGetGLViewController();

Для примера будет достаточно трех функций: показа браузера, загрузки страницы, скрытия браузера.

- (void)showBrowser {
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, screenRect.size.width, screenRect.size.height)];
    [UnityGetGLViewController().view addSubview:webView];
}

- (void)loadUrl:(NSString *)url {
    [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]];
}

- (void)close {
    [webView removeFromSuperview];
    webView = NULL;
}

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

Ну и последнее, интерфейс доступа на C:

static Browser *browser = NULL;

extern "C" {
    
    void browserLaunch () {
        if (browser == NULL)
            browser = [[Browser alloc] init];
        [browser showBrowser];
    }
    
    void browserLoadUrl (const char* url) {
        [browser loadUrl:[NSString stringWithUTF8String:url]];
    }
    
    void browserClose () {
        [browser close];
    }
    
}

Это все, плагин готов! Теперь осталось вызывать эти функции из Unity. По аналогии с Android плагином, делаем класс для браузера. Все функции подключаем через [DllImport («__Internal»)], должно получиться что-то такое:

using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;

public class Browser : MonoBehaviour {

	#if UNITY_IPHONE
		[DllImport ("__Internal")]
		private static extern void browserLaunch (int left, int right, int top, int bottom);

		[DllImport ("__Internal")]
		private static extern void browserLoadUrl (string url);

		[DllImport ("__Internal")]
		private static extern void browserClose ();
	#endif 

	// Показываем браузер
	public static void Launch (RectOffset offset) {
		#if UNITY_IPHONE
			browserLaunch (offset.left, offset.right, offset.top, offset.bottom);
		#endif
	}

	// Открыть страницу
	public static void LoadUrl (string url) {
		#if UNITY_IPHONE
			browserLoadUrl (url);
		#endif
	}

	// Убрать браузер
	public static void Close () {
		#if UNITY_IPHONE
			browserClose ();
		#endif
	}
}

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

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

29 апреля 2016   · · ·
← Ctrl →
· · ·   10 мая 2016