【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调用端传入:
/****************
*
* 发起添加群流程。群号:ColaFramework交流群(421527940) 的 key 为: xxxxxxxxx
* 调用 joinQQGroup(xxxxxxxxx) 即可发起手Q客户端申请加群 ColaFramework交流群(421527940)
*
* @param key 由官网生成的key
* @return 返回true表示呼起手Q成功,返回fals表示呼起失败
******************/
public boolean joinQQGroup(String key) {
Intent intent = new Intent();
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));
// 此Flag可根据具体产品需要自定义,如设置,则在加群界面按返回,返回手Q主界面,不设置,按返回会返回到呼起产品界面 //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
try {
startActivity(intent);
return true;
} catch (Exception e) {
// 未安装手Q或安装的版本不支持
return false;
}
}
至此我们Android端所需要做的工作就完成了,是不是超级方便哈~几乎啥也没干,蛤蛤。
2.iOS端的工作
再来看看我们需要在iOS端做些什么?其实跟Android端的工作大同小异,主要还是提供一个接口给Unity端调用。在腾讯官网的QQ群官方主页,官方也同样为我们提供好了iOS相关的代码,不过这些代码要在Unity上使用的话,还需要小小地改造和封装一下。轻轻点亮一个赞,咱们下面马上就现场教学,教大家怎么处理一下:
图2:QQ群官网 iOS端代码
在Unity工程对应的iOS工程中的UnityAppController.mm中添加以下的代码就可以了。相较于Android,iOS上面还需要多传入一个uid参数。而且Unity端这边传过来的是const char *类型的字符串指针,我们需要将其转换成 NSString 以便供API调用。
extern "C" BOOL iOSJoinQQGroup(const char* rawKey,const char* rawUid){
NSString * key = [NSString stringWithUTF8String:rawKey];
NSString * uid = [NSString stringWithUTF8String:rawUid];
NSString *urlStr = [NSString stringWithFormat:@"mqqapi://card/show_pslcard?src_type=internal&version=1&uin=%@&key=%@&card_type=group&source=external", uid,key];
NSURL *url = [NSURL URLWithString:urlStr];
if([[UIApplication sharedApplication] canOpenURL:url]){
[[UIApplication sharedApplication] openURL:url];
return YES;
}
else return NO;
}
至此,我们在iOS端需要做的工作也完成了,下一步就是在Unity中去调用这些接口了。
3.Unity端的工作
简单地搭建一个模拟游戏中加群的界面,有一个二维码和一键加群按钮,我们期待的是玩家在游戏里面点击按钮就可以直接加入QQ群。
图3:游戏界面示意图
对应的C#代码如下,就是一些简单的封装与Unity和Android、iOS端通信交互的基本操作,如果对这块不太了解的话,可以看马三之前的博客《【Unity游戏开发】SDK接入与集成——小白入门篇》。值得注意的是,我们需要处理好不同平台下调用的问题,加入必要的平台宏判断,在Unity编辑器下运行的这种情况也要考虑进去。
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;
using UnityEngine.UI; public class MyScript : MonoBehaviour
{ private static readonly string AndroidKey = "YouAndroidQQGroupKey"; private static readonly string iOSUid = "YouiOSUid";
private static readonly string iOSKey = "YouiOSQQGroupKey"; private AndroidJavaClass _jc;
private AndroidJavaObject _jo; // Use this for initialization
void Start()
{
_jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
_jo = _jc.GetStatic<AndroidJavaObject>("currentActivity"); var btnObj = this.transform.Find("BtnQQ");
var button = btnObj.GetComponent<Button>();
button.onClick.AddListener(OnClick);
} private void OnClick()
{
bool result = JoinQQGroup();
if (result)
{
//TODO 你的业务逻辑
}
else
{
Debug.LogWarning("未安装手Q或者版本不支持!");
}
} /// <summary>
/// 加入QQ群的方法,有返回值,代表成功或者失败
/// </summary>
/// <returns></returns>
private bool JoinQQGroup()
{
#if !UNITY_EDITOR && UNITY_ANDROID
return CallAndroidMethod<bool>("joinQQGroup", AndroidKey);
#elif !UNITY_EIDTOR && UNITY_IOS
return iOSJoinQQGroup(iOSKey, iOSUid);
#else
return false;
#endif
} /// <summary>
/// 调用一个带有返回值的原生Android方法
/// </summary>
/// <typeparam name="ReturnType"></typeparam>
/// <param name="method"></param>
/// <param name="args"></param>
/// <returns></returns>
private ReturnType CallAndroidMethod<ReturnType>(string method, params object[] args)
{
#if !UNITY_EDITOR && UNITY_ANDROID
return _jo.Call<ReturnType>(method, args);
#endif
return default(ReturnType);
} //iOS方法导入
#if !UNITY_EDITOR && UNITY_IOS
[DllImport("__Internal")]
private static extern bool iOSJoinQQGroup(string key, string uid);
#endif }
图4:在编辑器下调用的结果
Android和iOS的效果马三就不单独打包展示了,感兴趣的话,大家可以自己打包测试一下。
三、总结
在本篇博客中,马三和大家一起学习了如何实现在不接SDK的情况在手机上拉起手Q加群。在开发工作中,有些问题可能并没有我们想象中的那么复杂,进行功能开发之前多阅读一下官方文档、收集下相关资料,说不定就会有更加简单优雅的解决方案。
本篇博客中的项目代码已经同步至Github,欢迎Fork! https://github.com/XINCGer/Unity3DTraining/tree/master/SDK/PullUpQQGroupDemo
如果觉得本篇博客对您有帮助,可以扫码小小地鼓励下马三,马三会写出更多的好文章,支持微信和支付宝哟!
作者:马三小伙儿
出处:https://www.cnblogs.com/msxh/p/11243588.html
请尊重别人的劳动成果,让分享成为一种美德,欢迎转载。另外,文章在表述和代码方面如有不妥之处,欢迎批评指正。留下你的脚印,欢迎评论!
【Unity游戏开发】不接SDK也能在游戏内拉起加QQ群操作?的更多相关文章
- 【1】【MOOC】Python游戏开发入门-北京理工大学【第二部分-游戏开发之框架】
学习地址链接:http://www.icourse163.org/course/0809BIT021E-1001873001?utm_campaign=share&utm_medium=and ...
- 微信公 众平台开发,用于个人技术交流,有兴趣的加QQ群432921500
微信公 众平台开发,用于个人技术交流,有兴趣的加QQ群432921500
- 【整理】HTML5游戏开发学习笔记(1)- 骰子游戏
<HTML5游戏开发>,该书出版于2011年,似乎有些老,可对于我这样没有开发过游戏的人来说,却比较有吸引力,选择自己感兴趣的方向来学习html5,css3,相信会事半功倍.不过值得注意的 ...
- Html5 Egret游戏开发 成语大挑战(七)游戏逻辑和数据处理
本篇在前面的基础上,将进行逻辑的编码开发让游戏能够正式的玩起来,这里没有注重太多的体验细节,而是直接实现游戏的规则逻辑,将分成两个部分说明:数据处理和游戏逻辑. 初始化游戏数据 在前面的第五篇中,我们 ...
- cocos2d-x游戏开发系列教程-中国象棋05-开始游戏
前情回顾 通过CCMainMenu的init函数,已经把所有的按钮,棋子都摆放完毕了,但是这个时候,棋子是不能走动的,只有在开始游戏之后才能移动棋子. 点击
- 【整理】HTML5游戏开发学习笔记(5)- 猜谜游戏
距上次学习笔记已有一个多月过去了,期间由于新项目赶进度,以致该学习计划给打断,十分惭愧.书本中的第六章的例子相对比较简单.所以很快就完成. 1.预备知识html5中video标签的熟悉 2.实现思路对 ...
- 【整理】HTML5游戏开发学习笔记(4)- 记忆力游戏
1.预备知识(1)Canvas绘制多边形(2)Canvas绘制文字 2.实现思路涉及的对象 (1)场景Scene 场景代表了画布上的一块区域,场景里的每个物体都是场景里的一个元素,其绘制统一由场景 ...
- Unity 3D游戏开发引擎:最火的插件推荐
摘要:为了帮助使用Unity引擎的开发人员制作更完美的游戏.我们精心挑选了十款相关开发插件和工具.它们是:2D Toolkit.NGUI.Playmaker.EasyTouch & EasyJ ...
- 喵的Unity游戏开发之路 - 推球:游戏中的物理
很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本文不 ...
随机推荐
- Python之二叉树Binarytree
二叉树是树的简化版,除根节点之外的所有节点都有一个父节点,任意节点都可以最多有一个左子节点和右子节点. 二叉树的遍历是非常重要的算法,主要分为深度优先遍历和广度优先遍历. 其中深度优先遍历按照访问根节 ...
- 优秀的Restful API应该是什么样的
1 你一直在错误的使用http协议 现在微服务真是火的一塌糊涂!大街小巷,逢人必谈微服务,各路大神纷纷忙着把自家的单体服务拆解成多个Web微小服务!而作为微服务之间通信的桥梁,Web API的设计就显 ...
- Jmeter 如何把数据库的数据依次获取作为参数传入下一个请求?附栗子
某一天碰到一个问题,觉得很有必要整理一篇文章出来~ 因为项目的原因,假设我们要实现如下要求: 从数据库的用户表里获取用户信息,并作为参数全部传递给登录请求,分别完成登录操作. 一.jmeter连接数据 ...
- Spring注解?啥玩意?
目录 基础概念:@Bean 和 @Configuration 使用AnnotationConfigApplicationContext 实例化Spring容器 简单的构造 使用register注册IO ...
- 【Netty4】深入学习Netty
Netty is an asynchronous event-driven network application framework for rapid development of mainta ...
- ph模拟登录获取信息
cURL 是一个功能强大的PHP库,使用PHP的cURL库可以简单和有效地抓取网页并采集内容,设置cookie完成模拟登录网页,curl提供了丰富的函数,开发者可以从PHP手册中获取更多关于cURL信 ...
- C# Redis分布式锁(基于ServiceStack.Redis)
相关的文章其实不少,我也从中受益不少,但是还是想自己梳理一下,毕竟自己写的更走心! 首先给出一个拓展类,通过拓展方法实现加锁和解锁. 注:之所以增加拓展方法,是因为合理使用拓展类(方法),可以让程序更 ...
- Javascript中escape(), encodeURI()和encodeURIComponent()之精析与比较
escape(), encodeURI()和encodeURIComponent()是在Javascript中用于编码字符串的三个常用的方法,而他们之间的异同却困扰了很多的Javascript初学者, ...
- Spring 入门程序
1.0 导包的时候要注意: 以上的第一个是.class文件 以上的第二个是文件的解释性页面. 以上的第三个是.java文件 2.0 配置文件需要导入依赖(有dtd 依赖,也有xsd依赖) ² 从be ...
- scikit-learn算法选择路径图
 原文链接:https://blog.csdn.net/guang_mang/article/details/73658496