Как построить плагин Unity3d для iOS
У меня есть очень маленькая библиотека Objective-C, построенная для iOS, и я хочу экспортировать ее в Unity. Я понимаю основной процесс написания оболочки csharp, которая маршалирует все вызовы в родную библиотеку, но я совершенно не знаю, с чего начать. Может ли кто-нибудь объяснить шаг за шагом, как создать пакет unity с моей библиотекой, чтобы я мог также распространять его другим разработчикам.
документация Unity3d довольно коротка и не объясняет что угодно.
спасибо.
2 ответов
хорошо, после нескольких дней игры с Unity3d на Mac я, наконец, понял это. Весь код в этом руководстве является фиктивным. Я написал этот материал за 15 минут или около того, поэтому не беспокойтесь об ошибках и опечатках.
1) Откройте Unity, создайте новый проект (Файл -> Новый проект) и сохраните его где-нибудь
2) при создании проекта он имеет следующую структуру:
-
ProjectName/Assets
(это то, что вам нужно) -
ProjectName/Library
(Nevermind что там) -
ProjectName/ProjectSettings
(тебе все равно) -
ProjectName/ProjectName.sln
(проект MonoDevelop)
3) Перейти к ProjectName/Assets
и создайте следующие папки: Plugins/iOS
, поэтому в конце у вас будет такая структура папок:ProjectName/Assets/Plugins/iOS
4) Поместите скомпилированную библиотеку (.а) файл и необходимые заголовки внутри ProjectName/Assets/Plugins/iOS
или скопируйте исходный код вашей библиотеки там (.мм ,ч. ,м и т. д..). Помните, что обычно вы можете получить доступ только к C-функциям из C#, поэтому вам придется как-то обернуть свой материал Objective-C в C-коде, в моем случае все объекты Objective-C были реализованы в виде Синглтона, поэтому было нетрудно сделать оболочку c-стиля, например:
CWrapper.h:
extern "C" void MySDKFooBarCFunction();
CWrapper.мм
#import "CWrapper.h"
#import "MyObjectiveCLibrary.h" // your actual iOS library header
void MySDKFooBarCFunction() {
[MyObjectiveCLibrary doSomeStuff];
}
5) Затем перейдите к ProjectName/Assets
и создайте папку для класса(классов) оболочки CSharp, назовите ее как хотите, например:ProjectName/Assets/MySDK
6) Внутри из папки MySDK создайте MySDK.cs-файл, фиктивный пример оболочки C# будет выглядеть так:
using UnityEngine;
using System;
using System.Runtime.InteropServices;
public class MySDK
{
// import a single C-function from our plugin
[DllImport ("__Internal")]
private static extern void MySDKFooBarCFunction();
// wrap imported C-function to C# method
public static void FooBarCFunction() {
// it won't work in Editor, so don't run it there
if(Application.platform != RuntimePlatform.OSXEditor) {
MySDKFooBarCFunction();
}
}
}
7) создайте сценарий оболочки, чтобы упаковать этот материал в .unitypackage
и поместите его рядом с папкой проекта (не внутри). Настроить EXPORT_PATH
и PROJECT_PATH
переменные в скрипте для ваших нужд.
#!/bin/sh
WORKDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
UNITY_BIN="/Applications/Unity/Unity.app/Contents/MacOS/Unity"
EXPORT_PATH="${WORKDIR}/ProjectName.unitypackage"
PROJECT_PATH="${WORKDIR}/ProjectName"
ASSETS_PATH="Assets"
$UNITY_BIN -batchmode -quit \
-logFile export.log \
-projectPath $PROJECT_PATH \
-exportPackage $ASSETS_PATH $EXPORT_PATH
8) запустите созданный скрипт bash, чтобы получить сборку пакета. Все материалы из активов будут включены в проект XCode для вашего проекта Unity при его создании через Файл - > Параметры сборки в редакторе Unity. Вы можете использовать сгенерированный пакет для распространения кода среди других разработчиков, чтобы они могли просто включить вашу библиотеку в свои проекты Unity, дважды щелкнув файл пакета.
не забудьте выключить редактор Unity при запуске этого скрипта, иначе он может не создать пакет.
если у вас есть некоторые проблемы, и пакет не показывает, этот скрипт всегда выводит лог в экспорт.log
следующие шаги имеют смысл, только если вы хотите сделать проект Demo unity для своей библиотеки (хорошо для тестирования, по крайней мере)
9) вы можете поместить созданный проект Unity (ProjectName."единство") к Assets/MySDKDemo
так что у вас есть демо внутри вашего пакета.
10) создайте простой скрипт для вашей демо-сцены Unity3d по адресу Assets/MySDKDemo/MySDKDemo.cs
, например:
using UnityEngine;
using System;
using System.Collections;
public class MySDKDemo : MonoBehaviour
{
private GUIStyle labelStyle = new GUIStyle();
private float centerX = Screen.width / 2;
// Use this for initialization
void Start ()
{
labelStyle.fontSize = 24;
labelStyle.normal.textColor = Color.black;
labelStyle.alignment = TextAnchor.MiddleCenter;
}
void OnGUI ()
{
GUI.Label(new Rect(centerX - 200, 20, 400, 35), "MySDK Demo", labelStyle);
if (GUI.Button(new Rect(centerX - 75, 80, 150, 35), "DoStuff"))
{
MySDK.FooBarCFunction();
}
}
}
11) перейдите в редактор Unity. Найдите "основную камеру" в левой боковой панели в Unity Editor, выберите его и в нижней части панели инспектора (правая боковая панель) нажмите на AddComponent, выберите Scripts -> MySDKDemo script
12) создайте проект XCode и запустите его на устройстве.
несколько заметок
1) Плагины не работают в редакторе Unity, просто потому, что они не скомпилированы в режиме реального времени, ну, не уверен, но, вероятно, пока вы не используете C# в своих плагинах, вероятно, C# материал связывается immidiately и работает в Редакторе окружающая среда.
2) этот пост не охватывает маршалинг или управление данными/памятью между собственным управляемым кодом, поскольку он очень хорошо документирован.
взаимодействие с родными библиотеками @ Mono project
3) обратные вызовы с C# на C могут быть переданы с помощью делегатов C#, на стороне C вы используете стандартные объявления функций, на стороне C# вы объявляете делегатов с той же подписью. Кажется, что булевы, целые числа и строки (C: char*) являются выстроены безупречно (я не говорю о политике управления памятью и кто отвечает за освобождение памяти или политики возврата значения).
однако он не будет работать на iOS из-за ограничений платформы, но обратные вызовы C#-to-C все еще могут быть реализованы с помощью MonoPInvokeCallbackAttribute, полезных ссылок на эту тему:
на самом деле в Unity 4 нет AOT.MonoPInvokeCallbackAttribute
уже реализован, он ограничен статическими делегатами, которые могут быть переданы неуправляемому коду, но все же лучше, чем ничего.
4) Есть способ получить Unity RootViewController с помощью
Я написал сообщение о том, как создать плагин iOS для unity. Вы можете проверить это здесь. Надеюсь, это поможет. Спасибо.