Как Unity вызывает «update ()» в сценариях?

Я понимаю, что вы можете выставить свой код на C ++ на язык сценариев, например ChaiScript . Из этого вы можете вызвать код, который вы создали на C ++. Однако в Unity они имеют функции в скрипте, такие как Update(), которые вызываются. Другими словами, как мне вызвать функции скрипта из C ++?

3 голоса | спросил MrSnappingTurtle 23 PMpThu, 23 Apr 2015 17:18:21 +030018Thursday 2015, 17:18:21

2 ответа


0

Unity использует собственную систему обмена сообщениями для вызова таких методов, как «Обновление». Вы также можете использовать его, например, Component.SendMessage .

Я думаю, что базовая реализация системы сообщений использует некоторую форму отражения, чтобы определить, какие методы имеет класс и называть соответствующие.

( Это ответ сообщения объясняет это лучше )

ответил Mitchell 23 PMpThu, 23 Apr 2015 19:12:43 +030012Thursday 2015, 19:12:43
0

C++ и C# могут взаимодействовать довольно легко. (В практике проблемы C ++, связанные с изменением имени, часто вынуждают иметь промежуточный слой C)

Есть несколько ресурсов, которые вы можете посмотреть, например, Mono P /Invoke docs и unit docs на встроенных плагинах .

Вызов функции C# из C++ просто используется с помощью указателя функции (делегат C#) может быть настроен таким образом).


Что касается того, как обрабатывать обратные вызовы Unity, это другой вопрос. Я не знаю точной базовой реализации, но большинство MonoBehaviours перехватывает как Update не являются виртуальными | абстрактными методами и не реализуют никакого интерфейса.

Почему? Не уверен, я часто спрашивал себя, почему (честно говоря, я предпочитаю более явный подход, например, реализацию интерфейса, например ISerializationCallbackReceiver ).

О том, как происходит связывание между указателем функции и методом C #, вероятно, создается экземпляр делегата. Проблема действительно отличается от SendMessage и Update.

Я думаю, что Unity вынужден использовать Reflection для SendMessage , потому что метод имя известно только во время выполнения. Используйте его осторожно, потому что отражение действительно дорого.

Для других обновлений, запуска и т. д. проблема проще, потому что известно имя метода, подпись и целевой объект. Таким образом, дорогостоящий процесс связывания может использоваться только один раз при инициализации. Вот хорошая статья .

ответил Heisenbug 23 PMpThu, 23 Apr 2015 19:59:36 +030059Thursday 2015, 19:59:36

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132