Unity3d与iOS之间的相互调用
程序员文章站
2022-03-03 22:05:37
Unity3d与iOS的交互实现原理ios开发使用的语言是objective-c(也称object-c),u3d中使用DllImport的Attribute,以非托管方式将库中的方法导出到C#中进行使用。而传入"__Internal"则是表示这个是一个静态库或者是一个内部方法。通过上面的声明,这个方法就可以在C#里面进行调用了。 using UnityEngine; using System.Collections; using System.Runtime.InteropServi...
Unity3d与iOS的交互
-
U3D调用IOS
1.1 实现原理
ios开发使用的语言是objective-c(也称object-c),u3d中使用DllImport的Attribute,以非托管方式将库中 的方法导出到C#中进行使用。而传入"__Internal"则是表示这个是一个静态库或者是一个内部方法。通过上面的声明,这个方法就可以在C#里面进行调用了。using UnityEngine; using System.Collections; using System.Runtime.InteropServices; //DllImport的命名空间 public class CallAppIOS { /* Interface to native implementation */ [DllImport("__Internal")] private static extern string _getAppendString(string str1, string str2); //IOS中方法 public static string GetAppendString(string str1, string str2) { return _getAppendString(str1, str2); } }
1.2 编写IOS文件
创建iOSUtilUnity3dBridge.h和iOSUtilUnity3dBridge.mm两个文件,放到Plugins->IOS文件夹下(string 对应const char*)#import <Foundation/Foundation.h> @interface iOSUtilUnity3dBridge : NSObject extern "C" { const char* _getAppendString(const char *str1, const char *str2); } @end
#import <Foundation/Foundation.h> #import "iOSUtilUnity3dBridge.h" extern "C" { //NSString 转char* char* _MakeStringCopy(const char* str){ if(str == NULL){return NULL;} char* res = (char*)malloc(strlen(str)+1); strcpy(res, str); return res; } const char* _getAppendString(const char *str1, const char *str2) { NSString *string1 = [[NSString alloc] initWithUTF8String:str1]; NSString *string2 = [[NSString alloc] initWithUTF8String:str2]; NSString *string3 = [NSString stringWithFormat:@"%@/%@", string1, string2]; return _MakeStringCopy([string3 UTF8String]); //注意返回值 } }
1.3 C#中调用
void Start () { #if UNITY_IOS && !UNITY_EDITOR string str = CallAppIOS.GetAppendString("Hello", "Wrold"); Debug.Log(str); #endif }
-
IOS调用U3D
2.1 iOS中调用U3D的接口,与Android相似,通过UnitySendMessage方法来调用Unity所定义的方法const char* _getAppendString(const char *str1, const char *str2) { NSString *string1 = [[NSString alloc] initWithUTF8String:str1]; NSString *string2 = [[NSString alloc] initWithUTF8String:str2]; NSString *string3 = [NSString stringWithFormat:@"%@/%@", string1, string2]; //Main Camera 场景中接受消息的Object名字, ReceiveiOS 方法名, string3.UTF8String参数 UnitySendMessage("Main Camera", "ReceiveiOS", string3.UTF8String); //调用 return _MakeStringCopy([string3 UTF8String]); //注意返回值 }
2.2 编写C#代码,挂载到Main Camera上
public void ReceiveiOS(string str) { Debug.Log("ReceiveiOS " + str); }
2.3 还有一种方法是通过入口参数,传入一个U3D的非托管方法,然后调用该方法,这里不做详解。
本文地址:https://blog.csdn.net/wangningzk123/article/details/107359522