You need to enable JavaScript to run this app. Unity C#中List<bool>未随源bool值自动更新问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

Unity C#中List<bool>未随源bool值自动更新问题咨询

问题根源

C#中bool属于值类型,向集合中添加值类型时,只会复制当前时刻的值快照,不会和原变量建立引用关联。
你在Start()里执行hitboxDir.Add(refScriptX.selfCollide)的操作,本质是把启动瞬间每个selfCollide的固定值存进了List。后续其他脚本在OnTriggerEnter/OnTriggerExit中修改原selfCollide值时,List里存储的旧副本不会同步更新,自然无法取到最新状态。而直接读取refScriptX.selfCollide是直接访问原对象的字段,因此能拿到实时更新的碰撞值。

实现索引同步取值的方案

不要在List中存储bool值本身,改为存储对应PlayerProximityHitboxes脚本的对象引用,取值时通过列表索引访问引用对象上的实时碰撞状态,既可以保留索引取值的能力,也能支持后续随意调整列表的元素顺序。

修改后的参考代码:

public class HitboxManager : MonoBehaviour
{
    public bool frontCollide, rightCollide, backCollide, leftCollide;
    public PlayerProximityHitboxes refScript1, refScript2, refScript3, refScript4;
    // 原List<bool>改为存储脚本对象引用
    public List<PlayerProximityHitboxes> hitboxRefList = new List<PlayerProximityHitboxes>();

    void Start()
    {
        // 向列表添加脚本对象的引用,而非值快照
        hitboxRefList.Add(refScript1);
        hitboxRefList.Add(refScript2);
        hitboxRefList.Add(refScript3);
        hitboxRefList.Add(refScript4);
    }

    void Update()
    {
        // 通过索引直接读取对应脚本的实时碰撞值
        frontCollide = hitboxRefList[0].selfCollide;
        rightCollide = hitboxRefList[1].selfCollide;
        backCollide = hitboxRefList[2].selfCollide;
        leftCollide = hitboxRefList[3].selfCollide;
    }
}

补充说明

  • 后续如果需要调整四个方向的取值顺序,不需要修改Update里的取值逻辑,只要调整List中元素的排列顺序、或是对List执行排序、调换位置的操作即可。
  • 实际项目中如果存在脚本对象被销毁的场景,取值时补充空判断即可避免空引用异常,示例写法:
// 带空判断的取值写法
frontCollide = hitboxRefList[0] != null && hitboxRefList[0].selfCollide;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.13 04:36:03