Unity中如何用协程实现临时2倍乘数后保留后续升级的乘数
临时乘数与永久升级冲突的解决方案
问题根源在于你直接修改了全局的Multiplier值,永久升级的乘数会被临时效果的/2操作错误抵消。正确的做法是把乘数拆分为基础乘数和临时加成两个独立变量,两者的乘积作为最终生效的乘数。
第一步:修改GameManager
在GameManager中拆分乘数变量,对外提供只读的最终乘数:
public class GameManager : MonoBehaviour { // 基础乘数(升级操作修改这个值) public static int BaseMultiplier = 1; // 临时乘数加成(临时效果修改这个值,默认无加成) public static float TempMultiplierBonus = 1f; // 对外暴露的最终生效乘数,自动计算基础与临时的乘积 public static float Multiplier => BaseMultiplier * TempMultiplierBonus; // 原有Iron数量、UI更新等逻辑保持不变 // ... }
第二步:修改TwoX脚本
临时效果仅修改TempMultiplierBonus,同时添加按钮冷却避免重复触发:
using UnityEngine; using UnityEngine.UI; using System.Collections; public class TwoX : MonoBehaviour { [SerializeField] private Button _twoXButton; // 临时效果持续时长(按需求改为30秒) private const float EffectDuration = 30f; // 标记是否正在生效临时效果 private bool isEffectActive = false; void Start() { _twoXButton.onClick.AddListener(ActivateTwoXEffect); } void ActivateTwoXEffect() { if (isEffectActive) return; StartCoroutine(TwoXEffectCoroutine()); } IEnumerator TwoXEffectCoroutine() { isEffectActive = true; _twoXButton.interactable = false; // 禁用按钮防止重复点击 GameManager.TempMultiplierBonus = 2f; yield return new WaitForSeconds(EffectDuration); GameManager.TempMultiplierBonus = 1f; isEffectActive = false; _twoXButton.interactable = true; // 恢复按钮可用性 } }
第三步:调整升级按钮逻辑
所有购买升级的代码,要修改BaseMultiplier而非原来的Multiplier,比如+1升级的示例逻辑:
// 示例:+1升级按钮的点击处理 public void BuyAddOneMultiplier() { if (GameManager.Iron >= 10) { GameManager.Iron -= 10; GameManager.BaseMultiplier += 1; // 调用UI更新方法刷新显示 UpdateMultiplierDisplay(); } }
修改后两者完全独立:
- 临时效果生效时,最终乘数为
基础乘数 × 2 - 期间购买升级,基础乘数增加,最终乘数实时变为
新基础乘数 × 2 - 临时效果结束后,最终乘数自动回到
新基础乘数 × 1,完全保留升级效果
内容的提问来源于stack exchange,提问作者awakengaming83
相关产品推荐
相关产品推荐

