【Unity游戏开发】不接SDK也能在游戏内拉起加QQ群操作?

一、引子

  一般在游戏进行对外测试的时候都会有一个玩家QQ群,方便玩家反馈问题、交流游戏心得等。那么为了增加玩家加QQ群的欲望,可能会在游戏里面设计一个小功能,点击一下可以直接拉起手Q加群的操作,加了QQ群以后,也会自动下发一些小奖励刺激玩家。原本我以为要拉起手Q加QQ群的操作一定要接入相关平台的SDK才行,直到我详细地阅读了下腾讯官网的QQ群官方主页,我才了解到在游戏内拉起手Q发起加群的操作是如此的简单,根本不需要接入任何第三方SDK,只需短短几行代码即可轻松实现。闲言少叙,书归正文,咱们马上就开始实际操作一下。

二、解决方案

1.Android端的工作

  在腾讯官网的QQ群官方主页,我们可以直接看到官方已经为我们提供好了Android相关的代码,直接复制出来并集成到我们游戏项目对应的Android工程中就可以使用了。如果是使用Internal打包方式的话,可以在Eclispe编写Java的相关代码,然后打成jar包供Unity端调用。如果是使用Gradle方式的话,可以在项目导出AndroidStudio工程的过程中,自动化添加进这一段代码。关于使用Gradle方式进行非侵入式SDK接入打包,马三有在工作中有了一些新的心得体会,会在以后博客中讲解一下。(妈的这小子又挖坑,不会过段时间又太监了吧)

  

  图1:QQ群官网Android端代码

  在你的Java代码中添加以下代码即可,key不要写死在Java代码中,最好由Unity调用端传入:

 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端所需要做的工作就完成了,是不是超级方便哈~几乎啥也没干,蛤蛤。  

2.iOS端的工作

  再来看看我们需要在iOS端做些什么?其实跟Android端的工作大同小异,主要还是提供一个接口给Unity端调用。在腾讯官网的QQ群官方主页,官方也同样为我们提供好了iOS相关的代码,不过这些代码要在Unity上使用的话,还需要小小地改造和封装一下。轻轻点亮一个赞,咱们下面马上就现场教学,教大家怎么处理一下:

  

  图2:QQ群官网 iOS端代码

  在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中去调用这些接口了。

3.Unity端的工作

  简单地搭建一个模拟游戏中加群的界面,有一个二维码和一键加群按钮,我们期待的是玩家在游戏里面点击按钮就可以直接加入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加群。在开发工作中,有些问题可能并没有我们想象中的那么复杂,进行功能开发之前多阅读一下官方文档、收集下相关资料,说不定就会有更加简单优雅的解决方案。

如果觉得本篇博客对您有帮助,可以扫码小小地鼓励下马三,马三会写出更多的好文章,支持微信和支付宝哟!

       

作者:马三小伙儿
出处:https://www.cnblogs.com/msxh/p/11243588.html 
请尊重别人的劳动成果,让分享成为一种美德,欢迎转载。另外,文章在表述和代码方面如有不妥之处,欢迎批评指正。留下你的脚印,欢迎评论!

原文地址:https://www.cnblogs.com/msxh/p/11243588.html

时间: 2024-11-05 15:51:03

【Unity游戏开发】不接SDK也能在游戏内拉起加QQ群操作?的相关文章

【1】【MOOC】Python游戏开发入门-北京理工大学【第二部分-游戏开发之框架】

学习地址链接:http://www.icourse163.org/course/0809BIT021E-1001873001?utm_campaign=share&utm_medium=androidShare&utm_source=qq pygame安装方法:http://www.cnblogs.com/GraceSkyer/p/8004004.html 1.Pygame 简介与安装 Python优秀的第三方库SDL:各个操作系统上提供的一种能直接与计算机外设打交道的一个第三方库在这个库

【整理】HTML5游戏开发学习笔记(1)-骰子游戏

<HTML5游戏开发>,该书出版于2011年,似乎有些老,可对于我这样没有开发过游戏的人来说,却比较有吸引力,选择自己感兴趣的方向来学习html5,css3,相信会事半功倍.不过值得注意的是,该书的游戏是些小的游戏,内容相对比较基础,而且html5标准已经正式发布,可能会和书中所描述有少许出处.当然了,书中的小游戏还是比较不错的,适合我这样的前端开发不咋地的来练手,学习方式是在以自己的思路实现之后,再来看书中的实现思路,因为每个人有自己的开发习惯. 1.预备知识在做第一个骰子游戏开发前,必须知

游戏开发入门500vip全套源码下载游戏开发概述

1.游戏机发展500vip全套源码下载dsluntan.com 20世纪70年×××始 首款主机magnavox odysse80年代 红白机80-90年代 各类非FC主机(PS,NDS等) PC单机游戏90年代-2000年 局域网对战游戏2000年后 大型多人游戏 页游 手游现在 VR,AR ..2.游戏是如何开发出来的,开发流程是什么? 原始的游戏比较粗糙,内容也很少,一般就一个人开发,美术与策划都由自己完成(建议看看<doom启示录>). 随着游戏逐渐变得复杂,需要多人去合作完成,分工也

【Unity游戏开发之一】Time.timeScale=0暂停游戏的情况下播放动画

前提条件:在项目中用过Time.timeScale = 0来实现游戏暂停 问题: 暂停游戏后,暂停界面的按钮可能需要播放一个idle时的动画,Time.timeScale=0 会影响动画播放. 受Time.timeScale影响的因素: 1.物理模拟. FixedUpdate - 当Time.timeScale=0时,FixedUpdate 函数不会被执行. 2.Coroutines. - Time.timeScale=0 协程函数不会停止,但是会停止WaitForSeconds. 协成函数还是

Html5 Egret游戏开发 成语大挑战(七)游戏逻辑和数据处理

本篇在前面的基础上,将进行逻辑的编码开发让游戏能够正式的玩起来,这里没有注重太多的体验细节,而是直接实现游戏的规则逻辑,将分成两个部分说明:数据处理和游戏逻辑. 初始化游戏数据 在前面的第五篇中,我们通过数据的构建已经读取了所有的关卡数据在关卡选择界面中,LevelDataManager负责管理所有的关卡数据,在SceneLevels类中,当onclick_level触发时,就会切换到Game界面中,所以改造代码如下: private onclick_level(e:egret.TouchEve

Unity 3D正在革命游戏开发市场

转自知乎 [高风险的大型游戏开发] 传统上来说,开发游戏是一件费时费力的事情,而且80%的情况下开发游戏这件事就是一个灾难.因为游戏是一个交互艺术,这个交互不仅体现在娱乐方式上,也体现在开发过程中.修修补补是开发游戏的家常便饭.但是,由于传统的游戏开发至少涉及策划.美术和程序,因此任何一点微小的调整都需要各个环节通力合作才能勉强达成.而游戏的品质如何,往往要到最后开发出来一个版本才能看到.这时,项目往往已经开发到50%以上的进度了,无论做什么调整,都意味着巨大的先期投入. 然而幸运的是.虽然开发

Unity 4.x游戏开发技巧集锦第2章摄像机的应用

Unity 4.x游戏开发技巧集锦第2章摄像机的应用 作为游戏开发者,千万不要忽略了摄像机(Camera)的重要性.毕竟玩家是通过摄像机,才看到了游戏的视图.本章将介绍一些摄像机的常见应用.本文选自<Unity 4.x游戏开发技巧集锦> Unity 4.x游戏开发技巧集锦2.1  设置双游戏视图 很多游戏里,一个游戏的视图中,经常会包含另一个游戏视图.而两个视图所呈现的,是由两个摄像机在场景的不同位置所拍摄的画面.例如,<QQ飞车>中,除了第三人称视图以外,游戏视图的右侧还有一个跑

Unity 3D游戏开发引擎:最火的插件推荐

摘要:为了帮助使用Unity引擎的开发者制作更完美的游戏,我们精心挑选了十款Unity相关开发插件和工具.它们是:2D Toolkit.NGUI.Playmaker.EasyTouch & EasyJoystick.UnIDE.Tile Based Map and Nav.FX Maker.Toon shader.Top-Down Assets Mobile和83 Explosion Sound Effects. 作为当前最主流的3D游戏引擎之一,Unity拥有大量第三方插件和工具帮助开发者提升

史上最全最完整的IOS 游戏开发 PDF电子书定制下载

<iOS 5游戏开发>作者:(新西兰)James·Sugrue著 页数:191 出版社:北京市:人民邮电出版社 出版日期:2012.08 简介:<iOS5游戏开发>是一本iOS5游戏开发的基础入门书.全书使用通俗易懂的简单实例,带领读者经历构建经典动作游戏的整个周期.读者在本书的阅读过程中,将经历从开发概念.规划设计一直到编写实际代码的全过过程.本书的每一章,都将演示游戏创建过程中的一个逻辑步骤,读者将在其中学习如何创建Sprite,用触摸屏.重力感应器和屏幕游戏棒控制玩家角色等-