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。
相关产品推荐
相关产品推荐

