1. 在Assets/Plugins/iOS目录创建两个文件: Test.h, Test.m
2. 在Assets目录创建两个文件: Unity2iOS.cs, TestUnity2iOS.cs
@interface Test void _receive(char* str1, char* str2); @end
#import "Test.h" @interface Test () @end @implementation Test void _receive(char* s1, char* s2) { NSLog([NSString stringWithUTF8String:s1] ); } @end
using UnityEngine; using System.Collections; using System.Runtime.InteropServices; public static class Unity2iOS { [DllImport("__Internal")] private static extern void _receive(string s1, string s2); public static void Receive(string s1, string s2) { if (Application.platform == RuntimePlatform.IPhonePlayer) { _receive(s1, s2); } } }
using UnityEngine; using System.Collections; public class TestUnity2iOS : MonoBehaviour { void OnGUI() { if (GUI.Button(new Rect(0, 0, 200, 50), "Send")) { Unity2iOS.Receive("Hello", "Ihaiu"); } } }
void UnitySendMessage(const char* obj, const char* method, const char* msg);
这方法在发布后的xcode项目 Classes/Unity/UnityInterface.h里。用来调用Unity里的方法。
obj: 为场景中GameObject名称
method: 挂载在该GameObject里其中MonoBehaviour的一个方法名称
msg: 传递的参数
@interface Test void _receive(char* str1, char* str2); @end
#import "Test.h" @interface Test () @end @implementation Test void _receive(char* s1, char* s2) { NSLog([NSString stringWithUTF8String:s1] ); UnitySendMessage("Main Camera", "OnMsg", s2); } @end
using UnityEngine; using System.Collections; using System.Runtime.InteropServices; public static class Unity2iOS { [DllImport("__Internal")] private static extern void _receive(string s1, string s2); public static void Receive(string s1, string s2) { if (Application.platform == RuntimePlatform.IPhonePlayer) { _receive(s1, s2); } } }
using UnityEngine; using System.Collections; public class TestUnity2iOS : MonoBehaviour { private string msg; void OnGUI() { if (GUI.Button(new Rect(0, 0, 200, 50), "Send")) { Unity2iOS.Receive("Hello", "Ihaiu"); } if (!string.IsNullOrEmpty(msg)) { GUI.Label(new Rect(0, 50, 200, 50), msg); } } public void OnMsg(string msg) { this.msg = msg; } }
@interface Test int _add(int a, int b); char* _callback(char* s); @end
#import "Test.h" @interface Test () @end @implementation Test int _add(int a, int b) { int result = a + b; NSLog(@"%d + %d = %d", a, b, result); return result; } char* _callback(char* s) { return MakeStringCopy(s); } /** 拷贝字符串, 为了不内存泄漏 */ char* MakeStringCopy(const char* str) { if (str == NULL) { return NULL; } char* res = malloc(strlen(str) + 1); strcpy(res, str); return res; } @end
using UnityEngine; using System.Collections; using System.Runtime.InteropServices; public static class Unity2iOS { [DllImport("__Internal")] private static extern int _add(int a, int b); public static int Add(int a, int b) { if (Application.platform == RuntimePlatform.IPhonePlayer) { return _add(a, b); } return -1; } [DllImport("__Internal")] private static extern string _callback(string msg); public static string Callback(string msg) { if (Application.platform == RuntimePlatform.IPhonePlayer) { return _callback(msg); } return null; } }
using UnityEngine; using System.Collections; public class TestUnity2iOS : MonoBehaviour { private int addResult = -1; private string callResult; void OnGUI() { if (GUI.Button(new Rect(0, 200, 200, 50), "10 + 2 = ")) { addResult = Unity2iOS.Add(10, 2); } if (addResult != -1) { GUI.Label(new Rect(0, 250, 200, 50), "add result=" + addResult); } if (GUI.Button(new Rect(0, 300, 200, 50), "callback ")) { callResult = Unity2iOS.Callback("http://blog.ihaiu.com"); } if (!string.IsNullOrEmpty(callResult)) { GUI.Label(new Rect(0, 350, 200, 50), "call result=" + callResult); } } }