Как мне вызвать неуправляемые функции в C из Unity3d, если у меня нет .bundle?(Mac) - PullRequest
3 голосов
/ 26 марта 2012

Я на Mac.

У меня есть куча исходного кода c (.c && .h).

У меня есть статическая библиотека (.a).

Я хочу использовать эту библиотеку .a изнутри Unity.

Я изучил документацию Unity для плагинов (http://unity3d.com/support/documentation/Manual/Plugins.html),, в которой говорится, что для автономных ПК и Mac файлы .bunlde кажутся единственным решением. Все примеры проектов плагинов, которые предоставляет Unity, имеют плагины .bundle.

Но я видел плагины prime31, использующие библиотеку .a в Unity!

Кто-нибудь знает, как они это сделали?

Вот что я могу сказать из анализа плагина prime31:

(1) они помещают свою библиотеку .a в папку редактора Unity

(2) у них есть сценарий C #, который содержит множество [DllImport ("__Internal")]

Я пытался сделать то же самое:

(1) Я написал простой файл hello_world.c в Xcode и создал библиотеку .a. Я помещаю libhelloworld.a в Актив / Редактор

(2) Затем я написал скрипт на C #, который выглядит следующим образом:

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

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

(3) Затем я написал тестовый скрипт:

using UnityEngine;
using System.Collections;

public class test : MonoBehaviour {

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


}

(4) При этом я получаю ошибку времени выполнения:

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

Большое, большое спасибо!

PS: В случае, если некоторые из вас задаются вопросом, почему у меня есть исходный код, но нет пакета. Я пытаюсь собрать пакет из этих .c и .h, но пока не получилось. Исходный код был скомпилирован с помощью инструментов make, но я не знаю ничего другого, что могло бы собрать пакет, кроме Xcode. Так что я думаю, что мне нужно использовать Xcode для сборки своего пакета. Моя проблема в том, что когда я пытался создать его с помощью XCode, я получаю миллионы ошибок, говорящих о том, что у меня есть дубликаты основных записей. Я проверил исходный код и обнаружил, что он имеет дубликаты main (), потому что в исходном коде есть много утилит, которые поставляются с ним. Я пытался удалить эти утилиты, но та же ошибка не исчезла ...

Я планирую задать этот вопрос где-нибудь еще, потому что это не похоже на Unity. Но если кто-то здесь знает ответ, пожалуйста, не стесняйтесь - дайте мне знать!

Ответы [ 2 ]

3 голосов
/ 27 марта 2012

Хорошо, я получил электронное письмо от Prime31. Это невозможно сделать.

Unity не создает проект Xcode для OSX, поэтому вы не можете связать статическую библиотеку. Unity создает проект Xcode для iOS, поэтому разработчики prime31 могут использовать библиотеку .a (в Xcode, а не в Unity)

Подводя итог, можно сказать, что для использования неуправляемого кода в Unity на MacOS единственный правильный способ - создать пакет из исходного кода и затем импортировать его в Unity. Как сказано в их документации!

Я думаю, что я попытаюсь собрать пакет из исходного кода или попытаться создать пакет из библиотеки .a, которую я теперь могу собрать, хотя в документации Mac OS говорится, что это бессмысленно:

Примечание: некоторые цели XCode (такие как инструменты оболочки и статические библиотеки) делают не приводит к созданию пакета или пакета. Это нормально и нет необходимости создавать пакеты специально для этих целей типы. Полученные двоичные файлы, сгенерированные для этих целей, предназначены использоваться как есть.

Я могу опубликовать другой вопрос, и если на этот вопрос ответят, я добавлю сюда ссылку ...

Хорошо, я вернусь к редактированию:

Наконец, я собрал пакет из статической библиотеки .a и смог вызывать функции библиотеки из Unity. Вот как я это сделал: Как организовать исходный файл C, предварительно скомпилированный GCC Make, и собрать их в пакет Xcode? У меня есть повторяющийся символ _основная ошибка

0 голосов
/ 26 марта 2012

Я использую свою собственную библиотеку для проекта iOS, и она отлично работает. Я не использую механизм копирования Unity3D из папки плагинов, но полностью настроил его в XCode. В приведенном выше примере HelloWorld попробуйте [DllImport("__Internal")].

Перейдите по ссылкам в моем предыдущем ответе Как использовать игру xcode на unity3d Посмотрите на мое сообщение в блоге, оно касается именно этой проблемы.

...