2012-03-25 12 views
3

Ich bin auf Mac.Wie rufe ich nicht verwaltete Funktionen in C von Unity3d auf, wenn ich kein .bundle habe? (Mac)

Ich habe eine Reihe von c-Quellcode (. C & & .h).

Ich habe eine statische Bibliothek (.a).

Ich möchte diese .a Bibliothek aus Unity verwenden.

Ich schaute in der Unity-Dokumentation für Plug-Ins (http://unity3d.com/support/documentation/Manual/Plugins.html), die für PC und Mac Stand Alones, scheint .bunlde Dateien zu sein einzige Lösung. Alle Beispiel-Plug-in-Projekte, die Unity gibt, haben .bundle-Plugins.

Aber ich habe prime31 Plugins mit .a Bibliothek in Unity gesehen!

Jeder hat eine Ahnung, wie sie das gemacht haben?

Hier ist alles, was ich von der Analyse prime31 Plugin kann sagen:

(1) setzen sie ihre .a Bibliothek im Editor-Ordner des Unity

(2) sie eine C# Skript haben, die eine Menge enthält [ DllImport ("__Internal")]

ich habe versucht, das gleiche zu tun:

(1) ich eine einfache hello_world.c in Xcode geschrieben und eine .a Bibliothek gebaut. Ich legte den libhelloworld.a im Asset/Herausgeber

(2) Ich habe dann ein C# Skript geschrieben, das wie folgt aussieht:

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

public class testlib : MonoBehaviour { 
    [DllImport ("libhelloworld")] 
    static public extern System.String helloworld(); 
} 

(3) Dann habe ich ein Testskript:

using UnityEngine; 
using System.Collections; 

public class test : MonoBehaviour { 

    // Use this for initialization 
    void Start() { 
     print(testlib.helloworld()); 
    } 


} 

(4) Dadurch erhalte ich einen Laufzeitfehler:

DllNotFoundException: libhelloworld 
test.Start() (at Assets/Script/test.cs:8) 

vielen, vielen dank!

PS: Falls einige von Ihnen sich fragen, warum ich den Quellcode habe, aber nicht das Bündel. Ich versuche ein Bündel aus diesen .c und .h zu bauen, ist aber noch nicht gelungen. Der Quellcode wurde mit make-Tools kompiliert, aber ich weiß nichts anderes, das ein Bündel außer Xcode erstellen könnte. Ich denke, ich muss Xcode verwenden, um mein Bündel zu erstellen. Mein Problem ist, wenn ich versuchte, es mit Xcode zu bauen, bekomme ich Millionen von Fehlern, die sagen, dass ich doppelte Haupteinträge habe. Ich überprüfte den Quellcode und fand heraus, dass es doppelte main() s gibt, weil der Quellcode viele Hilfsprogramme enthält. Ich habe versucht, diese Dienstprogramme zu löschen, aber der gleiche Fehler geht nicht weg ...

Ich plane, diese Frage woanders zu stellen, weil dies nicht sehr Einheit-bezogen scheint. Aber wenn jemand hier die Antwort kennt, zögere bitte nicht - lass es mich wissen!

+0

Funktioniert das in Unity-Indie? –

Antwort

2

Okay, ich habe eine E-Mail von den prim31 Leuten bekommen. Es ist unmöglich, das zu tun.

Unity erstellt kein Xcode-Projekt für OSX, daher können Sie keine statische Bibliothek verknüpfen. Unity baut ein Xcode-Projekt für iOS, so können die prim31-Entwickler die .a-Bibliothek benutzen (in Xcode, nicht in Unity)

Zusammengefasst, um unmanaged Code in Unity unter MacOS zu verwenden, ist der einzig richtige Weg Erstellen Sie ein Paket aus Ihrem Quellcode und importieren Sie es anschließend in Unity. Genau wie ihre Dokumentation gesagt hat!

Ich denke, ich werde versuchen, ein Bündel aus dem Quellcode zu bauen oder versuchen, ein Bündel aus der .a Bibliothek zu bauen, die ich jetzt in der Lage bin zu bauen, obwohl Mac OS-Dokumentation sagt, es ist sinnlos:

Note: Some Xcode targets (such as shell tools and static libraries) do not result in the creation of a bundle or package. This is normal and there is no need to create bundles specifically for these target types. The resulting binaries generated for those targets are intended to be used as is.

ich kann eine andere Frage posten und wenn diese Frage beantwortet wurde, werde ich hier einen Link enthält ...

Okay ich zurück komme zu bearbeiten:

Schließlich baute ich ein Bündel aus einer .a statischen Bibliothek und war kann Funktionen der Bibliothek von Unity aufrufen. Hier ist, wie ich gemacht habe: How to organize C source file previously compiled by GCC Make and build them into an Xcode bundle? I have a Duplicate Symbol _main Error

0

Ich benutze meine eigene Bibliothek für ein iOS-Projekt und es funktioniert gut. Ich verwende nicht den Unity3D-Mechanismus zum Kopieren aus dem Plugins-Ordner, sondern setze ihn vollständig in XCode ein. Versuchen Sie in dem obigen HelloWorld-Beispiel [DllImport("__Internal")].

Folgen Sie den Links in meiner vorherigen Antwort How to use an xcode game on unity3d Blick auf meine Blog-Posting, es befasst sich genau mit diesem Problem.

+0

Hallo, danke für deine Antwort, aber ich entwickle nicht für iOS. Ich denke, für OSX funktionieren die Dinge anders. – CherryQu

+0

Ich habe mir die Referenz angesehen, die Sie in Ihrer vorherigen Antwort empfohlen haben (http://www.reigndesign.com/blog/unity-native-plugin-s-x/#more-2824). Ich denke mein Problem unterscheidet sich von ihrem Problem darin, dass ich mein Bundle noch nicht aufbauen kann. Mein nicht gemanagter Quellcode ist so umfangreich und komplex und enthält doppelte Haupteinträge, die ich nicht in der Lage gefunden habe, ein Bundle in Xcode zu erstellen. Deshalb wollte ich versuchen, eine .a-Bibliothek in Unity zu verwenden - ich kann einfach eine .a-Bibliothek aus meinem Quellcode erstellen. – CherryQu