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
}
}
Тут нужно уточнить, что браузер будет добавлен на главный экран, поверх всего. Поэтому, нужно правильно высчитать отступы, чтобы все выглядело красиво. В примере значения отступов грубо прописаны в коде, так делать не стоит :)