unity para games ios objective-c unity3d

para - unity publish ios



Cómo construir el complemento Unity3d para iOS (2)

De acuerdo, después de jugar unos días con Unity3d en Mac, finalmente lo descubrí. Todo el código en esta guía es ficticio. He escrito esto en 15 minutos más o menos, así que no te molesten los errores y los errores tipográficos.

1) Abra Unity, cree un nuevo proyecto (Archivo -> Nuevo proyecto) y guárdelo en algún lugar

2) Cuando se genera el proyecto, tiene la siguiente estructura:

  • ProjectName/Assets (Eso es lo que necesita)
  • ProjectName/Library (No importa lo que hay allí)
  • ProjectName/ProjectSettings (No te importa)
  • ProjectName/ProjectName.sln (proyecto MonoDevelop)

3) Vaya a ProjectName/Assets y cree las siguientes carpetas: Plugins/iOS , así que al final tendrá una estructura de carpetas como esta: ProjectName/Assets/Plugins/iOS

4) Coloque su archivo de biblioteca compilada (.a) y los encabezados necesarios dentro de ProjectName/Assets/Plugins/iOS o copie el código fuente de su biblioteca allí (.mm, .h, .m, etc.). Recuerda, normalmente solo puedes acceder a C-funciones desde C #, así que tendrás que envolver tus objetos de Objective-C en C-code de alguna manera, en mi caso todos los objetos de Objective-C fueron implementados en forma de Singleton por lo que no fue Es difícil hacer una envoltura estilo C, por ejemplo:

CWrapper.h :

extern "C" void MySDKFooBarCFunction();

CWrapper.mm

#import "CWrapper.h" #import "MyObjectiveCLibrary.h" // your actual iOS library header void MySDKFooBarCFunction() { [MyObjectiveCLibrary doSomeStuff]; }

5) A continuación, vaya a ProjectName/Assets y cree una carpeta para CSharp wrapper class (es), llámela como desee, por ejemplo: ProjectName/Assets/MySDK

6) Dentro de la carpeta MySDK cree el archivo MySDK.cs, el ejemplo ficticio de C # wrapper se vería así:

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) Cree un script de shell para empaquetar este material en .unitypackage y .unitypackage junto a la carpeta de su proyecto (no dentro). Ajuste las variables EXPORT_PATH y PROJECT_PATH en el script para sus necesidades.

#!/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) Ejecute el script bash creado para obtener la compilación de su paquete. Todo el contenido de los activos se incluirá en el proyecto XCode para su proyecto Unity cuando lo genere a través de Archivo -> Configuraciones de compilación en Unity Editor. Puede usar el paquete generado para distribuir su código a otros desarrolladores para que puedan simplemente incluir su biblioteca en sus proyectos de Unity haciendo doble clic en el archivo del paquete.

No olvide cerrar el Editor de Unity cuando ejecute este script, de lo contrario, puede fallar la creación de un paquete.

Si tiene algunos problemas y el paquete no aparece, este script siempre imprime el registro en export.log

Los siguientes pasos tienen sentido solo si desea hacer un proyecto de demostración de unidad para su biblioteca (bueno para las pruebas al menos)

9) Puede poner el proyecto creado de Unity (ProjectName.unity) en Assets/MySDKDemo para que tenga una demostración dentro de su paquete.

10) Cree un script simple para su escena Demo Unity3d en Assets/MySDKDemo/MySDKDemo.cs , por ejemplo:

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) Ir al Editor de Unity. Busque la "Cámara principal" en la barra lateral izquierda en Unity Editor, selecciónela y en la parte inferior del panel Inspector (barra lateral derecha) haga clic en Agregar componente, seleccione Secuencias de comandos -> secuencia de comandos MySDKDemo

12) Cree el proyecto XCode y ejecútelo en el dispositivo.

Pocas notas

1) Los complementos no funcionan en Unity Editor, simplemente porque no están compilados en tiempo real, bueno, no estoy seguro, pero probablemente hasta que use C # en sus complementos, probablemente C # se vincule inmediatamente y funcione en el entorno Editor.

2) Esta publicación no cubre el marshaling ni la administración de datos / memoria entre el código administrado nativo <->, ya que está muy bien documentado.

Interopera con el proyecto Native Libraries @ Mono

3) Las rellamadas de C # a C se pueden pasar usando delegados C #, en el lado C se usan declaraciones de funciones estándar, en el lado C # se declaran delegados con la misma firma. Parece que booleanos, enteros y cadenas (C: char *) se organizan sin problemas (no hablo de políticas de administración de memoria y quién es el responsable de liberar la memoria o devolver las políticas de valor).

Sin embargo, no funcionará en las compilaciones de iOS listas para usar debido a las limitaciones de la plataforma, pero las devoluciones de llamadas de C # a C aún pueden implementarse usando MonoPInvokeCallbackAttribute, enlaces útiles sobre este tema:

En realidad, en Unity 4 ya está implementado AOT.MonoPInvokeCallbackAttribute , está limitado a delegados estáticos que se pueden pasar al código no administrado, pero aún mejor que nada.

4) Hay una manera de obtener Unity RootViewController usando la función UnityGetGLViewController . Simplemente declare esta función en su archivo de implementación, es decir:

extern UIViewController *UnityGetGLViewController();

Y use UnityGetGLViewController() siempre que necesite obtener acceso a RootViewController.

5) Hay mucha más información mágica y fea en los detalles, mantenga sus interfaces C tan simples como sea posible, de lo contrario la clasificación puede convertirse en su pesadilla y también tenga en cuenta que la administración no administrada es generalmente costosa.

6) Definitivamente usa algunos frameworks en su código nativo y no quiere problemas con el enlazador. Por ejemplo, si usa Keychain en su biblioteca, debe incluir Security.framework en el proyecto de Xcode.

Sugiero probar con XUPorter , ayuda a Unity a integrar cualquier dependencia adicional en el proyecto de Xcode.

¡Buena suerte!

Tengo una biblioteca Objective-C muy pequeña para iOS y quiero exportarla a Unity. Entiendo el proceso básico de escribir un contenedor csharp que coordina todas las invocaciones a la biblioteca nativa, pero no tengo ni idea de por dónde empezar. ¿Alguien podría explicar paso a paso cómo crear un paquete de unidad con mi biblioteca para poder distribuirlo a otros desarrolladores?

La documentación de Unity3d es bastante breve y no explica nada.

Gracias.


He escrito una publicación sobre cómo crear el complemento de iOS para la unidad. Puedes consultarlo here . Espero eso ayude. Gracias.