Unity3D中PlayerPrefs无法重置:插屏广告计时器重置问题求助
解决插屏广告计时器重置无效的问题
嘿,我来帮你搞定这个计时器重置的问题!先看看你原来代码里的几个核心问题,再给你一个完整的解决方案~
原来代码的问题分析
- 第一段代码:
Update方法里每帧都从PlayerPrefs读取LastShownIntTime,导致你根本没法对这个值进行递减操作——因为PlayerPrefs里的数值只有在显示广告时才会被设为300,平时不会变,所以LastShownIntTime永远是300,完全不符合倒计时逻辑。 - 第二段代码:虽然在做倒计时,但
Update里每帧都往PlayerPrefs写值,既浪费性能,也没有专门处理按钮点击重置的逻辑;而且如果PlayerPrefs里没有存储过这个键,初始化时会默认取0,可能导致游戏一开始就弹出广告,体验不好。
修正后的完整代码
我整理了一个逻辑更清晰、性能更优的版本,专门加上了按钮重置的功能:
using UnityEngine; using UnityEngine.Advertisements; public class AdManager : MonoBehaviour { // 替换成你的Android广告ID private string androidAdId = "你的Android广告ID"; // 广告冷却时长(5分钟=300秒) private const int AdCooldownSeconds = 300; // 当前剩余冷却时间 private float remainingCooldown; // PlayerPrefs存储键名,避免拼写错误 private const string PrefsCooldownKey = "LastAdCooldown"; void Start() { #if UNITY_ANDROID Advertisement.Initialize(androidAdId); #endif // 读取上次保存的冷却时间,没有的话默认设为5分钟 remainingCooldown = PlayerPrefs.GetInt(PrefsCooldownKey, AdCooldownSeconds); } void Update() { // 只有冷却时间还没到0时,才继续递减 if (remainingCooldown > 0) { remainingCooldown -= Time.deltaTime; // 防止数值变成负数 if (remainingCooldown < 0) { remainingCooldown = 0; } } } // 玩家失败时调用这个方法,检查是否显示广告 public void OnPlayerFailed() { if (remainingCooldown <= 0) { ShowInterstitialAd(); } } // 显示插屏广告 private void ShowInterstitialAd() { #if UNITY_ANDROID // 先检查广告是否加载完成,避免报错 if (Advertisement.IsReady("video")) { Advertisement.Show("video"); // 显示广告后自动重置冷却时间 ResetAdCooldown(); } #endif } // 重置计时器的方法,直接绑定到你的按钮上 public void ResetAdCooldown() { // 把冷却时间拉回5分钟 remainingCooldown = AdCooldownSeconds; // 同步保存到PlayerPrefs,确保重启游戏也生效 PlayerPrefs.SetInt(PrefsCooldownKey, (int)remainingCooldown); PlayerPrefs.Save(); // 强制保存,防止数据丢失 } // 游戏退出时保存当前剩余冷却时间,下次启动继续计时 private void OnApplicationQuit() { PlayerPrefs.SetInt(PrefsCooldownKey, (int)remainingCooldown); PlayerPrefs.Save(); } }
关键说明
- 重置功能实现:新增的
ResetAdCooldown()方法就是你需要的按钮触发逻辑,调用它会直接把计时器重置为300秒,同时同步到PlayerPrefs。 - 性能优化:把
PlayerPrefs的读写从Update里移出来,只在启动、重置、退出、显示广告时操作,避免不必要的性能消耗。 - 广告加载检查:增加了
Advertisement.IsReady()判断,防止广告还没加载好就尝试显示,避免报错。 - 持久化逻辑:游戏退出时会保存当前剩余冷却时间,玩家重启游戏后,倒计时会接着上次的进度走,体验更合理。
操作步骤
- 把这个脚本挂到一个不会被销毁的GameObject上(比如游戏管理器)。
- 找到你的重置按钮,在Inspector面板的
OnClick事件中,拖拽这个脚本所在的GameObject,然后选择AdManager -> ResetAdCooldown()方法。 - 玩家失败时,调用
OnPlayerFailed()方法来触发广告检查。
内容的提问来源于stack exchange,提问作者Mohamad
相关产品推荐
相关产品推荐

