制作iOS SDK接入到Untiy項目阵赠,然后導出unitypackage包給其它unity游戲接入SDK

之前一直從事iOS開發(fā)工作烁落,最近要做一個iOS SDK給Unity游戲項目使用,新手遇到很多問題豌注,還好都自己解決了伤塌,記錄一下;

1轧铁、開發(fā)iOS SDK:之前因為對Unity接入iOS SDK和UnityPackage打包不熟每聪,看網(wǎng)上說Unity不會自動復制Framework到Xcode工程,所以用的靜態(tài)鏈接庫齿风,也就是.a形式;(其實Unity導出Xcode后接入SDK對iOS開發(fā)人員來說非常簡單药薯!但Unity項目希望能自動化處理,導出Xcode后可以不經(jīng)任何修改救斑,所以需要把iOS SDK做成UnityPackage包童本,在Unity開發(fā)環(huán)境簡單、快捷接入)

2脸候、由于Untiy使用C#語言開發(fā)穷娱,所以iOS需要提供 C 接口給 Unity 調(diào)用绑蔫,例如: mysdk.h

ifdef __cplusplus //C++環(huán)境

extern "C"{

endif

           void usersdk(const char *param);

ifdef __cplusplus //C++環(huán)境

}

endif

然后在 mysdk.mm 文件實現(xiàn):

void usersdk(const char *param)
{

}

3、SDK分別針對真機和模擬器在Release模式編譯泵额,編譯后合并成通用.a配深,最后應該得到一些.h頭文件、.a二進制文件嫁盲、可能還有一些資源文件篓叶,比如 test.txt,image.xcassets圖片文件夾等;

4羞秤、新建 Unity 項目缸托,在Assets目錄下面新建 /Plugins/MySDK/iOS和Android文件夾,把第2步的文件和資源還有 mysdk.h 和 mysdk.mm 放到iOS目錄下瘾蛋;

5嗦董、在 Unity新建 C# 文件,調(diào)用 SDK 接口:

public class ECKChatSDK : MonoBehaviour {

#if UNITY_IOS && !UNITY_EDITOR

[DllImport("__Internal")]
void usersdk(string param);

#endif

void OnGUI() {

    if (GUI.Button (new Rect (200, 150, 200, 50), "使用SDK")) {

        #if UNITY_IOS && !UNITY_EDITOR

        usersdk("param");

        #endif

        #if UNITY_ANDROID && !UNITY_EDITOR

        #endif

    }
}

}

Unity會自動匹配 string 和 const char *;

6瘦黑、新建 iosbulid.cs 自動復制文件和資源:

在 Unity 的 Assets 目錄下京革,新建目錄和文件 /Scripts/Editor/iosbulid.cs,內(nèi)容如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
using System.IO;

public class iOSBuild : MonoBehaviour {

[PostProcessBuild]
public static void OnPostprocessBuild(BuildTarget buildTarget, string path)
{
    if (BuildTarget.iOS == buildTarget)
    {
        //復制資源文件夾
        ECKCopyiOSResource(path);
        //修改工程文件
        ECKModifyPBXProject(path);
    }
}

private static void ECKModifyPBXProject(string path)
{
    string projPath = PBXProject.GetPBXProjectPath(path);
    PBXProject proj = new PBXProject();

    proj.ReadFromString(File.ReadAllText(projPath));
    string target = proj.TargetGuidByName("Unity-iPhone");

    //添加 -ObjC標記
    proj.AddBuildProperty(target, "OTHER_LDFLAGS", "-ObjC");

    //引用資源文件夾
    string resourceDirectoryPath = "Libraries/Plugins/ECKChatSDK/iOS/Resource";
    ECKAddResourceGroupToiOSProject(path, proj, target, resourceDirectoryPath);

    //引用資源文件夾幸斥,直接添加文件夾匹摇,以Create folder references 形式添加
    /*
    string resourcePath = "Libraries/Plugins/ECKChatSDK/iOS/Resource";
    //string fileGuid = proj.AddFolderReference(Path.Combine(path, resourcePath), resourcePath, PBXSourceTree.Source);
    string fileGuid = proj.AddFolderReference(Path.Combine(path, resourcePath), resourcePath);
    proj.AddFileToBuild(target, fileGuid);*/

    //保存工程文件
    File.WriteAllText(projPath, proj.WriteToString());
}

//在工程文件添加資源文件夾引用,以 Create Group 形式加到工程文件
private static void ECKAddResourceGroupToiOSProject(string xcodePath, PBXProject proj, string target, string resourceDirectoryPath)
{
    string dirFullPath = Path.Combine(xcodePath, resourceDirectoryPath);
    //添加文件引用
    string[] files = Directory.GetFiles(dirFullPath);
    foreach (string s in files)
    {
        string fileExtension = Path.GetExtension(s);
        if (fileExtension.Equals(".DS_Store")) {
            continue;
        }
        string fileName = Path.GetFileName(s);
        string targetFilePath = Path.Combine(resourceDirectoryPath, fileName); 
        string fileGuid = proj.AddFolderReference(targetFilePath, targetFilePath);
        proj.AddFileToBuild(target, fileGuid);
    }
    //添加子文件夾
    string[] subDirectorys = Directory.GetDirectories(dirFullPath);
    foreach (string s in subDirectorys)
    {
        string fileName = Path.GetFileName(s);
        string subDirPath = Path.Combine (resourceDirectoryPath, fileName); 
        string fileExtension = Path.GetExtension(s);
        if (fileExtension.Equals (".xcassets")) {
            string fileGuid = proj.AddFile(subDirPath, subDirPath);
            proj.AddFileToBuild(target, fileGuid);
        } else {
            ECKAddResourceGroupToiOSProject (xcodePath, proj, target, subDirPath);
        }
    }
}

//復制ios多語言文件和圖片資源
private static void ECKCopyiOSResource(string path)
{
    string fromDir = Application.dataPath+"/Plugins/ECKChatSDK/iOS/Resource/";
    string targetDir = path + "/Libraries/Plugins/ECKChatSDK/iOS/Resource/";

    ECKCopyDirectoryFiles (fromDir, targetDir);
}

/** 將文件夾下面的所有非.meta文件(不包括子文件夾)復制到iOS工程目錄下*/
private static void ECKCopyDirectoryFiles(string fromDir, string targetDir)
{
    if (!Directory.Exists(targetDir))
    {
        Directory.CreateDirectory(targetDir);
    }

    //復制所有文件
    string[] files = Directory.GetFiles(fromDir);

    // Copy the files and overwrite destination files if they already exist.
    foreach (string s in files)
    {
        string extension = Path.GetExtension(s);
        if (extension.Equals(".meta")) 
        {
            continue;
        }
        string fileName = Path.GetFileName(s);
        string targetFilePath = Path.Combine(targetDir, fileName);
        File.Copy(s, targetFilePath, true);
    }

    //復制所有子文件夾
    string[] subDirectorys = Directory.GetDirectories(fromDir);

    // Copy the files and overwrite destination files if they already exist.
    foreach (string s in subDirectorys)
    {
        string dirName = Path.GetFileName(s);
        string targetDirPath = Path.Combine(targetDir, dirName);
        ECKCopyDirectoryFiles (s, targetDirPath);
    }
}

}

因為加了 [PostProcessBuild] 表情甲葬,這個 OnPostprocessBuild 函數(shù)會在 Untiy編譯成Xcode后自動執(zhí)行!

這里需要說明的是廊勃,Xcode工程添加文件夾有2種方式,第一種是 Create Groups经窖,第二種是 Create folder references坡垫,如果使用

/*
string resourcePath = "Libraries/Plugins/ECKChatSDK/iOS/Resource";
//string fileGuid = proj.AddFolderReference(Path.Combine(path, resourcePath), resourcePath, PBXSourceTree.Source);
string fileGuid = proj.AddFolderReference(Path.Combine(path, resourcePath), resourcePath);
proj.AddFileToBuild(target, fileGuid);*/

這段代碼,會以 第二種 Create folder references 形式加到工程文件画侣;

ECKAddResourceGroupToiOSProject 這個函數(shù)會以 第一種方式加到工程文件;

7冰悠、最后運行 Xcode工程,應該可以直接 run 起來了配乱,測試無誤后溉卓,進入下一步;

8搬泥、在 Unity項目桑寨,選中 /Plugins/MySDK 文件夾,右鍵選擇 Export Package ... 得到 MySDK.unitypackage包忿檩,把這個包給 Untiy項目尉尾,對方先打開他們自己游戲的Unity工程,然后雙擊我們的 MySDK.unitypackage包燥透,點擊 import 按鈕沙咏,就可以導入到游戲的Unity工程辨图,把 iosbulid.cs 里面的函數(shù)復制到游戲的相似地方,實現(xiàn)自動復制文件和資源功能;

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芭碍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子孽尽,更是在濱河造成了極大的恐慌窖壕,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杉女,死亡現(xiàn)場離奇詭異瞻讽,居然都是意外死亡,警方通過查閱死者的電腦和手機熏挎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門速勇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搀菩,你說我怎么就攤上這事偷拔〖菘祝” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵都伪,是天一觀的道長。 經(jīng)常有香客問我积担,道長陨晶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任帝璧,我火速辦了婚禮先誉,結果婚禮上,老公的妹妹穿的比我還像新娘的烁。我一直安慰自己褐耳,他們只是感情好,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布渴庆。 她就那樣靜靜地躺著漱病,像睡著了一般。 火紅的嫁衣襯著肌膚如雪把曼。 梳的紋絲不亂的頭發(fā)上杨帽,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機與錄音嗤军,去河邊找鬼注盈。 笑死,一個胖子當著我的面吹牛叙赚,可吹牛的內(nèi)容都是我干的老客。 我是一名探鬼主播僚饭,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼胧砰!你這毒婦竟也來了鳍鸵?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤尉间,失蹤者是張志新(化名)和其女友劉穎偿乖,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哲嘲,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡贪薪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了眠副。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片画切。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖囱怕,靈堂內(nèi)的尸體忽然破棺而出霍弹,到底是詐尸還是另有隱情,我是刑警寧澤娃弓,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布庞萍,位于F島的核電站,受9級特大地震影響忘闻,放射性物質(zhì)發(fā)生泄漏钝计。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一齐佳、第九天 我趴在偏房一處隱蔽的房頂上張望私恬。 院中可真熱鬧,春花似錦炼吴、人聲如沸本鸣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽荣德。三九已至,卻和暖如春童芹,著一層夾襖步出監(jiān)牢的瞬間涮瞻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工假褪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留署咽,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像宁否,于是被迫代替她去往敵國和親窒升。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355