Я разработчик игр, работаю над серьезной игрой. У меня есть некоторое моделирование данных в результате модели MATLAB (Simulink), которая была создана кем-то, кто покинул команду сейчас. Все это моделирование данных генерирует полезные данные и позволяет мне запрашивать и проверять переменные при необходимости. Мне нужно было создать игру, используя эту модель. Поэтому я использовал генератор кода Simulink для генерации кода для моей модели на C ++. Это родной C ++ и процедурный. Объем кода для меня велик, чтобы переписать его, поэтому я воздерживаюсь от этого. Мне нужно использовать этот код в Unity3d, движке, на котором я разрабатываю игру.
Короче. Мне нужно загрузить родную C ++ DLL (сгенерированную Simulink) в Unity3d.
Что я пробовал:
Я попытался использовать родной API плагина Unity3d. У меня есть про-версия, и она, похоже, не обнаруживает dll, а просто выдает исключения. Я использую ключевое слово extern, чтобы сделать необходимые переменные общедоступными, но все же не повезло.
Я пытался следовать этому уроку (http://blogs.abo.fi/alexeevpetr/2011/11/18/simplified-building-simulink-generated-c-code-in-visual-studio/), но он выдает ошибки и не создает, возможно, это из-за версии MATLAB.
Я также подумал об использовании обертки, однако это означало бы, что я снова переписываю большую часть кода.
Я никогда не использовал нативные библиотеки DLL в Unity, но вы всегда можете попробовать один из нескольких методов связывания кода для вызова кода C ++ из C #, я полагаю. Так как насчет написания оболочки C ++ / CLI? Это не заставит вас ничего переписывать. Он предоставляет управляемый доступ к вашему неуправляемому коду, и в любом случае это полезный метод для изучения.
Вы должны иметь возможность загрузить свой собственный плагин в Unity3D, даже если для этого требуются библиотеки MATLAB (просто убедитесь, что они также находятся в каталоге плагинов). Я недавно ответил на аналогичный вопрос по этому поводу, так как это может быть довольно сложно получить право. Я бы посоветовал вам проверить это ВОТ, и измените ваш вопрос с конкретными ошибками и проблемами, которые вы пытаетесь загрузить нативный код.
Из 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) играй и наслаждайся
Это пример с простой функцией, поэтому я не знаю, будет ли она работать с более сложной программой.
я надеюсь, что это работает для вас