2016-03-07 14:13:48 azhou_hui 阅读数 3203

转自:http://blog.csdn.net/smlisi2/article/details/8782619

参考1:http://www.xiaobao1993.com/383.html

参考2:http://www.xifarm.com/unity3d_androidsdk/

参考3:  http://bbs.18183.com/thread-149758-1-1.html


本文以UNITY3D接入91SDK的过程为例。


我的开发环境: MAC系统, ECLIPSE, UNITY4.0


开发过程:

1.准备要UNITY为交互Android自备的CLASS.JAR文件。
   我的操作过程是:应用程序->UNTITY文件夹->UNITY->右键:显示包内容->CONTENTS文件夹->PLAYBACKENGINES文件夹->AndroidPlayer文件夹->BIN文件夹->CLASS.JAR【目录:/Applications/Unity/Unity.app/Contents/PlaybackEngines/AndroidPlayer/bin】复制出来备用。

2.新建Android项目,把CLASS.JAR复制到项目libs文件夹中,将91SDK的NdComPlatform.jar也复制到libs文件夹中,(设置Java Build Path),将 MainActivity extends UnityPlayerActivity ,将需要调用的安卓SDK方法写好。AndroidManifest.xml根据91SDK的要求进行配置。Android项目中不需要引入91SDK的RES文件。


3.然后,在项目上右键RUN AS->Android APPLICATION。进入项目目录->bin文件夹->classes文件夹->复制里面所有的文件粘贴到一个好找的目录中,如JARU3D这个文件夹中。


4打开终端,进入UARU3D这个文件夹,输入:jar -cvf myclass.jar *  回车,JARU3D文件夹中将多出:myclass.jar, 该文件做备用。

PS: 在android项目工程中,bin目录下也能找到对应的jar文件。


5.打开UNITY3D4.0,创建新UNITY项目后,在ASSETS文件夹下新建文件夹Plugins,在Plugins文件夹中新建Android文件夹,在Android文件夹中新建bin文件夹和libs文件夹,将myclass.jar复制到bin文件夹中,将91SDK的NdComPlatform.jar复制到libs文件夹中,将91SDK的res文件夹全部复制到Android文件夹中,将Android项目的AndroidManifest.xml复制到ANDORID文件夹下,把Android项目中的资源按照对应的文件夹复制到UNITY项目RES文件夹的对应文件夹内。

在ASSETS文件夹中创建UNITY调用Android的文件,将该文件拖动到MAIN CAMERA放开鼠标进行绑定。



6.UNITY打包为APK安装包进行DEMO效果测试。注意PLAYERSETTINGS配置中BUNDLE IDENTIFIER要和Android项目的package相同。

2014-01-06 15:14:28 u012085988 阅读数 5456

unity开发中ios应用时,要想成功引入第三方sdk,首先得知道c#与object-c如何交互。这里有篇博文介绍了unity开发中,如何实现c#与oject-c互相调用。

http://blog.csdn.net/u012085988/article/details/17761433


下面介绍下unity开发ios应用中,引入第三方sdk的流程:

1、将sdk中要用到的接口用C语言进行封装。因为上你们那篇博文提到了c#与object-c交互,要通过中间语言----C语言实现。

2、将封装好的C函数放在.mm文件中,然后将这个mm文件放到unity工程目录下的Assets/Plugins/IOS目录下。

3、按照上面那篇博文介绍的方法,引用第1步中封装的C函数。

4、用unity导出xcode工程,因为发布app时要用xcode来打包签名。

5、在xcode中引入第三方SDK。到这里应该都没问题了,因为做个ios开发的基本都会用xcode;且一般sdk的使用手册也都介绍了如何在xcode工程中引入sdk。

6、编译调试,打包发布。


下面以百度Frontia为例,实现社会化分享功能:

1、新建unity工程。在Assets下新建如下目录结构:Plugins/IOS/

2、新建share.mm文件,放在1中新建的目录下。定义一个C函数share(),文件中加入以下代码。

extern "C"  
  
{  
  
    void share(char* title, char* msg, char* url)  
  
    {  
  
        // 先把函数的格式定好(规定好返回值和参数表,供c#使用
    }  
  
}  


3、新建c#脚本,绘制一个按钮,用于测试分享功能。脚本内容如下:

using UnityEngine;  
using System.Collections;  
using System.Runtime.InteropServices;  
public class testscript : MonoBehaviour {    
  
    [DllImport("__Internal")]  
    private static extern void share(string title, string msg, string url);  
  
    void OnGUI()  
    {  
        if (GUI.Button (new Rect (100, 100, 100, 50), "test share")) {  
            share("omytitle", "omymsg", "www.baidu.com");          
        }  
    }  
}  

关于这两段代码有疑问的童鞋,需要先看看文章开头提到的那篇博文。

4、导出xcode工程。

5、按照百度Frontia官方文档,将Fraontia-sdk引入xcode中。

具体参见官网http://developer.baidu.com/wiki/index.php?title=docs/frontia/guide-ios/overview

6、找到步骤2中新建的.mm文件(注意该文件还在unity工程中,xcode工程中虽然也有一个这样的文件,但此文件只是一个“替身”,不能修改。所以我们要修改的是unity工程下的Plugins/IOS/share.mm文件),修改文件如下:

#import <Frontia/Frontia.h>



#define APP_KEY @"iG2ffdkYaq8kIjrSfvjMcUrf"


extern "C"

{

    void test(char* title, char* msg, char* url)

    {

        NSString* nstitle = [[NSString alloc] initWithUTF8String:title];

        NSString* nsmsg = [[NSString alloc] initWithUTF8String:msg];

        NSString* nsurl = [[NSString alloc] initWithUTF8String:url];

        

        FrontiaShare *share = [Frontia getShare];

        

        //授权取消回调函数

        FrontiaShareCancelCallback onCancel = ^(){

            NSLog(@"OnCancel: share is cancelled");

        };

        

        //授权失败回调函数

        FrontiaShareFailureCallback onFailure = ^(int errorCode, NSString *errorMessage){

            NSLog(@"OnFailure: %d  %@", errorCode, errorMessage);

        };

        

        //授权成功回调函数

        FrontiaMultiShareResultCallback onResult = ^(NSDictionary *respones){

            NSLog(@"OnResult: %@", [respones description]);

        };

        

        FrontiaShareContent *content=[[FrontiaShareContent alloc] init];

        content.url = nsurl;

        content.title = nstitle;

        content.description = nsmsg;

        content.imageUrl = @"http://apps.bdimg.com/developer/static/04171450/developer/images/icon/terminal_adapter.png";

        

        NSArray *platforms = @[FRONTIA_SOCIAL_SHARE_PLATFORM_SINAWEIBO,FRONTIA_SOCIAL_SHARE_PLATFORM_QQWEIBO,FRONTIA_SOCIAL_SHARE_PLATFORM_QQ,FRONTIA_SOCIAL_SHARE_PLATFORM_RENREN,FRONTIA_SOCIAL_SHARE_PLATFORM_KAIXIN,FRONTIA_SOCIAL_SHARE_PLATFORM_EMAIL,FRONTIA_SOCIAL_SHARE_PLATFORM_SMS];

        

        [share showShareMenuWithShareContent:content menuStyle:FRONTIA_SOCIAL_SHARE_STYLE_LIGHT displayPlatforms:platforms supportedInterfaceOrientations:UIInterfaceOrientationMaskPortrait isStatusBarHidden:NO cancelListener:onCancel failureListener:onFailure resultListener:onResult];

    }

}


7、appDelegate的OpenURL中加入如下代码

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    //SSO或者分享的回调
    return [[Frontia getShare] handleOpenURL:url];
}


8、编译运行,真机调试。


关于分享菜单中,按钮点击没反应问题。

需要在Build Setting中的other Linker Flags 加上 -ObjC 标志



2017-12-28 14:23:17 weixin_42205596 阅读数 163
unity3d接入ANDROID相关SDK请参考:http://blog.csdn.net/yang8456211/article/details/51331358
unity3d接入IOS相关SDK
下面以微信分享sdk为例介绍:
首先就是在c#这边定义接口

using UnityEngine;
using LitJson;
using System.Runtime.InteropServices;

public class ShareMgr : MonoBehaviour {

    //声明unity--to--ios的函数
#if UNITY_IOS
    [DllImport ("__Internal")]  
private static extern void RegisterWeChat(string wxAppID);
[DllImport ("__Internal")]  
private static extern void ShareWithWeChat(string content);
#endif

    ///
    /// 注册的微信id
    ///
    string wxAppID = "test6668888";

    ///
    /// 分享之后的lua回调
    ///
    System.Action luaResponseCall;

    ///
    /// 默认分享内容
    ///
string defaultContent="666888";


    public void ShareWeChat(string content)
    {
        if (string.IsNullOrEmpty(content))
        {
            content = defaultContent;
        }

#if UNITY_IOS
        ShareWithWeChat(content);
#endif

    }

    ///
    /// 注册分享之后的回调
    ///
    ///
    public void RegLuaResponse(System.Action luaResponseCall)
    {
        this.luaResponseCall = luaResponseCall;
    }

    ///
    /// 删除注册的回调
    ///
    public void UnRegLuaResponse()
    {
        luaResponseCall = null;
    }


    void Awake()
{
        this.name = "ShareMgr";
        DontDestroyOnLoad(gameObject);
        Init();
    }


void Init()
{

#if UNITY_IOS
        RegisterWeChat(wxAppID);
#elif UNITY_ANDROID
        AndroidJavaClass jc = new Android;
Android;
jo.Call("RegisterWeChat", wxAppID);
#endif

    }
    void ShareCallResponse(int state)
{
        if (luaResponseCall != null)
        {
            luaResponseCall(state);
        }
}
   
}

再者就是调用oc的方法:

//
//  ShareMgr.h
//
//  Copyright . All rights reserved.
//

#import

#import "WXApi.h"
#import "AppDelegateListener.h"

typedef NS_ENUM(int,ErrorCode) {
   ERROR_CODE_NO_INSTALL=-101,//没有安装微信客户端,分享失败!
   ERROR_CODE_SHARE_SUCCESS=0,//分享成功
   ERROR_CODE_SHARE_CANCEL=-2,//分享失败
   ERROR_CODE_SHARE_FAIL=-3,//分享失败
};

@interface ShareMgr : NSObject
{

}

@property (nonatomic, strong) UIActivityIndicatorView *indicatorView;
@property (nonatomic) BOOL waitingResponse;
@property (nonatomic) const char*targetMgr;
@property (nonatomic) const char*targetMethod;

-(void)ShareWithWeChat:(NSString*)content;


+ (instancetype)Instance;
@end



//
//  ShareMgr.mm
//
//  Copyright . All rights reserved.
//
#import
#import "ShareMgr.h"
#include "UnityAppController.h"

#if defined (__cplusplus)
extern "C" {
#endif
    extern void ShareWithWeChat(const char* content);
    extern void RegisterWeChat(const char* wxAppID);
#if defined (__cplusplus)
}
#endif


@implementation ShareMgr

static ShareMgr*_instance=NULL;

-(id)init
{
    if ((self = [super init]))
    {
        self.targetMgr = [@"ShareMgr" UTF8String ];
        self.targetMethod = [@"ShareCallResponse" UTF8String];
    }
    return self;
}

+ (instancetype)Instance
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [[ShareMgr alloc] init];
        UnityRegisterAppDelegateListener(_instance);
    });
    return _instance;
}

-(void)ShareWithWeChat:(NSString*)content
{
    if (self.waitingResponse){return;}
    if([WXApi isWXAppInstalled])
    {
        WXMediaMessage *message = [WXMediaMessage message];
        [message setThumbImage:[UIImage imageNamed:@"Icon@2x.png"]];
        
        WXImageObject *ext = [WXImageObject object];
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSMutableString *StringFullPath = [[NSMutableString alloc] initWithString:@""];

        [StringFullPath appendString:documentsDirectory];
        [StringFullPath appendString:@"/temp_capture_screen.png"];

        ext.imageData = [NSData dataWithContentsOfFile:StringFullPath];
        UIImage* image = [UIImage imageWithData:ext.imageData];
        ext.imageData = UIImagePNGRepresentation(image);
        
        message.mediaObject = ext;
        message.description = content;
        
        SendMessageToWXReq* req = [[SendMessageToWXReq alloc] init];
        req.bText = NO;
        req.message = message;
        req.scene = WXSceneTimeline;
        
        [WXApi sendReq:req];
        
        
        if (self.indicatorView)
        {
            [self.indicatorView startAnimating];
            [self.indicatorView setHidesWhenStopped:YES];
        }
        else
        {
            dispatch_async(dispatch_get_main_queue(), ^{
                if (!self.indicatorView) {
                    self.indicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
                    
                    
                    self.indicatorView.center = GetAppController().rootView.center;
                    [GetAppController().rootView addSubview:self.indicatorView];
                    self.indicatorView.color = [UIColor whiteColor];
                    
                    [self.indicatorView startAnimating];
                    [self.indicatorView setHidesWhenStopped:YES];
                }
            });
        }
        self.waitingResponse = YES;
    }
    else
    {
        UnitySendMessage([self targetMgr], [self targetMethod] ,[[NSString stringWithFormat:@"%i" ,(int)ERROR_CODE_NO_INSTALL] UTF8String]);
        self.waitingResponse = NO;
    }
        
}

#pragma mark - WXApiDelegate 
-(void) onResp:(BaseResp*)resp
{
    [self.indicatorView stopAnimating];
    
   

    int errorCode ;
    if (resp.errCode == ERROR_CODE_SHARE_SUCCESS) 
    {
        errorCode = ERROR_CODE_SHARE_SUCCESS;
    }
    else if(resp.errCode == ERROR_CODE_SHARE_CANCEL)
    {
        errorCode=ERROR_CODE_SHARE_CANCEL;
    }
    else
    {
        errorCode=ERROR_CODE_SHARE_FAIL;
    }
    
    if([resp isKindOfClass:[SendMessageToWXResp class]])
    {
        UnitySendMessage([self target], [self targetMethod], [[NSString stringWithFormat:@"%i" ,errorCode] UTF8String]);
        self.waitingResponse = NO;
    }
}

#pragma mark - AppDelegateListener 
-(void) willEnterForeground:(NSNotification *)notification
{
    
}

-(void) didFinishLaunching:(NSNotification *)notification
{
    
}

-(void) didEnterBackground:(NSNotification *)notification
{
    
}

-(void) didReceiveRemoteNotification:(NSNotification *)notification
{
    
}

-(void) didReceiveLocalNotification:(NSNotification *)notification
{
    
}

-(void) didRegisterForRemoteNotificationsWithDeviceToken:(NSNotification *)notification
{
    
}

-(void) onOpenURL:(NSNotification *)notification
{
    
}

@end

#if defined(_cplusplus)
extern "C"{
#endif

    void ShareWithWeChat(const char* content)
    {
        NSString *s = [[NSString alloc] initWithUTF8String:content];
        [[ShareMgr Instance] ShareWithWeChat:s];
    }
    
    
    void RegisterWeChat(const char* wxAppID)
    {
        [ShareMgr Instance];
        NSString *appId = [[NSString alloc] initWithUTF8String:wxAppID];
        // 微信注册
        [WXApi registerApp:appId];
        
    }
    
#if defined(_cplusplus)
}
#endif

2019-04-17 23:40:29 u010263943 阅读数 618

一、本例子中使用的Android Studio为3.2.0版本,Unity为2018.3.12版本

二、Unity3D调用SDK

1、一般第三方SDK都会有一个暴露给接入方(即Unity3D)的一个接口类,该类中包含了一些SDK功能的各个调用方法,例如下面这个SDK接口类中包含了初始化、登录、登出三个功能的接入类,里面的每个方法跟参数都加了注释;

先看SDK库工程目录,mysdk是SDK库工程,app是一个依赖于SDK库工程的demo,其中只有一个MainActivity类,便于开发时进行测试,mysdk中只有一个MySDkPlatform类,这个类就是unity接入需要调用的接口类;

        

/**
 * 类说明:unity接入SDK的接口类
 */
public class MySDkPlatform {
    
    private static String gameObjectName;//unity传过来的接收SDK回调的类名,SDK根据此类名调用unity类中的方法
    private static String unityInitCallbackName;//unity传过来的接收SDK回调的类中的方法,SDK根据此方法名调用unity中的方法
    private String unityLoginCallbackName;//同上
    private String unityLogoutCallbackName;//同上
    
    //单例模式
    public static MySDkPlatform mySDkPlatform;
    public static MySDkPlatform getInstance(){
        if (mySDkPlatform == null) {
            mySDkPlatform = new MySDkPlatform();
        }
        return mySDkPlatform;
    }

    //初始化
    public void init(Activity activity){
        System.out.println("调用了mysdk的初始化方法");
        //该方法的三个参数
        //gameObjectName:unity中的gameObject的类名
        //unityInitCallbackName:unity中gameObject绑定的c#脚本里的方法名
        //第三个参数:SDK向unity传递的字符串
        UnityPlayer.UnitySendMessage(gameObjectName,unityInitCallbackName,"这是SDK初始化结果回调");
    }

    //登录
    public void login(String arg1){
        System.out.println("调用了mysdk的登录方法;arg1 = "+arg1);
        UnityPlayer.UnitySendMessage(gameObjectName,unityInitCallbackName,"这是SDK登录结果回调");
    }

    //登出,静态,跟以上非静态方法做不同例子演示
    public static void logout(String arg1){
        System.out.println("调用了mysdk的登出方法");
        UnityPlayer.UnitySendMessage(gameObjectName,unityInitCallbackName,"这是SDK登出结果回调");
    }

    //拿到unity的类名
    public void setGameObjectName(String gameObjectName){
        this.gameObjectName = gameObjectName;
    }
    //拿到unity接收SDK初始化结果的方法名
    public void setUnityInitCallbackName(String unityInitCallbackName) {
        this.unityInitCallbackName = unityInitCallbackName;
    }
    //拿到unity接收SDK登录结果的方法名
    public void setUnityLoginCallbackName(String unityLoginCallbackName) {
        this.unityLoginCallbackName = unityLoginCallbackName;
    }
    //拿到unity接收SDK登出结果的方法名
    public void setUnityLogoutCallbackName(String unityLogoutCallbackName) {
        this.unityLogoutCallbackName = unityLogoutCallbackName;
    }
}

2、类中的UnityPlayer.UnitySendMessage(gameObjectName,callbackName,arg1)方法是Unity中的一个unity-classes.jar包下的方法,SDK需要引入该包才能编译,在引入过程中需要注意,因为unity中已经有这个jar包,SDK库工程只在编译的时候需要用到,真正接入的时候,只需要拷贝SDK库工程生成的aar包即可,不需要把unity-classes.jar编译进去,否则会报异常,引入unity-classes.jar方法如下:

(1)新建一个unity3dlibs文件夹,保证与工程中的libs不重名,将unity-classes.jar放入该文件夹下

(2)在工程的build.gradle中加入依赖

//添加一个本地仓库,并将unity3dlibs目录作为仓库地址
repositories{
    flatDir {
        dirs 'unity3dlibs'
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    testImplementation 'junit:junit:4.12'

    compileOnly files('unity3dlibs/unity-classes.jar')//只在编译的时候用到
}

(3)清单文件;如果SDK中需要在manifest中application根节点下注册信息,在清单文件中需要编写以下代码:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.sdk.mysdk">

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        //方式一:SDK的接口类继承了unity的UnityPlayerActivity,这里启动入口填写SDK的接口类路径
        //方式二:SDK的接口类没有继承unity的UnityPlayerActivity,这里填写"com.unity3d.player.UnityPlayerActivity"
        //本例子中使用方式二
        //Unity启动入口activity
        <activity android:name="com.unity3d.player.UnityPlayerActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

清单文件中注册UnityPlayerActivity是为了将SDK做成符合Unity接入的plugins,Unity编译时会将自身生成的manifest和SDK的manifest进行合并,但SDK的manifest优先级比较高,所以需要SDK在manifest中注册启动的UnityPlayerActivity。                     (注:如果SDK中有Activity并且继承了UnityPlayerActivity,则启动应用的main入口需要改为SDK的Activity)

三、SDK调用Unity3D

1、在Unity中新建一个脚本,调用MySDkPlatform中的方法

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class NewBehaviourScript : MonoBehaviour
{

    AndroidJavaClass unityPlayer;
    AndroidJavaObject currentActivity;

    AndroidJavaClass androidJavaClass;
    AndroidJavaObject androidJavaObject;

    // Start is called before the first frame update
    void Start()
    {
        步骤一:拿到接口对象实例
        //方式一
        //通过包名获取UnityPlayer,目的为了获取下面当前activity对象用
        //使用这种方式,SDK的activity或者给cp的的接口类需要继承UnityPlayerActivity
        //拿到unityPlayer(固定写法,不用修改),即可调用activity或者给cp的接口类中的静态方法,
        unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        //通过unityPlayer获取当前的activity (注:固定写法,不用修改),拿到currentActivity,即可调用SDK的activity或者给cp的接口类中的非静态方法
        currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");

        //方式二(本例中使用的该方式)
        //获取SDK的MySDkPlatform类,可以直接使用androidJavaClass调用MySDkPlatform的静态方法
        androidJavaClass = new AndroidJavaClass("com.sdk.mysdk.MySDkPlatform");
        //拿到MySDkPlatform类中的单例对象,可以直接使用androidJavaObject调用MySDkPlatform中的非静态方法
        androidJavaObject = androidJavaClass.CallStatic<AndroidJavaObject>("getInstance");

        //步骤二:告诉SDK返回参数时调用的方法名
        //unity调用SDK的方法,传入一个参数,该参数为定义在unity中的方法名,当unity调用SDK的接口,
        //且需要SDK返回参数时,SDK会根据这里传入的方法名,调用定义在unity中的方法
        androidJavaObject.Call("setGameObjectName", "Main Camera");
        androidJavaObject.Call("setUnityInitCallbackName", "initCallback");
        androidJavaObject.Call("setUnityLoginCallbackName", "showAdGifCallback");
        androidJavaObject.Call("setUnityLogoutCallbackName", "showAdGifCallback");

        //步骤三:调用SDK的接口方法
        //SDK初始化
        Button btn = GameObject.Find("Button").GetComponent<Button>();
        btn.onClick.AddListener(() => 
        {
            Debug.Log("-->初始化");
            //调用初始化方法,传入当前activity对象(注:这里的activity参数就是方式一中获取到的currentActivity)
            androidJavaObject.Call("init", currentActivity);
        });

        //登录
        Button btn2 = GameObject.Find("Button2").GetComponent<Button>();
        btn2.onClick.AddListener(() =>
        {
            androidJavaObject.Call("login", "unity调用了SDK的登录");
        });

        //登出
        Button btn3 = GameObject.Find("Button3").GetComponent<Button>();
        btn3.onClick.AddListener(() =>
        {
            //这里使用的是androidJavaClass调用的SDK的登出,在SDK接口类中logout方法为静态的,                
            //所以这里使用androidJavaClass类直接调用,而上面登录方法为非静态的,所以使用的是androidJavaObject
            androidJavaClass.Call("logout", "unity调用了SDK的登出");
        });

    }

    //步骤四:定义unity接收SDK返回参数的方法,这里的方法名与步骤二中传入的参数名必须一致
    //SDK初始化后,会调用该方法,参数为回调结果
    void initCallback(string callback)
    {
        Debug.Log("-->收到SDK初始化的回调:"+callback);
    }

    //SDK登录后,会回调该方法,参数为回调结果
    void loginCallback(string callback)
    {
        Debug.Log("-->收到SDK登录的回调:" + callback);
    }

    //SDK登出后,会回调该方法,参数为回调结果
    void logoutCallback(string callback)
    {
        Debug.Log("-->收到SDK登出的回调:" + callback);
    }

    // Update is called once per frame
    void Update()
    {

    }
}

四、打包

1、方式一:SDK打成plugins给Unity

把SDK编译成aar,以及manifest放入Unity对应的Assets文件夹下的plugins下的Android下,以及libs下,没有的文件夹自己新建一个,目录对应如下:

Manifest放入Android文件夹下(如上图)

SDK的aar包放入libs文件夹下(如上图)

配置好以上步骤即可开始打包编译;

2、方式二:Unity导出安卓工程接入SDK(studio版)

这种方式接入更为简单,将SDK的aar包拷贝到游戏工程下的libs下,并在gradle中添加aar依赖,在Manifest清单文件中,将自己的注册信息拷贝到游戏工程中直接打包即可;(注:SDK工程中unity-classes.jar不需要拷贝进去,导出的安卓游戏工程中已经有了这个jar包)

 

 

 

 

 

 

 

 

 

 

 

 

2013-04-11 09:39:27 smlisi2 阅读数 4804

授人以,不如授人以以UNITY3D调用iOS版的91SDK为例,利用C# / C / OBJ-C 交互原理,本文将详细UNITY3D与iOS之交互的解决方案

首先,打开XCODE新建一个空项目,参照91SDK开发文档将91SDK引入并进行环境配置。
配置完毕后创建一个名为“LsSdkConector”的OBJ-C CLASS文件。完毕后,当前项目应如图:

LsSdkConector.h文件我们不用去改动它。保持原样即可。

接下来我们开始在LsSdkConector.m 文件中制作C接口 和 调用91SDK的iOS方法。
引入必要的头文件后,我把该文件的代码分为3个区域。
代码A区域用来定义C接口必须要实现的API。

代码B区域用来实现A区域代码的接口,以及要调用91SDK的iOS方法,直白点说,代码B区域写的方法就是用来调用代码C区域的方法。

代码C区域用来实现真正的91SDK的OBJ-C方法。

大家在自己的项目中:
代码A区域作为可直接复制套用;
代码B区域可编写工具方法和调用iOS的方法;
代码C区域编写91SDK的iOS方法,你需要什么API就写什么,写完了在代码B区域添加C的调用方法即可。

在编写代码中,有的人可能会问OBJ-C中有的API有回调,UNITY是如何知道OBJ-C回调结束呢?
答:OBJ-C调用UNITY的API,可以用“UnitySendMessage”的方法 ,具体使用方法 看UINTY的使用帮助。

这样我们完成了C接口和91SDK的API代码,接下来我们做UINITY3D方面的代码处理。
我们在UNITY3D项目的ASSETS下新建Code文件夹与Plugins文件夹。
将LsSdkConector.h 和 LsSdkConector.m 复制到 Plugins 文件夹中,并在 Code文件夹中编写我们的UNITY调用OBJ-C 方法。
新建C#文件“LsSdkConector.cs”,这个文件中,我们将代码分为A、B两区。

代码A区编写C语言的接口,这里的接口方法要对应”LsSdkConector.m”中代码区域B的方法名称。

代码B取编写UNITY3D调用OBJ-C的方法,这里的代码注意用来实现UNITY3D之间的方法调用,C#的方法内调用C的方法。

这样,UNITY3D接入91SDK-iOS版的解决方案到此完成。

下面,我们测试一下这个解决方案是否管用。
在Code文件夹中新建 “LisiTest.cs”文件,编辑如下代码:
并将该C#文件拖至Main Camera 绑定。

UNITY3D转iOS项目必须要设置BundleIdentifier,截图:

点击“Build”按钮创建iOS项目,打开该iOS项目,将LsSdkConector.h 和 LsSdkConector.m拖入iOS项目的Classes文件夹中

按照91SDK文档中环境配置章节,对SDK进行引用,添加系统库,做环境配置。
打包到iOS设备前,检查一下iOS项目的配置,注意OBJC要写在第1列,还有要注意大小写。

选择使用iOS设备打包,你会发现UNITY3D调用iOS 成功了!!

本文要告诉大家的是Unity3D与iOS交互的解决方案,代码规范问题不是本文重点,比如91SDK的初始化在SDK文档上推荐是在AppDelegate的文件中进行初始化。

附件:  文中提及文件.zip (2.25 KB, 下载次数: 305)


Unity3D与Android之间的交互可以参考我的另一篇文章:《实操UNITY3D接入91SDK安卓版》

没有更多推荐了,返回首页