Unity中如何让ShopManager修改所有带HurtPlayer脚本的对象?
解决Unity中ShopManager批量修改所有HurtPlayer实例的问题
你当前的核心问题是代码仅能获取单个HurtPlayer实例,无法覆盖场景中所有挂载该脚本的敌人。只需做以下几处修改就能实现批量影响:
修改后的ShopManager代码
public class ShopManager : MonoBehaviour { public ShopItem[] items; public PlayerController playerCon; public HurtEnemy hurtEnm; public HurtPlayer[] hurtPlaArray; // 改为数组存储所有实例 public CoinManager coinMan; void Start() { playerCon = FindObjectOfType<PlayerController>(); hurtEnm = FindObjectOfType<HurtEnemy>(); hurtPlaArray = FindObjectsOfType<HurtPlayer>(); // 用复数方法获取所有实例 } public void ApplyChangesToPlayer(ShopItem item) { switch (item.name) { case "Speed": playerCon.speed += 1f; break; case "Strength": hurtEnm.damage++; break; case "Reduced damage": // 遍历所有HurtPlayer实例,逐个修改伤害值 foreach (var hurtPlayer in hurtPlaArray) { if (hurtPlayer != null) // 避免空引用报错 hurtPlayer.damagePerHit--; } break; } } }
关键改动说明
- 变量类型调整:把单个
HurtPlayer变量改成数组HurtPlayer[],用来存储场景中所有该脚本的实例 - 获取实例方式:用
FindObjectsOfType<HurtPlayer>()(复数形式)替代FindObjectOfType,这个方法会返回场景中所有挂载了该脚本的对象数组 - 批量修改逻辑:在"Reduced damage"分支里,通过
foreach遍历数组,对每个HurtPlayer实例的damagePerHit进行修改,同时增加空引用判断避免运行时报错
额外补充(针对动态生成的敌人)
如果你的敌人是游戏运行中动态生成的(比如通过Instantiate创建),上面的Start方法只会在场景加载时获取一次实例,新生成的敌人不会被包含进去。这种情况下,可以把获取实例的逻辑移到ApplyChangesToPlayer的对应分支里,每次升级时重新查找:
case "Reduced damage": // 每次升级时重新获取所有HurtPlayer实例 HurtPlayer[] currentHurtPlayers = FindObjectsOfType<HurtPlayer>(); foreach (var hurtPlayer in currentHurtPlayers) { if (hurtPlayer != null) hurtPlayer.damagePerHit--; } break;
这样不管什么时候生成的敌人,都能被升级操作影响到。
内容的提问来源于stack exchange,提问作者TUK
相关产品推荐
相关产品推荐

