
Unity接入Android微信登录-2025新版
本文详细介绍了如何在Unity中接入安卓的微信登录功能,而无需打开Android Studio。文章首先强调了Unity开发工程师的能力,并提供了环境参考。接着,文章分步骤讲解了整个流程,包括创建Activity、编写微信Java类、修改AndroidManifest、引入微信的OpenSDK、Unity客户端调用、打包测试等。每个步骤都附有详细的代码示例和注意事项,确保读者能够顺利操作。文章最后
文章目录
概要
Unity接入安卓的微信登录,我觉得使用AndroidStudio还是太繁琐了,有没有不用打开AS,又新又好的微信登录接入方法呢?
有的兄弟有的,首先关掉AS,看我整个教程的过程中不允许打开,想打开AS去接这原生SDK可以不用看了,实际上接入原生安卓SDK,大多数情况根本不用打开AndroidStudio
作为一个Unity开发工程师,你不能低估了自己,好了废话不多说了,直接干货教学
声明:为保证项目隐私性,我这里包名都写作com.mygame.bcx
环境参考:Unity2022.3.50 Gradle默认(7.5.2)AGP(7.1.2)jdk 11
流程
1.打开工程创建Activity
首先确认项目本身打安卓包不报错
我们观察自身项目,有没有实现一个继承UnityPlayerActivity的MainActivity,如果有的话在Unity中找到他,并移动到Plugins/Android下面,这个MainActivity主要是继承UnityPlayerActivity,方便调用原生安卓
在设置当中,需要开启这几个自定义的gradle文件,方便之后进行微信sdk的引入,做完这一步进行一次打包,看看会不会报错,是不是通的,以免后续不流畅
MainActivity代码如下,如果有需要接管的方法,直接重写对应的生命周期函数
package com.mygame.bcx;
import android.app.Application;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import com.unity3d.player.UnityPlayerActivity;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Set;
import com.tencent.mm.opensdk.modelmsg.SendAuth;
import com.tencent.mm.opensdk.constants.Build;
import com.tencent.mm.opensdk.modelpay.JumpToOfflinePay;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
public class MainActivity extends UnityPlayerActivity {
public IWXAPI wxapi = null;
public static String APPID;
private void regWx(String appid){
APPID = appid;
if (wxapi==null){
wxapi = WXAPIFactory.createWXAPI(this,APPID);
wxapi.registerApp(APPID);
}
}
public void Login(){
SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "wechat_sdk_demo_test";
wxapi.sendReq(req);
}
}
2.创建微信Java类
在Plugins/Android下直接创建名为com.mygame.bcx.wxapi的文件夹,然后再在文件夹当中创建名为WXEntryActivity.java文件(左图)对应老三样接入当中的(右图,你无需打开Androidstudio)
WXEntryActivity的代码如下:
package com.mygame.bcx.wxapi;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import com.mygame.bcx.MainActivity;
import com.tencent.mm.opensdk.modelbase.BaseReq;
import com.tencent.mm.opensdk.modelbase.BaseResp;
import com.tencent.mm.opensdk.modelmsg.SendAuth;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
import com.unity3d.player.UnityPlayer;
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
public IWXAPI wxapi = null;
public static String gameObjectName = "";
// WXLoginCallBack
public static String callBackFunctionName = "";
public static void setGameObjectName(String gameObjectName) {
WXEntryActivity.gameObjectName = gameObjectName;
}
public static void setCallBackFunctionName(String callBackFunctionName) {
WXEntryActivity.callBackFunctionName = callBackFunctionName;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (wxapi == null) {
wxapi = WXAPIFactory.createWXAPI(this, MainActivity.APPID);
}
wxapi.registerApp(MainActivity.APPID);
wxapi.handleIntent(getIntent(), this);
}
@Override
public void onReq(BaseReq baseReq) {
}
@Override
public void onResp(BaseResp baseResp) {
if (baseResp.getType() == 1) {
if (baseResp.errCode == BaseResp.ErrCode.ERR_OK) {
UnityPlayer.UnitySendMessage(gameObjectName, callBackFunctionName, ((SendAuth.Resp) baseResp).code);
} else if (baseResp.errCode == BaseResp.ErrCode.ERR_USER_CANCEL) {
UnityPlayer.UnitySendMessage(gameObjectName, callBackFunctionName, "cancel");
} else if (baseResp.errCode == BaseResp.ErrCode.ERR_AUTH_DENIED) {
UnityPlayer.UnitySendMessage(gameObjectName, callBackFunctionName, "reject");
} else {
UnityPlayer.UnitySendMessage(gameObjectName, callBackFunctionName, "oterError");
}
} else if (baseResp.getType() == 2) {
}
finish();
}
}
注意几个地方,就是包名要对应的填对,需要一一对应上,具体细节原理就不阐述了,gogogo出发咯,黑咖啡品味有多浓
3.修改AndroidManifest
打开目录下的AndroidManifest.xml
如果你启动就是直接启动Unity的游戏Activity,那就按照我这样写,如果你的项目存在一个隐私政策的Activity那你可能需要探索一下,网上有教学
代码如下AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mygame.bcx">
<queries>
<package android:name="com.tencent.mm"/>
</queries>
<application
android:allowBackup="true"
android:supportsRtl="true">
<activity android:name="com.mygame.bcx.MainActivity" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true"/>
</activity>
<activity
android:name="com.mygame.bcx.wxapi.WXEntryActivity"
android:launchMode="singleTask"
android:exported="true">
</activity>
</application>
</manifest>
4.引入微信的OpenSDK
微信早期版本是提供了下载的sdk,但是现在只通过gradle引入提供sdk了,所以我们在Unity当中进行gradle引入
打开之前在设置当中创建的自定义的mainTemplate,添加微信的sdk库引入,我这里接了tap的sdk,所以有很多tap的,虽然但是,你无需打开Androidstudio
对,就是填了就行,不用找那个大象在哪里点,因为你无需打开AndroidStudio
:不爱我就拉倒
5.Unity客户端调用
还是C#基于JO,JC,去调用,这里我写了一个单例,在其他地方先初始化,然后调用登录,如果报错需要自己实现一个单例模板,或者不用单例模板,原地实现单例
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class WXLoginAndroidHelper : MonoSingleton<WXLoginAndroidHelper>
{
public Text text_code;
private AndroidJavaClass mainActivityClass = null;
private AndroidJavaObject mainActivity = null;
private AndroidJavaClass WXEntryActivityClass = null;
private string APPID = "wx666666666666";
private string loginCode;
public void Init()
{
mainActivityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
mainActivity = mainActivityClass.GetStatic<AndroidJavaObject>("currentActivity");
mainActivity.Call("regWx", APPID);
WXEntryActivityClass = new AndroidJavaClass("com.mygame.bcx.wxapi.WXEntryActivity");
WXEntryActivityClass.CallStatic("setGameObjectName", this.gameObject.name);
WXEntryActivityClass.CallStatic("setCallBackFunctionName", "WXLoginCallBack");
}
public void Login()
{
mainActivity.Call("Login");
}
public void WXLoginCallBack(string str)
{
if (str != "cancel" && str != "reject" && str != "oterError")
{
Debug.Log("winner,code:" + str);
loginCode = str;
StartCoroutine(LoginByBackstage());
}
else
{
Debug.Log("loser,code是:" + str);
}
}
public IEnumerator LoginByBackstage()
{
//这里是我调用我们项目后台的微信登录接口,主要是APP秘钥不能存在客户端,按需实现
var response = Net.instance.WxGameLogin(loginCode);
yield return response;
if (response.result != null)
{
//这里是与我游戏客户端逻辑相关了,取到这个openID了我就要进游戏了,按照需要自行调整
SDKManager.Instance.OnSDKLoginSuccess(response.result.openid, Net.instance.Channel);
text_code.text = "OpenID:" + response.result.openid;
}
else
{
Debug.LogError("CNM!WxGameLogin failed!!");
Debug.LogError(response.result);
}
}
}
6.打包测试
经过以上步骤,微信登录sdk已经接入完成,然后就是打包测试,首先要确认你的工程本来就是可以出包的,然后再接sdk。
报错多半是打包环境没有配对,可以多了解一下打包的相关环境配置,Unity当中可以自定义打包环境,这里是我配的打包环境
7.小结
我的这种接入方式,基本是只在Android文件夹下进行操作,无需打开AndroidStudio,保证了接入工作的简化,非常适用于已经成熟集成的项目,有些CICD的内容,直接覆盖Android文件夹即可实现各种渠道sdk的集成
反思与总结扩展
其实Unity早已提供这种接入方式,虽然可以在AndroidStudio中集成,我不排斥,但是这会让小白望而却步,直接麻了。但是如果是有无法解决的问题,还是得导出AS工程看个究竟,这是没办法的事,还是要基本掌握,如果熟练接入了,其实不用as也能接的
那有人会问,“那我问你,你怎么在Unity当中存放供Android调用的图片?这你不导出AS不炸了吗?”
有的兄弟,有的:
在Plugins/Android下创建文件夹Android\res.androidlib\res\drawable
然后图片整里面,在调用的地方访问drawable里的资源就可以了
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bgg)
总的来说就是Unity基本上已经提供了大多数访问原生安卓的东西了,不需要再捣鼓那老三样了,导出class.jar,我只能说太复古了
还有网上有些帖子让你在AS里面创建Mainactivity,那我问你,如果项目已经有了,咋办,你导出的aar又算什么,零开始的项目接入倒是差不多,很多情况下不适用啊
以上就是本次Unity接入安卓原生微信登录的全流程
你无需打开AndroidStudio,即可接入原生安卓SDK
我是一只北辰星,谢谢你的观看~
好歌推荐《识光的旅人》
gogogo出发咯,黑咖啡品味有多浓
更多推荐
所有评论(0)