2016-10-18 7 views
3

Also, ich versuche eine App in Unity zu bauen, die molekulare Visualisierung erfordert. Es gibt einige Bibliotheken, die verwendet werden können, um Eigenschaften von Molekülen abzuschätzen, Moleküle zu lesen, Moleküle zu schreiben usw. Aber es gibt nur wenige für die Visualisierung. Ich habe this one, called hyperballs gefunden und es wird erfolgreich in einem Unity-Projekt für molekulare Visualisierung namens UnityMol verwendet. Ich habe bereits OpenBabel dll zu dem Projekt hinzugefügt, ich wünschte, ich könnte Hyperballs auf die gleiche oder eine andere Weise zum Unity-Projekt hinzufügen.Wie fügt man dem Unity-Projekt einfach C++ - Code hinzu?

Das Problem ist, dass ich keine Erfahrung mit der Erstellung von DLLs (keine Erfahrung, um ehrlich zu sein).

Auch ich weiß nicht, wie Hyperballs C++ - Dateien innerhalb des Unity-Projekts zu verwenden. Wenn ich an eine Analogie zu OpenBabel denke, dachte ich, wenn ich eine einfache Möglichkeit finde, eine dll aus C++ Quellcode auf einem Mac zu erstellen, könnte ich einfach dll zu Assets hinzufügen und Codieren genießen, aber es ist nicht so einfach, wie ich dachte .

Antwort

3

Sie müssen den C++ - Code in C-Funktionen einfügen und sie dann über P/Invoke verwenden.

Zum Beispiel

MyPlugin.cpp

#define MY_API extern "C" 

class Context 
{ 
public: 
    const int version = 12345; 
}; 

MY_API int GetVersion(const Context* _pContext) 
{ 
    if (_pContext == nullptr) 
    { 
     return 0; 
    } 
    return _pContext->version; 
} 

MY_API Context* CreateContext() 
{ 
    return new Context(); 
} 

MY_API void DestroyContext(const Context* _pContext) 
{ 
    if (_pContext != nullptr) 
    { 
     delete _pContext; 
    } 
} 

Dann den obigen Code in *.dll für Windows kompilieren, *.so für Android, Cocoa Touch Static Library für iOS und bundle für Mac OS.

Usage in C#:

MyPlugin.cs

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

public class MyAPI : MonoBehaviour 
{ 
#if UNITY_EDITOR || UNITY_STANDALONE 
    const string dllname = "MyPlugin"; 
#elif UNITY_IOS 
    const string dllname = "__Internal"; 
#endif 

    [DllImport(dllname, CallingConvention = CallingConvention.Cdecl)] 
    private static extern IntPtr CreateContext(); 

    [DllImport(dllname, CallingConvention = CallingConvention.Cdecl)] 
    private static extern int GetVersion(IntPtr _pContext); 

    [DllImport(dllname, CallingConvention = CallingConvention.Cdecl)] 
    private static extern void DestroyContext(IntPtr _pContext); 

    static MyAPI() 
    { 
     Debug.Log("Plugin name: " + dllname); 
    } 

    void Start() 
    { 
     var context = CreateContext(); 
     var version = GetVersion(context); 
     Debug.LogFormat("Version: {0}", version); 
     DestroyContext(context); 
    } 
} 

Referenzen:

  1. https://docs.unity3d.com/Manual/NativePlugins.html
  2. http://www.mono-project.com/docs/advanced/pinvoke/
+0

Danke. Alles ist sehr klar) Jetzt weiß ich was zu tun ist. –

Verwandte Themen