前言
此文章使用的版本为,Unity5.6.7f1、网络上有特殊需求,请自行解决
参考的主要网址来源于:https://developers.google.com/admob/unity/start
主要步骤为
后台申请广告 -> 环境部署&相关下载 -> Unity导入SDK并部署 -> 测试打包 -> 提取设备ID并填写 -> 无部署打包
最终目标即是最后一步,用以践行从Unity打包之后应该注意防止重复的操作,从而来节约宝贵的生命。
申请广告
去Admob申请开发者,创建应用 -> 创建需要展示的广告位。
此时需要使用到的有appid和广告位的id.
本地环境的部署
这里的环境指的是除基本的环境之外,还需要下载安装的东西
- Unity的Android&Ios打包环境下载(此处最好都下载,因为随后sdk导入后,会有代码依赖,没有下载此在项目中报错)
- Ios环境之下,安装 CocoaPods 。安装命令为 sudo gem install cocoapods,如有疑问,点击这里
- 下载Admob的Unity插件:跳转网址
Unity导入及相关操作
导入下载的Unity插件在你的项目中。如无意外,Android的配置Google服务会自动下载,手动的位置在这里Assets > Play Services Resolver > Android Resolver > Resolve
Android 配置
Assets/Plugins/Android/GoogleMobileAdsPlugin 目录下的 AndroidManifest.xml 文件中。您可以在 AdMob 界面中找到应用 ID。对于 android:value,请插入您自己的 AdMob 应用 ID,并加上英文引号,将 [ADMOB_APP_ID] 改为你的Android应用ID
1 2 3 4 5 6 7 8 9 |
<manifest> <application> <!-- Your AdMob App ID will look similar to this sample ID: ca-app-pub-3940256099942544~3347511713 --> <meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="[ADMOB_APP_ID]"/> </application> </manifest> |
IOS 配置
Assets/GoogleMobileAds/Editor 目录下的 PlistProcessor.cs 文件中,将ADMOB_APPLICATION_ID改为你的ios应用ID
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public static void OnPostProcessBuild(BuildTarget buildTarget, string path) { //#if UNITY_IPHONE // Replace with your iOS AdMob app ID. Your AdMob App ID will look // similar to this sample ID: ca-app-pub-3940256099942544~1458002511 string appId = "ADMOB_APPLICATION_ID"; string plistPath = Path.Combine(path, "Info.plist"); PlistDocument plist = new PlistDocument(); plist.ReadFromFile(plistPath); plist.root.SetString("GADApplicationIdentifier", appId); File.WriteAllText(plistPath, plist.WriteToString()); //#endif } |
2020-05-25 补充:由于使用了CocoaPods进行项目的维护,开始觉得下载拉取慢,于是网上找教程搜到了清华镜像一类的解决方案,经过测试,我成功的浪费了两天时间,这其中包括了:
删除原来的git库(cocoapods) -》 使用国内的重新git clone -》在我的项目中 pod install -> 报错,查找解决方案,最终无果 -> 删除cocoapods(包括相关的库,全删,删干净) -> 重新拉取github的原始的cocoapods(这之间有去设置git 下载速度慢以及相关设置,实测Git下载速度最终能达到100kb/s)-> 安装与设置cocoapods -> 在我的项目中 pod install -> 成功!
通用广告脚本
2020-05-25补充:
升级SDK v5.1.0,Unity IOS 编辑器上实例化报错,搜索相关问题之后,Google的回答是在真机上不没有问题;我对此的评价是:不负责的回答,预编译可以用,工作量小,能模拟虚拟环境,以至项目能够继续开发。
1 2 3 |
EntryPointNotFoundException: GADUInitializeWithCallback GoogleMobileAds.iOS.MobileAdsClient.Initialize (System.Action`1[T] initCompleteAction) (at Assets/GoogleMobileAds/Platforms/iOS/MobileAdsClient.cs:53) GoogleMobileAds.Api.MobileAds.Initialize (System.Action`1[T] initCompleteAction) (at Assets/GoogleMobileAds/Api/MobileAds.cs:64) |
新版本SDK,支持了实时回调:即不用管Android是否在主线程上,在广告成功的回调中直接调用游戏的代码即可。
我在此提供一个广告通用的脚本,有需要的可以直接拿去使用:(新版本使用RewardedAd 类 替换 RewardBasedVideoAd类)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 |
/****************************************************************************** * * Maintaince Logs: * 2019-03-25 WP Initial version * * *****************************************************************************/ using UnityEngine; using GoogleMobileAds.Api; /// <summary> /// 广告管理器 /// </summary> public class AdManager : MonoBehaviour { public bool isTestModel = false; #if UNITY_ANDROID string appId = "unexpected_platform"; string bannerId = "unexpected_platform"; string interId = "unexpected_platform"; string rewardId = "unexpected_platform"; private string test_deviceId = ""; #elif UNITY_IPHONE string appId = "unexpected_platform"; string bannerId = "unexpected_platform"; string interId = "unexpected_platform"; string rewardId = "unexpected_platform"; private string test_deviceId = ""; #else string appId = "unexpected_platform"; string bannerId = "unexpected_platform"; string interId = "unexpected_platform"; string rewardId = "unexpected_platform"; private string test_deviceId = ""; #endif private BannerView bannerView; private InterstitialAd interstitial; private RewardBasedVideoAd rewardBasedVideo; public delegate void DelRewardCallBack(); private DelRewardCallBack eventCurReward; private bool IsRemoveAd { get { //常规广告的开关,比如你是否购买了移除广告等, 填写你的代码:TODO return false; } } private bool CanShowAdByCase { get { //用于你自身的体验判断 //比如已经过了第3关,并且时间上超过一定的分钟 bool can = true; //TODO something if (Time.time - preShowAdTime < 180) return false; return can; } } private bool callMethodOnCloseAd; /// <summary> /// 这里的时间指的是所有全屏广告 /// </summary> private float preShowAdTime = 0; static public AdManager instance; // Use this for initialization void Awake() { instance = this; if (isTestModel) { #if UNITY_ANDROID bannerId = "ca-app-pub-3940256099942544/6300978111"; interId = "ca-app-pub-3940256099942544/1033173712"; rewardId = "ca-app-pub-3940256099942544/5224354917"; #elif UNITY_IPHONE bannerId = "ca-app-pub-3940256099942544/2934735716"; interId = "ca-app-pub-3940256099942544/4411468910"; rewardId = "ca-app-pub-3940256099942544/1712485313"; #endif } // Initialize the Google Mobile Ads SDK. MobileAds.Initialize(appId); if (!IsRemoveAd) { bannerView = new BannerView(bannerId, AdSize.Banner, AdPosition.Bottom); bannerView.LoadAd(GetRequest()); bannerView.Hide(); LoadInter(); } rewardBasedVideo = RewardBasedVideoAd.Instance; rewardBasedVideo.OnAdClosed += RewardBasedVideo_OnAdClosed; rewardBasedVideo.OnAdRewarded += RewardBasedVideo_OnAdRewarded; LoadReward(); } void Update() { if(callMethodOnCloseAd) { callMethodOnCloseAd = false; OnAdClose(); } } private AdRequest GetRequest() { AdRequest request = null; if (isTestModel && test_deviceId != "") request = new AdRequest.Builder().AddTestDevice(test_deviceId).Build(); else request = new AdRequest.Builder().Build(); return request; } private void LoadInter() { if (interstitial != null) interstitial.Destroy(); interstitial = new InterstitialAd(interId); // Load the interstitial with the request. interstitial.LoadAd(GetRequest()); interstitial.OnAdClosed += Interstitial_OnAdClosed; } private void LoadReward() { // Create an empty ad request. AdRequest request = GetRequest(); // Load the rewarded video ad with the request. rewardBasedVideo.LoadAd(request, rewardId); } private void Interstitial_OnAdClosed(object sender, System.EventArgs e) { callMethodOnCloseAd = true; LoadInter(); } private void RewardBasedVideo_OnAdClosed(object sender, System.EventArgs e) { callMethodOnCloseAd = true; LoadReward(); } private void RewardBasedVideo_OnAdRewarded(object sender, Reward e) { //获得奖励相关 if (eventCurReward != null) eventCurReward(); } public void ShowBanner() { if(IsRemoveAd) return; if (bannerView != null) bannerView.Show(); } public void HideBanner() { if (bannerView != null) { bannerView.Hide(); } } public bool ShowInter() { if (IsRemoveAd) return false; if (!CanShowAdByCase) return false; if (interstitial.IsLoaded()) { interstitial.Show(); //暂停音频等 OnAdOpening(); return true; } return false; } public void ShowReward(DelRewardCallBack method) { if (rewardBasedVideo.IsLoaded()) { eventCurReward = method; rewardBasedVideo.Show(); OnAdOpening(); } } private void OnAdOpening() { preShowAdTime = Time.time; Time.timeScale = 0; //TODO 暂停你的音乐等逻辑 } /// <summary> /// 不允许在Android的进程中调用 /// </summary> private void OnAdClose() { Time.timeScale = 1; //TODO 重新开始你的音乐等逻辑 } } |
这是一个通用模块,首先:你还需要做以下事情 :
- 你需要在替换你的Android&Ios的广告相关的id。
- 在你的场景中新建游戏对象,并且挂上这个脚本,在检视板里勾上isTestModel。
中介的使用
Google Admob 广告中介,核心的解决广告填充不到位的问题,相当于广告联盟,区别于广告联盟的地方是你需要单独去第3方网站注册与在前端建立一广告、应用,提取广告帐户Key和广告的Key填入中介中。
https://developers.google.com/admob/unity/mediation 广告中介Doc位置,点击单个的广告会弹出相应的教程
Unity Ads 加入中介时遇到的问题
Unity后台找半天找不到Api Key,请参考这个网址:https://support.unity3d.com/hc/en-us/articles/115000564946-How-do-I-find-my-Unity-Ads-API-key-
Applovin 加入中介
尼玛,还得打个包前台才显示应用创建页面。
最后之前
Android打包可以直接Build。
Ios打包步骤这里需要强调一下:
- Unity里面Build Setting里,请填好你的Team ID,以免每次都在XCode里面修改。
- Unity > Build
- 导出工程所在地,请注意,直接打开xcworkspace,直接打开xcworkspace,直接打开xcworkspace,然后Build到真机即可
- Android和IOS都是在Log里面,提取设备ID,重新填入到代码,然后重加包
Android & IOS的Log类似如下
1 2 |
<span class="pln"><Google> To get test ads on this device, call: request.testDevices = @[ "2077ef9a63d2b398840261c8221a0c9b" ];</span> |
1 2 |
<span class="pln">I</span><span class="pun">/</span><span class="typ">Ads</span><span class="pun">:</span> <span class="typ">Use</span> <span class="typ">AdRequest</span><span class="pun">.</span><span class="typ">Builder</span><span class="pun">.</span><span class="pln">addTestDevice</span><span class="pun">(</span><span class="str">"33BE2250B43518CCDA7DE426D04EE232"</span><span class="pun">)</span><span class="pln"> to </span><span class="kwd">get</span><span class="pln"> test ads on </span><span class="kwd">this</span><span class="pln"> device</span><span class="pun">.</span> |
将Log里面的ID添加到代码里面的 test_deviceId 里,然后重新打包,并测试你的广告。
最后
上面提供的脚本中,你仍然需要做的几件事:
- 你需要在TODO的界面加入你自身应用的逻辑。
- 在你的场景需要的地方,调用这个脚本提供的广告显示与隐藏的相关代码。
- 上线之前isTestModel属性设置为false.
祝君好运!