Как построить плагин Unity3d для iOS
У меня есть очень маленькая библиотека Objective-C, построенная для iOS, и я хочу экспортировать ее в Unity. Я понимаю основной процесс написания оболочки csharp, которая маршалирует все вызовы в родную библиотеку, но я совершенно не знаю, с чего начать. Может ли кто - нибудь объяснить шаг за шагом, как создать пакет unity с моей библиотекой, чтобы я мог также распространять его другим разработчикам.
документация Unity3d довольно коротка и не объясняет что угодно.
спасибо.
2 ответов:
хорошо, после нескольких дней игры с Unity3d на Mac я, наконец, понял это. Весь код в этом руководстве является фиктивным. Я написал этот материал за 15 минут или около того, так что не беспокойтесь об ошибках и опечатках.
1) Откройте Unity, создайте новый проект (File -> New Project) и сохраните его где-нибудь
2) при создании проекта он имеет следующую структуру:
ProjectName/Assets(это то, что вам нужно)ProjectName/Library(Nevermind что там)ProjectName/ProjectSettings(тебе все равно)ProjectName/ProjectName.sln(проект MonoDevelop выступает)3) Перейти к
ProjectName/Assetsи создать следующие папки:Plugins/iOS, так что в конце концов вы будете иметь структуру папок, как это:ProjectName/Assets/Plugins/iOS4) Поместите свою скомпилированную библиотеку (.а) файл и необходимые заголовки внутри
ProjectName/Assets/Plugins/iOSили скопируйте исходный код вашей библиотеки там (. mm,.ч. ,м и др..). Помните, что обычно вы можете получить доступ только к C-функциям из C#, поэтому вам придется каким-то образом обернуть свой материал Objective-C в C-код, в моем случае все объекты Objective-C были реализованы в виде Синглтона, поэтому было нетрудно сделать оболочку c-стиля, например:CWrapper.h:
extern "C" void MySDKFooBarCFunction();CWrapper.mm
#import "CWrapper.h" #import "MyObjectiveCLibrary.h" // your actual iOS library header void MySDKFooBarCFunction() { [MyObjectiveCLibrary doSomeStuff]; }5) Затем перейдите к
ProjectName/Assetsи создайте папку для класса (ов) оболочки CSharp, назовите ее как хотите, например:ProjectName/Assets/MySDK6) Внутри из папки 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_PATH8) запустите созданный сценарий bash, чтобы получить сборку пакета. Все материалы из активов будут включены в проект XCode для вашего проекта Unity при его создании с помощью Файл - > Параметры сборки в редакторе Unity. Вы можете использовать сгенерированный пакет для распространения вашего кода другим разработчикам, чтобы они могли просто включить вашу библиотеку в свои проекты Unity, дважды щелкнув файл пакета.
не забудьте выключить Unity Editor при запуске этого скрипта, иначе он может не построить пакет.
если у вас есть некоторые проблемы и пакет не отображается, этот скрипт всегда печатает журнал экспорт.журнал
следующие шаги имеют смысл только в том случае, если вы хотите сделать демо-проект unity для своей библиотеки (хорошо для тестирования по крайней мере)
9) вы можете поместить созданный проект Unity (имя проекта."единство") к
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, выберите его и в нижней части панели инспектора (правая боковая панель) нажмите на AddComponent, выберите Scripts -> MySDKDemo script
12) создайте проект XCode и запустите его на устройстве.
несколько заметок
1) Плагины не работают в редакторе Unity, просто потому, что они не компилируются в режиме реального времени, ну, не уверен, но, вероятно, пока вы не используете C# в своих плагинах, вероятно, C# материал связывается немедленно и работает в Редакторе окружающая среда.
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. Вы можете проверить это здесь. Надеюсь, это поможет. Спасибо.
Comments