[置顶] 【Unity3D游戏开发】C#和Objective-C数据交互 (二五)

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无法在模拟器、编辑器下运行


 二. ObjC类SVUDIDInterface.mm

#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]];
}

这里我贴一个91平台的调用理念,一开始我们通过addNdComPlatformObservers方法增加监听,当登陆回调方法loginFinished被触发时,我们通过sendU3dMessage方法调用UnitySendMessage把具体的登陆结果传回到unity。


UnitySendMessage的使用参考:http://m.blog.csdn.net/blog/u011285268/9231183#


你可能感兴趣的:(C#,unity,objC,dllimport)