我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Unity3D 接入IOS SDK

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Unity3D 接入IOS SDK

Unity3D 开发游戏需要接入平台方的SDK才能够正式发布,本文记录IOS SDK接入的流程。


Unity与IOS的互调


要实现游戏SDK的接入,首先要解决的是Unity3D与原生IOS代码之间的相互调用问题。Unity使用C#作为开发语言,而IOS采用Objective-C作为开发语言,如何让C#调用OC代码,或者让OC调用C#代码。所幸OC和C#都支持直接嵌入C/C++代码,这里使用C作为两者之间的桥梁。


为了简化两者之间的接口调用和数据传递,在设计Unity与IOS SDK之间的接口时,Unity调用SDK只有一个接口,而SDK调用Unity也只有一个接口。由于平台方的SDK差异性较大,如何保证一个接口可以解决问题?这里我们开发了一个通用SDK层,游戏只会与通用SDK层交互,而由通用SDK层再与具体的平台SDK对接。


Unity中调用SDK层的功能:

using System.Runtime.InteropServices;
using Cross;
using UnityEngine;

namespace MuGame
{
    public class IOSPlatformSDK : IPlotformSDK
    {
        //!--IOS插件声明,所有unity调用ios SDK插件走这里
        [DllImport("__Internal")]
        public static extern void CallSDKFunc(string type, string jsonpara);

unity中所有的调用都转化为CallSDKFunc,该函数由通用SDK提供,参数type表示功能分类,jsonpara是以json字串表示的一系列参数。


通用SDK调用返回结果给Unity

//!---------------------------外部接口声明--------------------------------------------
#if defined(__cplusplus)
extern "C"{
#endif
    extern void UnitySendMessage(const char*, const char*, const char*);
#if defined(__cplusplus)
}
#endif

这里使用unityengine.dll提供的C接口UnitySendMessage,这里第1个char* 表示接受该消息的GameObject的name, 第2个表示该GameObject的脚本中接受消息的函数名,第3个表示传递的数据,这里我们还是使用json来传递,同时附带消息类型。


SDK暴露的C接口的声明与定义

#if defined(__cplusplus)
extern "C" {
#endif    
    //游戏层访问SDK的接口
    void CallSDKFunc(char *type, char * jsonpara)
    {
        if(connector == NULL)
        {
            connector = [SDKConnector sharedInstance];
        }
        [connector _CallSDKFunc :CreateNSString(type) :CreateNSString(jsonpara)];
    }
    
#if defined(__cplusplus)
}
#endif

这里CallSDKFunc即上述Unity调用SDK的接口,在OC层,直接由SDKConnector类接收,并分发处理。


通用SDK

SDKConnector负责消息的分发

- (void)_CallSDKFunc :(NSString*)type :(NSString*)jsonpara
{
    NSLog(@"[SDK] Recevie cmd = %@   jsonpara = %@\n",type,jsonpara);
    if ([type isEqualToString:@"login"])
    {//登录
        [LanPlatform login:[SDKListener sharedInstance]];
    }
    else if ([type isEqualToString:@"loginout"])
    {//登出
        [LanPlatform logout:[SDKListener sharedInstance]];
    }
    else if ([type isEqualToString:@"switchAccount"])
    {//切换账号
        [LanPlatform switchAccount:[SDKListener sharedInstance]];
    }
    else if ([type isEqualToString:@"pay"])
    {//充值
        [LanPlatform pay:[SDKListener sharedInstance]];
    }

这里根据type类型将消息分发到通用SDK层对应的处理模块,再由通用SDK层去调用平台SDK的API进行具体的处理,注意这里传入了一个实例SDKListener,SDKListener负责接送平台SDK的回应,并将数据发送至Unity侧。


通用SDK层的功能

目前包含以下常见的模块:登录,登出,切换账号,充值,用户中心,用户论坛,用户反馈,防沉迷,实名认证。以及各项游戏数据的上报:选服,进入游戏,创建角色,升级等等。


应用生命周期SDK

SDK中比较特殊的一类,基本上也是所有SDK都需要接入的API是生命周期API,本文处理项对比较特殊一点。

@protocol SDKLifeCycleListener <NSObject>
@optional
- (void)didFinishLaunching:(NSNotification*)notification;
- (void)didBecomeActive:(NSNotification*)notification;
- (void)willResignActive:(NSNotification*)notification;
- (void)didEnterBackground:(NSNotification*)notification;
- (void)willEnterForeground:(NSNotification*)notification;
- (void)willTerminate:(NSNotification*)notification;
@end

//注册生命周期回调函数
void SDKRegisterLifeCycleListener(id<SDKLifeCycleListener> obj)
{
#define REGISTER_SELECTOR(sel, notif_name)					\
        if([obj respondsToSelector:sel])							\
            [[NSNotificationCenter defaultCenter] 	addObserver:obj	\
                                                    selector:sel	\
                                                    name:notif_name	\
                                                    object:nil		\
            ];														\

    REGISTER_SELECTOR(@selector(didFinishLaunching:), UIApplicationDidFinishLaunchingNotification);
    REGISTER_SELECTOR(@selector(didBecomeActive:), UIApplicationDidBecomeActiveNotification);
    REGISTER_SELECTOR(@selector(willResignActive:), UIApplicationWillResignActiveNotification);
    REGISTER_SELECTOR(@selector(didEnterBackground:), UIApplicationDidEnterBackgroundNotification);
    REGISTER_SELECTOR(@selector(willEnterForeground:), UIApplicationWillEnterForegroundNotification);
    REGISTER_SELECTOR(@selector(willTerminate:), UIApplicationWillTerminateNotification);
    
#undef REGISTER_SELECTOR
}

这里定义了一个SDK生命周期监听的协议SDKLifeCycleListener, 以及注册该协议的接口SDKRegisterLifeCycleListener。在App加载的时候,将该监听注册进去,实现该协议的也是SDKListener。

@implementation SDKListener

//加载函数,实现在加载该类时,注册生命周期监听函数
+(void)load
{
    NSLog(@"[SDK] load\n");
    SDKRegisterLifeCycleListener([SDKListener sharedInstance]);
}


小结

至此,大概介绍了一下所实现的IOS SDK的方法。简而言之,unity通过CallSDKFunc调用通用SDK功能,通用SDK通过SDKConnector分发消息给具体的通用SDK模块,再由平台SDK处理。SDKListener负责接收平台处理的结果和生命周期事件,并将需要的结果返回给Unity。

就目前的实现来看,能够较好的相对解耦游戏与SDK之间的联系,不会因平台的差异性导致游戏代码的频繁改动。当然目前接入的SDK还相对较少还需测试。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Unity3D 接入IOS SDK

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Unity3D 接入IOS SDK

Unity3D 开发游戏需要接入平台方的SDK才能够正式发布,本文记录IOS SDK接入的流程。Unity与IOS的互调要实现游戏SDK的接入,首先要解决的是Unity3D与原生IOS代码之间的相互调用问题。Unity使用C#作为开发语言,
2023-01-31

IOS接入facebook详解

facebook 接入 1.在 facebook 后台 配置 ios 平台, 获取 fb appidstore id 可以先随便找一个已存在的填入进去. 2.CocoaPods 引入几个核心库pod 'FBSDKCoreKit', '~>
2022-05-20

IOS客户端接入微信支付

实际上,从代码的角度,调起支付APP就是把一些关键的参数通过一定方式打包成为一个订单,然后发送到支付平台的服务器。所以,只要搞清楚了参数设置,搞清楚了每个支付平台的SDK里面一些关键API的使用,基本上就可以很简单的支持支付。 今天记录一下
2022-05-20

解决SDK注入权限验证安卓正常,IOS出现config fail的方法

实测有效 解决微信游览器和企业微信游览器JSSDK注入权限验证 安卓正常,IOS出现config fail 一开始我们想到的是可能微信这边的Bug,但细想一下应该不是。因为可能涉及到了IOS的底层原理的问题,可能是不受微信所控。(有问题欢迎
2022-05-18

Android关于接入SDK所用jdk版本比项目高的报错问题

* What went wrong:A problem occurred evaluating project ':app'.> java.lang.UnsupportedClassVersionError: com/google/fire
2023-08-17

微博SDK率先适配HarmonyOS NEXT,助力多类型终端社会化接入

3月22日,微博开放平台在其官网上线全新适配华为HarmonyOS NEXT的登录分享SDK和操作文档,华为开发者联盟官网同步上线,面向所有鸿蒙开发者免费开放。
华为HarmonyO2024-11-30

Android App支付系列(二):支付宝SDK接入详细指南(附官方支付demo)

一家移动互联网公司,说到底,要盈利总是需要付费用户的,自己开发支付系统对于资源有限的公司来说显然不太明智,国内已经有多家成熟的移动支付提供商,阿里就是其中之一。 笔者在此总结了下阿里旗下支付宝Android SDK支付的接入流程,供后来者参
2022-06-06

苹果升级iOS 17备忘录应用,可嵌入相关笔记链接

用户在升级到 iOS 17 Beta 1 和 macOS Sonoma Beta 1 更新之后,在“备忘录”应用中,可以添加指向其它笔记的链接。

四款行业头部数据分析SDK接入鸿蒙生态,以数据驱动应用高质量增长

鸿蒙生态建设速度突飞猛进,不仅有超4000款应用加速开发,众多头部SDK伙伴也在积极加入,为开发者提供构建鸿蒙原生应用所需的多项能力。近期,友盟+移动统计SDK、神策数据SDK、阿里云日志服务SDK、QuestMobile全流量分析SDK四
SDK2024-11-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录