iOS真机上运行,经常需要第三方库,也难免需要C#和Objective-C交互,其实很简单,直接上例子:
一.C#的接口,调用ObjC中的函数
using UnityEngine; using System.Collections; // No.1 using System.Runtime.InteropServices; public class SOpenUDID { // No.2 [DllImport("__Internal")] // No.3 declear function in ObjC private static extern string SUDID(); public static string UDID() { // No.4 if (Application.platform == RuntimePlatform.IPhonePlayer) { return SUDID(); } return ""; } }
注意点:
No.1.引用头文件
No.2.DllImport后,就可以调用ObjC中的函数
No.3.声明,一般都是静态的函数声明(如果Obj中的函数返回const char*, 这里可以声明为string)
No.4.加上平台判断,我获取UDID无法在模拟器、编辑器下运行
#import "SvUDIDTools.h" extern "C" { const char* SUDID() { return [[SvUDIDTools UDID] UTF8String]; } }
SvUDID.m
@implementation SvUDIDTools + (NSString*)UDID { //do sth... return udid; } ... @end
1.Obj中对应的接口一般是在.mm文件中(.mm可以同时使用ObjC函数和C++函数)
2.extern "C" 中可以写接口了(在Unity的C#中调用的接口)
三。UnitySendMessage可以用来在ObjC函数中执行完毕时执行回调
UnitySendMessage("UDIDObj", "SuccessCallBack", "Succeed enter callback!");
UnitySendMessage这个方法相信很少朋友注意到它的使用,因为根本就无法在unity编辑时使用,但是它有一个神奇的地方就是可以完成dllimport的方法回调时使用,这样说好像有些抽象,我可以举一个例子。
很多朋友开发ios客户端游戏,难免有人会用到付费啊,排行榜之类的功能,我这里先不讲使用什么第三方插件什么的,我这里就说明下是通过在xcode下编辑相关的调用代码,最后通过dllimport方法让unity调用实现两边通信。
相信上面说的dllimport方法也有人了解过,这时候重点来了,如果用户付费,肯定会有一个结果,比如付费成功,付费失败这样,xcode底下是挂一个notification就是有点类似于监听器的东西,当有一个结果返回时就调用,这时候怎么办?xcode下的回调方法我在unity下怎么知道它什么时候回调过来?于是UnitySendMessage这个方法就诞生了,在回调方法被触发时,我们通过UnitySendMessage方法把结果发给unity,让unity这边处理。
UnitySendMessage(“string”,“string”, ***),这是方法,我们至少需要传入两个参数,第一个参数为unity中的一个gameobject名称,第二个参数为这个gameobject身上捆绑的脚本中的一个方法,而第三参数事实上是这个对应方法上的参数,有没有参数就看你了。
@implementation UnityNdComPlatformDelegate + (void)addNdComPlatformObservers { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loginFinished:) name:kNdCPLoginNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(buyFinished:) name:kNdCPBuyResultNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(leavePlatform:) name:kNdCPLeavePlatformNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sessionInvalid:) name:kNdCPSessionInvalidNotification object:nil]; } + (void)sendU3dMessage:(NSString *)messageName param:(NSDictionary *)dict { NSString *param = @""; for (NSString *key in dict) { if ([param length] == 0) { param = [param stringByAppendingFormat:@"%@=%@", key, [dict valueForKey:key]]; } else { param = [param stringByAppendingFormat:@"&%@=%@", key, [dict valueForKey:key]]; } } UnitySendMessage("MyMsgObj", [messageName UTF8String], [param UTF8String]); } + (void)loginFinished:(NSNotification *)aNotify { /** 登录接口通知 **/ NSDictionary *dict = [aNotify userInfo]; [self sendU3dMessage:@"kNdCPLoginNotification" param: [NSDictionary dictionaryWithObjectsAndKeys:[dict objectForKey:@"result"], @"result", [dict objectForKey:@"error"], @"error", nil]]; }
UnitySendMessage的使用参考:http://m.blog.csdn.net/blog/u011285268/9231183#