域名如何绑定网站,平面设计师网站都有哪些,网站建设51cto,wordpress数据库信息文件注#xff1a;因为本人也是第一次接入广告与支付SDK相关的操作#xff0c;网上也查了很多教程#xff0c;很多也都是只言片语或者缺少一些关键步骤的说明#xff0c;导致本人也是花了很多时间与精力踩了很多的坑才搞定#xff0c;发出来也是希望能帮助到其他人在遇到相似问…注因为本人也是第一次接入广告与支付SDK相关的操作网上也查了很多教程很多也都是只言片语或者缺少一些关键步骤的说明导致本人也是花了很多时间与精力踩了很多的坑才搞定发出来也是希望能帮助到其他人在遇到相似问题的时候能少踩坑少熬夜少加班至少能提供一个解决问题的思路理论上该经验可适用于任意版本的SDK接入总归思路都是差不多的文章内容可能会不定期修改如果存在不准确或理解错误的地方可评论区通知我进行修改
注意翻墙问题毕竟国内对于国外的网站很多是没办法进行访问的。
文章中所使用的各软件及插件版本说明可能存在遗留的地方可能后期修改补档吧大部分通用没问题大概率不会改了
Unity2022.3.15
Unity所使用的 Google SDK9.0.0一开始使用的8.5版本结果刚好弄完的时候该版本弃用了只能换成了9.0.0但9.0中所使用的SDK版本是23版本的23版本需要JDK17与Gradle8.0才能编译所以只能导出到Android Studio进行编译
Google Play 支付采用的是接入原生支付进行操作的版本为6.0文章中主要包含一些经验总结因为思路总体也是参考了其他人的文章
1、广告SDK接入
Google SDK获取地址Google 广告 SDK Mobile Ads SDK (Unity)
需要关注的点
1、广告SDK弃用时间相关链接弃用和停用 | Unity | Google for Developers 注意其中的版本信息对应的是Android原生SDK的版本信息新手注意别搞混了Unity所使用的插件中的版本信息需要从Github中对应版本的日志中进行查看
2、Android Gradle插件可使用的Gradle版本相关链接Android Gradle 插件 8.7 版本说明 | Android Studio | Android Developers注意让看这个主要是为了后边使用Android Studio进行编译的时候知道该用那个版本进行编译
3、广告SDK接入流程并不复杂心平气和看完操作步骤就可以搞定别像我一样的因为加班太多太过浮躁导致简单的问题复杂化所以具体接入步骤不做详细说明根据SDK获取的界面中按照官方的步骤进行接入即可需注意的关注的是SDK所使用的JDK版本、Gradle版本是否与当前Unity版本是否兼容例如本人使用的是Unity2022.3.15广告SDK的9.0版本而Unity2022没有办法更换使用JDK17(至少我没找到办法)所以需要导出到Android Studio进行打包操作
4、打包时google Setting中的应用id一定要填写不填写的话就算打包成功了进行安装后同样也会因为ID未找到从而无法成功运行应用
5、接入的SDK版本较低时SDK被弃用后可以在安卓日志中看到Google的通知广告不会正常播放效果就是点击后没有任何效果
6、成功接入广告并打包后正常情况下就可以看到广告的内容
7、播放广告后的奖励回调函数记得一定使用协程进行操作也就说传入的回调函数可以是普通函数但关于传入的回调函数的最终执行时一定使用一个协程去运行 因为直接进行调用会导致应用直接就给闪退了
关于广告的部分就先到这里因为广告的接入不难难点都在打包的过程中了 2、原生支付SDK接入
接入原生支付后也就是加入jar包后需要打包后才能看到效果在编辑器中是没有办法看到效果的
先说明一下思路来源相关链接
Unity接入GooglePlay内购V4 V5 V6(源生Android方式)_unity接入google内购-CSDN博客
后台UnityPlayer.UnitySendMessage不生效(Android) | 梓喵出没
第一个链接为参考原生支付接入的方法而第二个则是对UnityPlayer.UnitySendMessage调用一次后再次进行调用时没有任何反应的处理至于为什么没有反应简单来说就是被sendMessage调用的函数代码所在的activity需要保持在前台一旦被切换为其他activity后再次调用代码就没有什么效果了我解释的可能太过笼统或者不正确详细的解释请自行百度吧或者遇到了的时候自然就懂了所以这里推荐对于Unity内部方法的调用采用第二个链接中的方法直接一劳永逸即编写一个C#脚本继承AndroidJavaProxy类用于实现Java代码中的接口在初始化java对象时new一个实现了Java接口函数的类同时传递给java对象并保存一下对对象的引用然后呢直接把收到的对象当成一个接口使用就好了例如下边实现
C#代码
代码只有部分啊别全抄了只是做参考因为该代码也只是对第一个链接中的代码修改后得到的
public class IAPMessage : AndroidJavaProxy{public IAPMessage() : base(com.XXX.unitytogoolgleplaylib.IAPMessage){}#region callback from Objective-c/JAR//获取到产品列表回调public void RecieveProductInfos(string jsonData){if (string.IsNullOrEmpty(jsonData)) return;var infoData JsonConvert.DeserializeObjectIAPProductInfoData(jsonData);OnProductInfoReceived(infoData);}//产品列表请求失败public void ProductRequestFail(string message){OnProductInfoFail(message);}//购买成功回调public void ProductBuyComplete(string productId){OnProductBuyComplete(productId);}//购买失败回调public void ProductBuyFailed(string jsonData){var infoData JsonConvert.DeserializeObjectBuyFailData(jsonData);OnBuyProductFail(infoData.productId, infoData.error);}//获取商品回执回调public void ProvideContent(string msg) { }//购买取消回调public void ProductBuyCancled(string productId){OnBuyProductCancled(productId);}/// summary/// 恢复购买成功/// /summary/// param nameproductId/parampublic void RestoreComplete(string productId){OnRestoreCompleted(productId);}public void ConnectTips(){Debug.LogWarning(Java Connect!);}public void ConnectTips1(string str){Debug.LogWarning($Java Connect Test {str}!);}private void ClearCallback(){ProductBuyFailedCallback null;ProductBuyCompleteCallback null;ProductBuyCancledCallback null;}#endregion//接收到产品信息void OnProductInfoReceived(IAPProductInfoData info){Debug.Log([IAPMessage]Unity接收到商品信息: info.ToString());SDKGuanLiQi.SetInitShopState(true);}//接收到产品信息void OnProductInfoFail(string error){Debug.Log([IAPMessage]Unity商品信息请求失败: error);SDKGuanLiQi.SetInitShopState(false);}//购买完成void OnProductBuyComplete(string productId){Debug.Log([IAPMessage]购买完成 productId);ProductBuyCompleteCallback?.Invoke();ClearCallback();}//购买失败void OnBuyProductFail(string productId, string error){Debug.Log(string.Format([IAPMessage]购买失败:{0} 错误信息{1}, productId, error));ProductBuyFailedCallback?.Invoke();ClearCallback();}//购买取消void OnBuyProductCancled(string productId){Debug.Log([IAPMessage]购买取消 productId);ProductBuyCancledCallback?.Invoke();ClearCallback();}//恢复完成void OnRestoreCompleted(string productId){}}Java代码
package com.XXX.unitytogoolgleplaylib;// 与C#交互的接口
public interface IAPMessage
{//获取到产品列表回调public void RecieveProductInfos(String jsonData);//产品列表请求失败public void ProductRequestFail(String message);//购买成功回调public void ProductBuyComplete(String productId);//购买失败回调public void ProductBuyFailed(String jsonData);//获取商品回执回调public void ProvideContent(String msg);//购买取消回调public void ProductBuyCancled(String productId);/// summary/// 恢复购买成功/// /summary/// param nameproductId/parampublic void RestoreComplete(String productId);
}然后调用时赋值的方式参考图 第一张图为Android Studio中的项目截图第二张则是C#代码截图演示一下的没什么难度一试便会了很简单
但需要注意的是接入的com.android.billingclient版本与JDK版本兼容性的问题推荐接入6.0.1因为本人接入的就是这个版本的下面再附加上一张我的模块的build.gradle配置图 补档第25行中的jar包实际上就是Unity的jar包导入后可以通过import com.unity3d.player直接使用UnityPlayer.UnitySendMessage方法从而不用通过反射的方式去进行调用该jar包的路径为你的Unity安装路径\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes
上方路径中的mono所在的位置中的il2cpp下相对于的位置也有一个jar包这个jar包我没试过有兴趣的可以试试。
注因为考虑到兼容性的问题所以对于插件的部分的指定的目标SDK我就设置为了32版本使用JDK进行构建弄得太低了的话担心在后期又要进行升级就很麻烦总之就是多一事不如少一事总之具体设置为那个版本就看你的需求了
同时构建完成后jar包可在下图中的路径下边找到就不用去解压aar包了毕竟每次都去解压比较麻烦 这里补档说明一下 因为是对支付模块的单独构建打包在构建时可能会因为插件中所需要使用的其他插件的版本问题而导致构建失败出现这些问题的时候可以在下图中修改一下所使用的Gradle版本和其他模块的版本修改为你构建时所需要的版本同样的图中的内容仅作参考
因为我使用的Android Studio版本是2024.2.1版本的所以使用其他版本的配置方式可能存在一些细节上的不同
3、导出工程后再Android Studio中进行构建
这里是大头因为这里边的坑才是最多的导出的方法不做详细解释只对使用Android Studio打开导出的项目包后的操作进行说明
1、修改Gradle版本
这里需要修改的为编译时使用的Gradle版本与Android Gradle 插件版本修改编译时的Gradle版本路径如下图直接修改配置文件中的版本号就好了至于需要修改为那个版本就需要查看Android Gradle插件版本所需要的版本了
修改Android Gradle插件版本看下边截图了也是直接修改版本号就行了 修改Gradle方法同时也是修改JDK、NDK的操作步骤之一还有一个就是如下图按照截图顺序操作修改为所需要的版本后应用一下就好了 2、为build.gradle配置文件添加命名空间名称 namespace com.XXX.XXX
如下图下图为unityLibary下的build.gradle配置文件添加命名空间注意命名空间名称只能为namespace com.unity3d.player改成其他的都会出问题然后记得删得NDK的配置路径因为可能你所使用的插件所需的最低NDK版本比Unity所提供的NDK版本高反正删了少一堆问题就对了里边使用的JavaVersion版本也随手改一下避免使用Android Studio修改Java 版本的时候没有修改到的情况出现 删掉或者注释掉下图中框起来的部分可以加快打包的时间之前百度优化包体时看到的其他的解释是去掉再次进行il2cpp的编译过程还是什么的是反正删掉了不影响编译结果出现其他问题的话再次加回来再次编译就行了 然后在其他的build.gradle文件中找到android {......}的内容块并在android{.....}块中的第一行加入命名空间 namespace 这里修改为你的应用的包名例如下图包名可在下面第二张图中找到 3、修改JDK、NDK、Build Tools版本等
打开Project Structur窗口操作步骤参考上方修改Gradle版本的第二个方法然后根据下图中框选的部分修改所需要的SDK、JDK、NDK、Build Tools等的版本后应用保存一下如果没有所需要的版本的话可以在File-》Settings打开Settings窗口后看下边第二张图 没错就是这张图注意如果要通过修改配置文件的方式配置修改Gradle版本版本的话记得下图中的Distribution的配置就不要进行修改 然后SDK、NDK、Build Tools的安装看这张图记得勾选右下角的show package details选项看到更多的内容 4、修改所有能找到的AndroidManifest.xml文件注意是所有主要是为了减小打包后的包体大小不介意包体大小的可以不改
在application后边加上android:extractNativeLibstrue参考下图 如果已经存在android:extractNativeLibs配置并且为false就修改为true添加这段的具体原因则是为了启用压缩功能详情自行百度毕竟本人也不是做安卓开发的这段也只是搜索优化时偶然看到的
5、修改settings.gradle文件如下图非必要步骤 其实就是使用Unity原本的配置就好了添加上这一步的主要原因是为了避免因为将maven仓库的源修改为使用国内镜像时导致一些jar包下载搜索不到的问题毕竟接入的是google的SDK翻墙都没问题了使用原本的配置也就不会出现对下载速度造成影响的问题了
结语
好了恭喜你完成以上步骤后就可以同步一下然后进行apk的构建了其中可能因为省略了一些步骤看着会比较迷茫后期我不定时改改吧因为连续加班也是弄得脑袋不舒服详细步骤需要关注的点也可能少了一些不过还是欢迎留言看到了也都会第一时间进行回复的 最后2025年1月1日元旦节快乐
祝大家都能拥有幸福开心满意的工作并且每天都能不加班可以多陪陪家人