91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Unity3D 接入IOS SDK

發布時間:2020-07-08 03:26:38 來源:網絡 閱讀:18476 作者:xubonjucs 欄目:游戲開發

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還相對較少還需測試。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

锡林郭勒盟| 汤阴县| 柞水县| 卢湾区| 平乐县| 天长市| 河北区| 沅陵县| 湘西| 绥棱县| 镇安县| 肇庆市| 航空| 锡林浩特市| 长武县| 吉林市| 弥勒县| 长治市| 靖安县| 天等县| 枣阳市| 晋州市| 疏勒县| 油尖旺区| 临猗县| 闽侯县| 辽宁省| 土默特右旗| 海盐县| 阿鲁科尔沁旗| 蒙城县| 义马市| 诸城市| 九江县| 蛟河市| 宾川县| 建德市| 秦安县| 昆山市| 泾川县| 安新县|