You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中Switch语句跨脚本修改变量仅Speed生效问题求助

解决Unity商店永久升级仅Speed生效的问题

以下是针对你遇到的问题的排查方向和解决方案:

1. 优先排查:字符串匹配是否完全一致

你的switch逻辑依赖item.name的精确字符串匹配,这是最容易出问题的点:

  • 检查ShopItem对象的name属性是否和case中的字符串完全一致(包括大小写、空格、拼写),比如是否写成了"strength"(小写s)、"Reduced Damage"(D大写)或者"Reduce Damage"(少了d)。
  • 临时排查方法:在ApplyChangesToPlayer方法开头加一行日志,确认实际传入的升级项名称:
    public void ApplyChangesToPlayer(ShopItem item)
    {
        Debug.Log($"当前升级项名称:{item.name}");
        // 原switch逻辑...
    }
    
  • 彻底解决:改用枚举替代字符串匹配,避免拼写错误:
    // 定义升级类型枚举
    public enum UpgradeType
    {
        Speed,
        Strength,
        ReducedDamage,
        Weapon
    }
    
    // 在ShopItem脚本中添加枚举字段
    public class ShopItem : MonoBehaviour
    {
        public int price;
        public UpgradeType upgradeType;
    }
    
    // 修改ShopManager的switch逻辑
    switch (item.upgradeType)
    {
        case UpgradeType.Speed:
            playerCon.speed += 1f;
            break;
        case UpgradeType.Strength:
            // ...逻辑不变
            break;
        // 其他case同理
    }
    

2. 检查FindObjectsOfType的时机是否正确

你在Start()中一次性获取HurtEnemy和HurtPlayer数组,但如果这些对象是动态生成的(比如关卡中刷新的敌人、后期获得的武器),数组会遗漏后续生成的对象:

  • 解决方案1:购买对应升级时重新获取所有活跃对象:
    case "Strength":
        // 重新获取当前场景中所有HurtEnemy
        hurtEnms = FindObjectsOfType<HurtEnemy>();
        foreach (var hurtEnm in hurtEnms)
            hurtEnm.damage++;
        break;
    case "Reduced damage":
        hurtPlas = FindObjectsOfType<HurtPlayer>();
        foreach (var hurtPla in hurtPlas)
            hurtPla.damagePerHit--;
        break;
    
  • 解决方案2:维护动态列表跟踪对象生命周期:
    // 在HurtEnemy脚本中添加静态列表
    public class HurtEnemy : MonoBehaviour
    {
        public int damage;
        public static List<HurtEnemy> AllHurtEnemies = new List<HurtEnemy>();
    
        void OnEnable() => AllHurtEnemies.Add(this);
        void OnDisable() => AllHurtEnemies.Remove(this);
    }
    
    // 升级时遍历静态列表
    case "Strength":
        foreach (var hurtEnm in HurtEnemy.AllHurtEnemies)
            hurtEnm.damage++;
        break;
    

3. 验证Weapon升级的逻辑响应

设置playerCon.hasWeapon = true后,需确认游戏逻辑是否真的监听了这个变量:

  • 如果武器的激活逻辑是在PlayerController.Start()中执行的,那么后续修改hasWeapon不会触发更新。需要改为监听变量变化:
    public class PlayerController : MonoBehaviour
    {
        public float speed;
        [SerializeField] private GameObject weapon;
        private bool _hasWeapon;
    
        public bool hasWeapon
        {
            get => _hasWeapon;
            set
            {
                _hasWeapon = value;
                // 实时更新武器状态
                if(weapon != null) weapon.SetActive(_hasWeapon);
            }
        }
    }
    
  • 或者在购买Weapon升级后,手动调用PlayerController中的武器初始化方法:
    case "Weapon": 
        playerCon.hasWeapon = true;
        playerCon.ActivateWeapon(); // 需在PlayerController中实现该方法
        break;
    

4. 确认变量是否被实际逻辑使用

检查HurtEnemy.damage和HurtPlayer.damagePerHit是否真的被攻击/受击逻辑引用:

  • 比如HurtEnemy的攻击代码是否使用了damage变量,而不是固定值:
    // 正确用法
    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag("Enemy"))
        {
            other.GetComponent<EnemyHealth>().TakeDamage(damage);
        }
    }
    
  • 同理检查HurtPlayer的代码,确保敌人攻击玩家时使用的是damagePerHit变量。

内容的提问来源于stack exchange,提问作者TUK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 06:02:09