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

Unity中OnTriggerEnter2D仅修改触发碰撞对象int值问题

问题原因

你当前代码里的flowerPoint是实例级变量,每一个挂载了该脚本的GameObject都会单独持有一份独立的flowerPoint副本,触发碰撞时自然只会修改被碰撞对象自己的那一份变量,不会同步到其他6个对象的同名字段。

解决方案

根据你的实际需求可以选择以下两种实现方式:

方案1:所有挂载该脚本的对象共享同一个flowerPoint数值

把变量改成静态成员即可,静态成员属于类本身,所有类实例共享同一份存储:

// 添加static关键字
public static int flowerPoint;

private void OnTriggerEnter2D(Collider2D collision)
{
    // 推荐用CompareTag代替直接==tag,性能更优
    if(collision.CompareTag("Bee"))
    {
        if (flowerPoint >= 4)
        {
            Invoke("startMakingHoney", 10f);
            flowerPoint -= 4;
        }
    }
}

注意:静态变量不会显示在Inspector面板,如果需要在编辑器里调整初始值,可以单独写一个全局管理类持有这个变量,或者在脚本的Awake/Start方法里给静态变量赋初始值。

方案2:每个对象保留独立的flowerPoint,仅碰撞时同步修改所有对象的数值

如果你的业务逻辑需要每个对象单独存储自己的flowerPoint,只是碰撞触发时要所有对象的数值同步减4,可以查找所有挂载了该脚本的实例批量修改:

[SerializeField]
public int flowerPoint;

private void OnTriggerEnter2D(Collider2D collision)
{
    if(collision.CompareTag("Bee"))
    {
        if (flowerPoint >= 4)
        {
            Invoke("startMakingHoney", 10f);
            // 查找所有该脚本的实例,统一修改数值
            foreach(var scriptInstance in FindObjectsOfType<替换为你的脚本类名>())
            {
                scriptInstance.flowerPoint -= 4;
            }
        }
    }
}

提示:把代码里的替换为你的脚本类名修改为你实际的C#脚本文件名即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:15:01