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

Unity中如何修改所有动态生成GameObject的属性值?

解决Unity动态生成敌人后批量修改属性的问题

方法1:拾取道具时实时查找所有敌人

直接在触发道具的逻辑里调用FindObjectsOfType<EnemyController>(),这样不管敌人是预先存在还是动态生成的,都能被实时获取到:

public class PlayerController : MonoBehaviour
{
    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.tag == "Potion")
        {
            EnemyController[] enemCon = FindObjectsOfType<EnemyController>();
            foreach (var enemy in enemCon)
            {
                enemy.speed = 3;
            }
        }
    }
}

你的EnemyController保持原有代码即可。这种方法简单直接,因为你最多同时生成10个敌人,性能完全没有问题。

方法2:用静态列表统一管理敌人

在EnemyController中维护一个静态列表,敌人创建时自动加入列表,销毁时移除,Player直接操作这个列表:

public class EnemyController : MonoBehaviour
{
    public static List<EnemyController> AllEnemies = new List<EnemyController>();
    public int speed = 5;

    void Awake()
    {
        AllEnemies.Add(this);
    }

    void OnDestroy()
    {
        AllEnemies.Remove(this);
    }
}
public class PlayerController : MonoBehaviour
{
    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.tag == "Potion")
        {
            foreach (var enemy in EnemyController.AllEnemies)
            {
                enemy.speed = 3;
            }
        }
    }
}

这种方法比实时查找更高效,避免了场景搜索的开销,同时能准确跟踪所有存活的敌人,不会出现空引用风险(只要记得在OnDestroy里移除)。

方法3:事件驱动(观察者模式)

通过事件系统解耦Player和Enemy的逻辑,Player触发减速事件,敌人自行响应:
首先创建一个事件管理类:

public static class GameEvents
{
    public static event Action OnSlowEnemies;

    public static void TriggerSlowEnemies()
    {
        OnSlowEnemies?.Invoke();
    }
}

修改EnemyController监听事件:

public class EnemyController : MonoBehaviour
{
    public int speed = 5;

    void OnEnable()
    {
        GameEvents.OnSlowEnemies += SlowDown;
    }

    void OnDisable()
    {
        GameEvents.OnSlowEnemies -= SlowDown;
    }

    void SlowDown()
    {
        speed = 3;
    }
}

最后修改PlayerController触发事件:

public class PlayerController : MonoBehaviour
{
    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.tag == "Potion")
        {
            GameEvents.TriggerSlowEnemies();
        }
    }
}

这种方式耦合度最低,后续如果需要调整敌人的减速逻辑,或者添加其他响应事件的单位,都不需要修改Player的代码,扩展性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 11:12:50