Обратный вызов из собственного кода
Unity iOS поддерживает ограниченную функциональность обратного вызова от основного к управляемому с помощью одного из следующих методов:
Используйте UnitySendMessage
UnitySendMessage выглядит так:
UnitySendMessage("GameObjectName1", "MethodName1", "Message to send");
Существуют три параметра:
- Имя цели GameObject
- Метод скрипта для вызова этого объекта
- Строка сообщения для передачи вызываемому методу
UnitySendMessage имеет следующие ограничения:
- Из собственного кода можно вызывать только методы скриптов, соответствующие следующей подписи:
void MethodName(string message);. - Вызовы
UnitySendMessageявляются асинхронными и имеют задержку в один кадр. - Если два или более GameObjects имеют одно и то же имя, это может вызвать конфликты при использовании
UnitySendMessage.
Использование делегатов
При работе с делегатами метод на стороне C# должен быть статическим и помеченным MonoPInvokeCallback атрибут.
Чтобы использовать делегатов:
- Передайте метод как делегат внешнего метода.
- Реализуйте метод extern в нативном коде как функцию, которая принимает указатель на функции с соответствующей подписью.
Указатель на функцию в нативном коде затем ссылается обратно на статический метод в C#.
Код C# для этого метода выглядит следующим образом:
delegate void MyFuncType();
[AOT.MonoPInvokeCallback(typeof(MyFuncType))]
static void MyFunction() { }
[DllImport ("__Internal")]
static extern void RegisterCallback(MyFuncType func);
Код на C, который принимает обратный вызов, выглядит следующим образом:
typedef void (*MyFuncType)();
void RegisterCallback(MyFuncType func) {}
Примечание: Убедитесь, что строковые значения, возвращаемые из основного метода, кодируются в UTF–8 и выделены на стеке.