通常在遊戲進行對外測試的時候都會有一個玩家QQ羣,方便玩家反饋問題、交流遊戲心得等。那麼爲了增長玩家加QQ羣的慾望,可能會在遊戲裏面設計一個小功能,點擊一下能夠直接拉起手Q加羣的操做,加了QQ羣之後,也會自動下發一些小獎勵刺激玩家。本來我覺得要拉起手Q加QQ羣的操做必定要接入相關平臺的SDK才行,直到我詳細地閱讀了下騰訊官網的QQ羣官方主頁,我才瞭解到在遊戲內拉起手Q發起加羣的操做是如此的簡單,根本不須要接入任何第三方SDK,只需短短几行代碼便可輕鬆實現。閒言少敘,書歸正文,我們立刻就開始實際操做一下。html
在騰訊官網的QQ羣官方主頁,咱們能夠直接看到官方已經爲咱們提供好了Android相關的代碼,直接複製出來並集成到咱們遊戲項目對應的Android工程中就可使用了。若是是使用Internal打包方式的話,能夠在Eclispe編寫Java的相關代碼,而後打成jar包供Unity端調用。若是是使用Gradle方式的話,能夠在項目導出AndroidStudio工程的過程當中,自動化添加進這一段代碼。關於使用Gradle方式進行非侵入式SDK接入打包,馬三有在工做中有了一些新的心得體會,會在之後博客中講解一下。(媽的這小子又挖坑,不會過段時間又太監了吧)android
圖1:QQ羣官網Android端代碼git
在你的Java代碼中添加如下代碼便可,key不要寫死在Java代碼中,最好由Unity調用端傳入:github
1 /**************** 2 * 3 * 發起添加羣流程。羣號:ColaFramework交流羣(421527940) 的 key 爲: xxxxxxxxx 4 * 調用 joinQQGroup(xxxxxxxxx) 便可發起手Q客戶端申請加羣 ColaFramework交流羣(421527940) 5 * 6 * @param key 由官網生成的key 7 * @return 返回true表示呼起手Q成功,返回fals表示呼起失敗 8 ******************/ 9 public boolean joinQQGroup(String key) { 10 Intent intent = new Intent(); 11 intent.setData(Uri.parse("mqqopensdkapi://bizAgent/qm/qr?url=http%3A%2F%2Fqm.qq.com%2Fcgi-bin%2Fqm%2Fqr%3Ffrom%3Dapp%26p%3Dandroid%26k%3D" + key)); 12 // 此Flag可根據具體產品須要自定義,如設置,則在加羣界面按返回,返回手Q主界面,不設置,按返回會返回到呼起產品界面 //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) 13 try { 14 startActivity(intent); 15 return true; 16 } catch (Exception e) { 17 // 未安裝手Q或安裝的版本不支持 18 return false; 19 } 20 }
至此咱們Android端所須要作的工做就完成了,是否是超級方便哈~幾乎啥也沒幹,蛤蛤。 api
再來看看咱們須要在iOS端作些什麼?其實跟Android端的工做大同小異,主要仍是提供一個接口給Unity端調用。在騰訊官網的QQ羣官方主頁,官方也一樣爲咱們提供好了iOS相關的代碼,不過這些代碼要在Unity上使用的話,還須要小小地改造和封裝一下。輕輕點亮一個贊,我們下面立刻就現場教學,教你們怎麼處理一下:微信
圖2:QQ羣官網 iOS端代碼app
在Unity工程對應的iOS工程中的UnityAppController.mm中添加如下的代碼就能夠了。相較於Android,iOS上面還須要多傳入一個uid參數。並且Unity端這邊傳過來的是const char *類型的字符串指針,咱們須要將其轉換成 NSString 以便供API調用。編輯器
1 extern "C" BOOL iOSJoinQQGroup(const char* rawKey,const char* rawUid){ 2 NSString * key = [NSString stringWithUTF8String:rawKey]; 3 NSString * uid = [NSString stringWithUTF8String:rawUid]; 4 NSString *urlStr = [NSString stringWithFormat:@"mqqapi://card/show_pslcard?src_type=internal&version=1&uin=%@&key=%@&card_type=group&source=external", uid,key]; 5 NSURL *url = [NSURL URLWithString:urlStr]; 6 if([[UIApplication sharedApplication] canOpenURL:url]){ 7 [[UIApplication sharedApplication] openURL:url]; 8 return YES; 9 } 10 else return NO; 11 }
至此,咱們在iOS端須要作的工做也完成了,下一步就是在Unity中去調用這些接口了。post
簡單地搭建一個模擬遊戲中加羣的界面,有一個二維碼和一鍵加羣按鈕,咱們期待的是玩家在遊戲裏面點擊按鈕就能夠直接加入QQ羣。學習
圖3:遊戲界面示意圖
對應的C#代碼以下,就是一些簡單的封裝與Unity和Android、iOS端通訊交互的基本操做,若是對這塊不太瞭解的話,能夠看馬三以前的博客《【Unity遊戲開發】SDK接入與集成——小白入門篇》。值得注意的是,咱們須要處理好不一樣平臺下調用的問題,加入必要的平臺宏判斷,在Unity編輯器下運行的這種狀況也要考慮進去。
1 using System.Collections; 2 using System.Collections.Generic; 3 using System.Runtime.InteropServices; 4 using UnityEngine; 5 using UnityEngine.UI; 6 7 public class MyScript : MonoBehaviour 8 { 9 10 private static readonly string AndroidKey = "YouAndroidQQGroupKey"; 11 12 private static readonly string iOSUid = "YouiOSUid"; 13 private static readonly string iOSKey = "YouiOSQQGroupKey"; 14 15 private AndroidJavaClass _jc; 16 private AndroidJavaObject _jo; 17 18 // Use this for initialization 19 void Start() 20 { 21 _jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 22 _jo = _jc.GetStatic<AndroidJavaObject>("currentActivity"); 23 24 var btnObj = this.transform.Find("BtnQQ"); 25 var button = btnObj.GetComponent<Button>(); 26 button.onClick.AddListener(OnClick); 27 } 28 29 private void OnClick() 30 { 31 bool result = JoinQQGroup(); 32 if (result) 33 { 34 //TODO 你的業務邏輯 35 } 36 else 37 { 38 Debug.LogWarning("未安裝手Q或者版本不支持!"); 39 } 40 } 41 42 /// <summary> 43 /// 加入QQ羣的方法,有返回值,表明成功或者失敗 44 /// </summary> 45 /// <returns></returns> 46 private bool JoinQQGroup() 47 { 48 #if !UNITY_EDITOR && UNITY_ANDROID 49 return CallAndroidMethod<bool>("joinQQGroup", AndroidKey); 50 #elif !UNITY_EIDTOR && UNITY_IOS 51 return iOSJoinQQGroup(iOSKey, iOSUid); 52 #else 53 return false; 54 #endif 55 } 56 57 /// <summary> 58 /// 調用一個帶有返回值的原生Android方法 59 /// </summary> 60 /// <typeparam name="ReturnType"></typeparam> 61 /// <param name="method"></param> 62 /// <param name="args"></param> 63 /// <returns></returns> 64 private ReturnType CallAndroidMethod<ReturnType>(string method, params object[] args) 65 { 66 #if !UNITY_EDITOR && UNITY_ANDROID 67 return _jo.Call<ReturnType>(method, args); 68 #endif 69 return default(ReturnType); 70 } 71 72 //iOS方法導入 73 #if !UNITY_EDITOR && UNITY_IOS 74 [DllImport("__Internal")] 75 private static extern bool iOSJoinQQGroup(string key, string uid); 76 #endif 77 78 }
圖4:在編輯器下調用的結果
Android和iOS的效果馬三就不單獨打包展現了,感興趣的話,你們能夠本身打包測試一下。
在本篇博客中,馬三和你們一塊兒學習瞭如何實如今不接SDK的狀況在手機上拉起手Q加羣。在開發工做中,有些問題可能並無咱們想象中的那麼複雜,進行功能開發以前多閱讀一下官方文檔、收集下相關資料,說不定就會有更加簡單優雅的解決方案。
本篇博客中的項目代碼已經同步至Github,歡迎Fork! https://github.com/XINCGer/Unity3DTraining/tree/master/SDK/PullUpQQGroupDemo
若是以爲本篇博客對您有幫助,能夠掃碼小小地鼓勵下馬三,馬三會寫出更多的好文章,支持微信和支付寶喲!
做者:馬三小夥兒
出處:http://www.javashuo.com/article/p-ziupyguo-ey.html 請尊重別人的勞動成果,讓分享成爲一種美德,歡迎轉載。另外,文章在表述和代碼方面若有不妥之處,歡迎批評指正。留下你的腳印,歡迎評論!