Unity3D安卓游戏第三方SDK接入

2024-08-31 18:36

本文主要是介绍Unity3D安卓游戏第三方SDK接入,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

PS:持续更新...

什么是SDK?

SDK(Software Development Kit,软件开发工具包)是一个用于构建应用程序的工具集,包含开发特定软件的必要工具、库、文档和示例代码。SDK通常由软件或硬件厂商提供,帮助开发者更容易地为特定平台、操作系统、设备或服务创建应用程序。

SDK的应用场景

1.平台开发:如Android、iOS等移动操作系统的SDK,提供了开发移动应用的所有必要资源。

2.服务集成:如云服务的SDK,帮助开发者快速集成和使用特定的云服务(如AWS、Google Cloud等)。

3.硬件开发:一些硬件厂商提供SDK,以便开发者创建与其硬件设备兼容的软件。

Google新版登录SDK--Credential

依赖项:

(1)implementation 'androidx.appcompat:appcompat:1.3.1'

(2)implementation "com.google.android.gms:play-services-auth:21.2.0"

(3)implementation "androidx.credentials:credentials:1.3.0-rc01"

(4)implementation "androidx.credentials:credentials-play-services-auth:1.3.0-rc01"

(5)implementation "com.google.android.libraries.identity.googleid:googleid:1.1.0"

接入流程:官方文档

常见错误:

1Failed to transform annotation-experimental-1.4.0.aar

2androidx.credentials.exceptions.GetCredentialProviderConfigurationException: getCredentialAsync no provider dependencies found - please ensure the desired provider dependencies are added

1.可能是设备的Google Play Service版本太低导致的,可以尝试更新设备的Google Play Service;

3During begin sign in, failure response from one tap: Missing Feature{name=auth_api_credentials_begin_sign_in, version=8}

1.提高依赖项"androidx.credentials:credentials"和"androidx.credentials:credentials-play-services-auth"的版本;

4During begin sign in, failure response from one tap: 10: [28444] Developer console is not set up correctly.

1.这个可能是因为Google后台配置问题,也可能是本地客户端ID设置错误所致;

5androidx.credentials.exceptions.GetCredentialCancellationException: activity is cancelled by the user.

1.这个可能是本地客户端ID设置错误所致;

特殊要求:

(1)设备Android系统版本最低为8.0,需要设备具备Google三件套(Google服务框架、Google Play服务、Google商店);

(2)需要设备具备VPN功能,能够访问Google服务(例如能够正常打开Google商店);

常见第三方SDK(海外)

1.Google身份验证SDK;

2.Google支付SDK;

3.AppsFlyer移动归因和营销分析SDK;

……

后台配置

Google登录SDK

1.登录Google Cloud后台,创建一个项目;

2.开启API和服务(Identity Toolkit API);

3.设置OAuth权限请求页面,添加测试用户;

4.添加OAuth2.0客户端ID,包括Web应用和Android,输入包名以及本地导包的jks的SHA-1指纹(Web应用的客户端ID将用于Google登录SDK);

5.值得注意的是,如果本地导包的jks发生改变,也应在后台更新SHA-1指纹,否则无法成功调用SDK。

Google支付SDK

1.这个需要Google开发者账号,需要在Google Play控制台配置商品信息;

2.还需要上传一个应用程序签名密钥,这个需要上传一个.zip文件,生成方法则是通过pepk将开发者账号的配套密钥的pem与本地开发所用的jks联合加密,然后导出为.zip文件;

3.注意开发者账号的配套密钥不能作为本地开发密钥,Google Play控制台为了安全考虑这种方式不被允许;

示例1

示例1将演示如何为Unity3D开发的Android项目接入Google登录SDK。

开发环境:

1.Android Studio 2024.1.0.0

2.Windows 10

3.Unity3D 2020.3.48f1c1

4.Android SDK 34 (Android Studio导出环境) Android SDK 10/11(Unity构建环境)

5.Android NDK 19.0.5232133(Unity构建环境、Android Studio导出环境)

6.JDK 11.0.24(Android Studio导出环境) JDK 1.8.0(Unity构建环境)

7.Gradle 6.1.1(Unity构建环境、Android Studio导出环境)

8.Gradle Plugin 4.0.1(Android Studio导出环境)

Unity配置:

1.Minimum api level 22

2.Target api level 34

运行环境:

1.Mumu模拟器,设备(OPPO K10 PGJM10),Android系统(12);

功能描述:

1.Unity3D 搭建UI界面,可供玩家交互,包括登录、注销登录、查看用户信息、退出游戏四个功能;

2.Android Studio接入Google身份验证SDK,需要登录、注销登录、发送提示信息三个功能;

流程描述:

1.玩家进入游戏;

2.玩家点击登录按钮,触发Google登录功能,需要对登录结果和异常进行反馈;

3.玩家点击注销登录按钮,触发Google注销登录功能,需要对注销登录结果和异常进行反馈;

4.玩家点击查看用户信息按钮,显示账户的Google id、名称、邮箱、邮箱是否验证信息,需要对异常进行反馈;

5.玩家点击退出游戏按钮,关闭游戏程序;

6.对于结果和异常反馈应采用定时关闭的提示框进行显示;

方法对应表:

方法/端口

AndroidJava

Unity3DC#

Unity3DC#)回调

登录

askLogin

OnLoginClick

OnLoginSuccess

注销登录

askLogout

OnLogoutClick

OnLogoutSuccess

发送提示信息

Null

SendTip

Null

用户信息表:

信息/端口

AndroidJava

与用户的 Google 帐号相关联的电子邮件地址

id

在条目上显示的显示名

name

用户的个人资料照片 URI

photo

用户的 Google ID Toekn

token

(1)Unity3D游戏代码

Tip.cs

using UnityEngine;
using UnityEngine.UI;// 提示框组件:用以显示提示框信息以及交互
public class Tip : MonoBehaviour
{[SerializeField] Text content;[SerializeField] Button close;public bool isUsed { get; private set; }public bool Send(string tip){if (isUsed || string.IsNullOrEmpty(tip)) return false;isUsed = true;content.text = tip;gameObject.SetActive(true);return true;}void Start(){close.onClick.AddListener(OnClose);}void OnClose(){gameObject.SetActive(false);isUsed = false;}
}

TipController.cs

using System.Collections.Generic;
using UnityEngine;// 提示框控制器组件:显示提示框的统一调用接口以及控制提示框
public class TipController : MonoBehaviour
{public Tip tip;static Queue<string> contents = new Queue<string>();const int MAX_COUNT = 10;public static void Send(string content){if (string.IsNullOrEmpty(content) || contents.Count >= MAX_COUNT) return;contents.Enqueue(content);}void Update(){if (contents.Count > 0 && tip.Send(contents.Peek()))contents.Dequeue();}
}

UILogic.cs

using System;
using System.Collections;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;// UI逻辑:UI交互相关的逻辑以及 Android 和 Unity 相互调用
public class UILogic : MonoBehaviour
{public Button login;public Button show;public Button logout;public Button quit;public ScrollRect showView;public RawImage portrait;public Text showText;public Button showViewCloseButton;AndroidJavaObject jo;UserData userData;bool isLoginSuccess;void Start(){jo = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");login.onClick.AddListener(OnLoginClick);show.onClick.AddListener(OnShowClick);logout.onClick.AddListener(OnLogoutClick);quit.onClick.AddListener(OnQuitClick);showViewCloseButton.onClick.AddListener(OnShowViewCloseClick);}void OnDestroy(){jo.Dispose();}void OnLoginClick(){jo.Call("askLogin");}void OnShowClick(){if (!isLoginSuccess){TipController.Send("请先进行登录。");return;}if (portrait.texture == null) StartCoroutine(LoadPortrait(userData.photo));if (string.IsNullOrEmpty(showText.text)){StringBuilder builder = new StringBuilder().Append("Gmail:" + userData.id).Append("\nUserName:" + userData.name).Append("\nToken:" + userData.token);showText.text = builder.ToString();}showView.gameObject.SetActive(true);}void OnLogoutClick(){jo.Call("askLogout");}void OnQuitClick(){Application.Quit();}void OnShowViewCloseClick(){showView.gameObject.SetActive(false);}IEnumerator LoadPortrait(string uri){using (UnityWebRequest www = UnityWebRequestTexture.GetTexture(uri)){yield return www.SendWebRequest();if (www.result != UnityWebRequest.Result.Success)TipController.Send("头像加载失败!");else{Texture2D texture = DownloadHandlerTexture.GetContent(www);portrait.texture = texture;}}}// ************************** Java Call CSharp ******************************// 登录成功回调:带有用户信息public void OnLoginSuccess(string jsonStr){try{Debug.Log(jsonStr);userData = JsonUtility.FromJson<UserData>(jsonStr);Debug.Log(userData);isLoginSuccess = true;}catch (Exception ex){TipController.Send("用户信息获取失败,请尝试重新登录。");Debug.LogError(ex.Message);}}// 注销登录成功回调public void OnLogoutSuccess(string value){isLoginSuccess = false;}// 信息提示public void SendTip(string content){TipController.Send(content);}
}

UserData.cs

// 用户信息:记录Google登录用户的信息结构体[System.Serializable]
public struct UserData
{// 与用户的 Google 帐号相关联的电子邮件地址public string id;// 在条目上显示的显示名public string name;// 用户的个人资料照片 URIpublic string photo;// 用户的 Google ID Toeknpublic string token;public override string ToString(){return $"[id:{id},name:{name},photo:{photo},token:{token}]";}
}

(2)Android端Java代码(部分)

UnityPlayerActivity.java

// ****************************** Unity Call *******************************public void askLogin(){GetGoogleIdOption googleIdOption = new GetGoogleIdOption.Builder().setFilterByAuthorizedAccounts(false).setAutoSelectEnabled(true).setServerClientId(getString(R.string.WEB_CLIENT_ID)).build();GetCredentialRequest request = new GetCredentialRequest.Builder().addCredentialOption(googleIdOption).build();CancellationSignal signal = new CancellationSignal();signal.setOnCancelListener(() -> {Log.d(TAG, "askLogin: Preparing credentials with Google was cancelled.");sendTip("你已取消登录!");});getCredentialManager().getCredentialAsync(this,request,signal,Executors.newSingleThreadExecutor(),new CredentialManagerCallback<GetCredentialResponse, GetCredentialException>() {@Overridepublic void onResult(GetCredentialResponse result) {handleSignIn(result);}@Overridepublic void onError(GetCredentialException e) {Log.e(TAG, "askLogin: ", e);sendTip("登录失败!");}});
}public void askLogout(){ClearCredentialStateRequest clearCredentialStateRequest = new ClearCredentialStateRequest();android.os.CancellationSignal cancellationSignal = new android.os.CancellationSignal();cancellationSignal.setOnCancelListener(() -> {Log.d(TAG, "askLoginOut:Preparing credentials with Google was cancelled.");sendTip("你已取消注销登录操作!");});if (credentialManager != null) {getCredentialManager().clearCredentialStateAsync(clearCredentialStateRequest,cancellationSignal,Executors.newSingleThreadExecutor(),new CredentialManagerCallback<Void, ClearCredentialException>() {@Overridepublic void onResult(Void unused) {Log.d(TAG, "askLoginOut:google注销登录成功");sendTip("注销登录成功!");UnityPlayer.UnitySendMessage("Canvas","OnLogoutSuccess","");}@Overridepublic void onError(ClearCredentialException e) {Log.e(TAG, "askLoginOut:" , e);sendTip("注销登录失败!");}});}
}// ****************************** Java Call *******************************private void sendTip(String content){UnityPlayer.UnitySendMessage("Canvas","SendTip",content);
}// ****************************** Google Login SDK *******************************private CredentialManager getCredentialManager(){if(credentialManager == null)credentialManager = CredentialManager.create(this);return credentialManager;
}private void handleSignIn(GetCredentialResponse result) {// Handle the successfully returned credential.Credential credential = result.getCredential();if (credential instanceof PublicKeyCredential) {String responseJson = ((PublicKeyCredential) credential).getAuthenticationResponseJson();// Share responseJson i.e. a GetCredentialResponse on your server to validate and authenticate} else if (credential instanceof PasswordCredential) {String username = ((PasswordCredential) credential).getId();String password = ((PasswordCredential) credential).getPassword();// Use id and password to send to your server to validate and authenticate} else if (credential instanceof CustomCredential) {if (GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL.equals(credential.getType())) {// Use googleIdTokenCredential and extract id to validate and// authenticate on your serverGoogleIdTokenCredential googleIdTokenCredential = GoogleIdTokenCredential.createFrom(credential.getData());String idToken = googleIdTokenCredential.getIdToken();try {JSONObject googleLoginInfoReturn = new JSONObject();googleLoginInfoReturn.put("id", googleIdTokenCredential.getId());googleLoginInfoReturn.put("name",googleIdTokenCredential.getDisplayName());googleLoginInfoReturn.put("photo",googleIdTokenCredential.getProfilePictureUri());googleLoginInfoReturn.put("token",idToken);Log.d(TAG, "handleSignIn: "+ googleLoginInfoReturn);sendTip("登录成功!");UnityPlayer.UnitySendMessage("Canvas","OnLoginSuccess",googleLoginInfoReturn.toString());} catch (JSONException e) {Log.e(TAG, "handleSignIn: ", e);sendTip("用户信息解析异常!");}} else {// Catch any unrecognized custom credential type here.Log.d(TAG, "handleSignIn: Unexpected type of credential");sendTip("未知的登录方式!");}} else {// Catch any unrecognized credential type here.Log.d(TAG, "handleSignIn: Unexpected type of credential");sendTip("未知的登录方式!");}
}

 视频

Google登录SDK

如果这篇文章对你有帮助,请给作者点个赞吧!  

这篇关于Unity3D安卓游戏第三方SDK接入的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1124680

相关文章

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法   消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法 [转载]原地址:http://blog.csdn.net/x605940745/article/details/17911115 消除SDK更新时的“

如何更优雅地对接第三方API

如何更优雅地对接第三方API 本文所有示例完整代码地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/third 我们在日常开发过程中,有不少场景会对接第三方的API,例如第三方账号登录,第三方服务等等。第三方服务会提供API或者SDK,我依稀记得早些年Maven还没那么广泛使用,通常要对接第三方

火柴游戏java版

代码 /*** 火柴游戏* <p>* <li>有24根火柴</li>* <li>组成 A + B = C 等式</li>* <li>总共有多少种适合方式?</li>* <br>* <h>分析:</h>* <li>除去"+"、"="四根,最多可用火柴根数20根。</li>* <li>全部用两根组合成"1",最大数值为1111。使用枚举法,A和B范围在0~1111,C为A+B。判断</li>** @

Unity3D自带Mouse Look鼠标视角代码解析。

Unity3D自带Mouse Look鼠标视角代码解析。 代码块 代码块语法遵循标准markdown代码,例如: using UnityEngine;using System.Collections;/// MouseLook rotates the transform based on the mouse delta./// Minimum and Maximum values can

Unity3D 运动之Move函数和translate

CharacterController.Move 移动 function Move (motion : Vector3) : CollisionFlags Description描述 A more complex move function taking absolute movement deltas. 一个更加复杂的运动函数,每次都绝对运动。 Attempts to

国产游戏行业的崛起与挑战:技术创新引领未来

国产游戏行业的崛起与挑战:技术创新引领未来 近年来,国产游戏行业蓬勃发展,技术水平不断提升,许多优秀作品在国际市场上崭露头角。从画面渲染到物理引擎,从AI技术到服务器架构,国产游戏已实现质的飞跃。然而,面对全球游戏市场的激烈竞争,国产游戏技术仍然面临诸多挑战。本文将探讨这些挑战,并展望未来的机遇,深入分析IT技术的创新将如何推动行业发展。 国产游戏技术现状 国产游戏在画面渲染、物理引擎、AI

安卓玩机工具------小米工具箱扩展工具 小米机型功能拓展

小米工具箱扩展版                     小米工具箱扩展版 iO_Box_Mi_Ext是由@晨钟酱开发的一款适用于小米(MIUI)、多亲(2、2Pro)、多看(多看电纸书)的多功能工具箱。该工具所有功能均可以免root实现,使用前,请打开开发者选项中的“USB调试”  功能特点 【小米工具箱】 1:冻结MIUI全家桶,隐藏状态栏图标,修改下拉通知栏图块数量;冻结

第四次北漂----挣个独立游戏的素材钱

第四次北漂,在智联招聘上,有个小公司主动和我联系。面试了下,决定入职了,osg/osgearth的。月薪两万一。 大跌眼镜的是,我入职后,第一天的工作内容就是接手他的工作,三天后他就离职了。 我之所以考虑入职,是因为 1,该公司有恒歌科技的freex平台源码,可以学学,对以前不懂的解解惑。 2,挣点素材钱,看看张亮002的视频,他用了6000多,在虚幻商城买的吸血鬼游戏相关的素材,可以玩两年。我