原文 链接:https://www.jianshu.com/p/0c61444c9b28
- 方法1
UnitySendMessage("[gameobject_name]", "[method_name]", "[string_param]");
这个方法要求场景中有个特定名称的GameObject对象,同时该对象上应该挂载某个MonoBehaviour
脚本,在该脚本中包含有一个特定的方法(如下所示),当然如果该对象上挂载了多个脚本,并且这些脚本中都有该方法,那么这些方法都会被调用的!
public void method_name(string str) {
// some logici here
}
- 方法二, 使用
MonoPInvokeCallback
从C#层向C层注册回调函数, 具体操作流程如下:
C#层的代码如下:
private delegate void OnViewClosed(int result, string msg); //
[MonoPInvokeCallback(OnViewClosed)]
static void CalledByNativeC(int result, string msg)
{
// some logic here
}
// ...
#if UNITY_IPHONE || UNITY_IOS
[DllImport("__Internal")]
private static extern void SetOnViewClosed(OnViewClosed event);
#endif
// ...
SetOnViewClosed(CalledByNativeC); // 把C#中的回调函数传给C
MonoPInvokeCallbackAttribute.cs
的代码内容如下:
using System;
public sealed class MonoPInvokeCallbackAttribute : Attribute
{
public MonoPInvokeCallbackAttribute(Type type)
{
}
}
C层的代码如下:
#include <stdlib.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef void (*OnViewClosed)(int result, const char* msg); // 定义函数指针
static OnViewClosed s_calledFromCSharp = NULL;
// 接受C#层传过来的函数指针
void SetOnViewClosed(OnViewClosed viewClosed)
{
s_calledFromCSharp = viewClosed;
}
// ......
// 某处C/Objecive-C触发该回调函数的代码如下
if (s_calledFromCSharp != NULL)
s_calledFromCSharp(result, msg);
//......
#ifdef __cplusplus
}
#endif