Загрузка нативной C ++ dll, сгенерированной из MATLAB (Simulink) в Unity3d

Я разработчик игр, работаю над серьезной игрой. У меня есть некоторое моделирование данных в результате модели MATLAB (Simulink), которая была создана кем-то, кто покинул команду сейчас. Все это моделирование данных генерирует полезные данные и позволяет мне запрашивать и проверять переменные при необходимости. Мне нужно было создать игру, используя эту модель. Поэтому я использовал генератор кода Simulink для генерации кода для моей модели на C ++. Это родной C ++ и процедурный. Объем кода для меня велик, чтобы переписать его, поэтому я воздерживаюсь от этого. Мне нужно использовать этот код в Unity3d, движке, на котором я разрабатываю игру.

Короче. Мне нужно загрузить родную C ++ DLL (сгенерированную Simulink) в Unity3d.

Что я пробовал:

  1. Я попытался использовать родной API плагина Unity3d. У меня есть про-версия, и она, похоже, не обнаруживает dll, а просто выдает исключения. Я использую ключевое слово extern, чтобы сделать необходимые переменные общедоступными, но все же не повезло.

  2. Я пытался следовать этому уроку (http://blogs.abo.fi/alexeevpetr/2011/11/18/simplified-building-simulink-generated-c-code-in-visual-studio/), но он выдает ошибки и не создает, возможно, это из-за версии MATLAB.

  3. Я также подумал об использовании обертки, однако это означало бы, что я снова переписываю большую часть кода.

3

Решение

Я никогда не использовал нативные библиотеки DLL в Unity, но вы всегда можете попробовать один из нескольких методов связывания кода для вызова кода C ++ из C #, я полагаю. Так как насчет написания оболочки C ++ / CLI? Это не заставит вас ничего переписывать. Он предоставляет управляемый доступ к вашему неуправляемому коду, и в любом случае это полезный метод для изучения.

1

Другие решения

Вы должны иметь возможность загрузить свой собственный плагин в Unity3D, даже если для этого требуются библиотеки MATLAB (просто убедитесь, что они также находятся в каталоге плагинов). Я недавно ответил на аналогичный вопрос по этому поводу, так как это может быть довольно сложно получить право. Я бы посоветовал вам проверить это ВОТ, и измените ваш вопрос с конкретными ошибками и проблемами, которые вы пытаетесь загрузить нативный код.

1

Из Geomorillo на форумах U3d:

Прежде всего,
1) установить Visual C ++ Studio Express 2010, нам нужен sdk из .NET для компиляции (ПРИМЕЧАНИЕ: может быть, вместо компиляции вы можете использовать Visual C # express, потому что для этого требуется .NET sdk, но не уверен)
2) Вы должны настроить matlab с помощью команды «mbuild — setup» и выбрать компилятор Microsoft Visual C ++ Studio Express 2010
3) у вас должна быть функция, уже созданная и сохраненная в «.m» файл, который называется mycos.m, вот его содержимое:

функция а = микос (б)
а = cosd (б);
конец

где «a» — это возвращаемый параметр, а «b» — входной параметр, важно знать, сколько возвращаемых параметров у вас есть в этом случае 1 (см. шаг 12).

4) используйте команду «deploytool», должно открыться окно, назовите проект «simplelibs», который должно сделать любое имя, выберите местоположение c: \ matlab \ simplelib, выберите тип .NET Assembly, OK
5) После этого в правой части окна появятся новые опции в виде вкладок, вкладок «Сборка» и «Пакет».
На вкладке Build вы должны добавить класс с опцией Add class, он будет автоматически назван Class1, но я изменил его на Myclass, здесь вы можете добавить свои функции в ваш класс, используя Add files, я добавил mycos.m
6) Вы должны были заметить 3 кнопки рядом с названием проекта, нажать 3-ю кнопку в форме гайки, перейти в настройки, должно появиться новое окно, перейти на вкладку .NET и в Microsoft Framework выбрать 3.5, чтобы убедиться, что вы используете .net 3.5 для компиляции (требуется для unity3d)
7) мы готовы к компиляции, сделайте это с 1-й кнопкой, это должно занять некоторое время ….
8) После компиляции без ошибок файлы находятся в папке dist внутри пути вашего проекта, откройте Unity и создайте новый проект. скопируйте 2 dll в корень внутри единства.
9) Найдите каталог «dotnetbuilder» внутри «c /…/ matlab /../ toolbox», скопируйте или перетащите все его содержимое в ваш проект Unity.

10) Нам нужен dll MWArray.dll, потому что при компиляции наших библиотек matlab оборачивает нашу функцию в массив и использует ее методы для доступа к нашим функциям. Я не собираюсь объяснять это, пожалуйста, Google, обычно ее можно найти внутри установки matlab dotnetbuilder /bin/win32/2.0/ но так как вы скопировали его в unity, не копируйте снова, при использовании этого mwarray я обнаружил ошибку с monodevelop в этой библиотеке, поэтому мне пришлось декомпилировать ее и исправить ошибку, я должен перекомпилировать ее снова: Вы можете скачать этот файл здесь https://dl.dropbox.com/u/6716823/MWArray.dll и замените тот, который был найден в проекте Unity (не заменяйте оригинал из директории Matlab)

11) создать сценарий c # и назначить его основной камере или любому объекту в сцене
вот его содержание

используя UnityEngine;
использование System.Collections;
используя Систему;
использование MathWorks.MATLAB.NET.Arrays; // импорт из MWArray.dll
используя simplelib;

открытый класс myMatlab: MonoBehaviour {

void Start () {
simplelib.Myclass g = new simplelib.Myclass ();
Debug.log (g.mycos (1,95) .GetValue (0));
}
}

12) г.микос (1,95); // запомни, когда я сказал, что это оборачивается твоей функцией !!! первый параметр — это число параметров, возвращаемых нашей функцией matlab, в данном случае 1, 95 — это параметр, который мы хотим отправить нашей функции, мы получаем массив, к которому мы можем получить доступ с помощью .GetValue (0)

13) играй и наслаждайся

Это пример с простой функцией, поэтому я не знаю, будет ли она работать с более сложной программой.

я надеюсь, что это работает для вас

1
По вопросам рекламы [email protected]