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

Unity 3D中如何在两个对象间传递布尔变量?代码失效求助

问题分析与解决方案

嘿,我一眼就发现问题所在啦!你的EmptyControllerColl脚本里,controller变量根本没被正确赋值,所以它一直是null,自然没法同步active变量的状态。

核心错误

看你的Start方法:

private void Start() {
    GetComponentInChildren<CollisionController>();
}

你调用了GetComponentInChildren获取子物体上的CollisionController组件,但没有把返回的结果赋值给controller变量!这就导致后续Update里访问controller.active的时候,其实是在访问一个空引用——要么控制台会弹出空引用警告(可能你没注意到),要么activeLocal一直保持默认的false状态。

修复步骤

把Start方法改成这样,把获取到的组件赋值给controller:

private void Start() {
    controller = GetComponentInChildren<CollisionController>();
    // 额外加个空值检查,避免找不到组件时静默出错
    if (controller == null) {
        Debug.LogError("找不到子物体上的CollisionController组件!");
    }
}

额外优化建议

  • 空值检查不能少:上面加的空值检查能帮你快速排查组件未找到的问题,避免运行时出现难以定位的错误。
  • 用事件模式替代直接访问变量:如果后续逻辑变复杂,直接读取变量会增加代码耦合度。你可以在CollisionController里定义事件,当active状态变化时触发,EmptyControllerColl订阅这个事件,这样更灵活也更符合Unity最佳实践:
    // CollisionController脚本修改:
    using System;
    public class CollisionController : MonoBehaviour {
        public PlayerMovement movement;
        public bool active = false;
        public event Action<bool> OnActiveStateChanged;
    
        private void OnCollisionEnter(Collision collision) {
            if(collision.collider.tag == "Obstacle") {
                active = true;
                // 触发事件,通知订阅者状态变化
                OnActiveStateChanged?.Invoke(active);
            }
        }
    }
    
    // EmptyControllerColl脚本修改:
    public class EmptyControllerColl : MonoBehaviour {
        public CollisionController controller;
        public PlayerMovement movement;
        public bool activeLocal = false;
    
        private void Start() {
            controller = GetComponentInChildren<CollisionController>();
            if (controller != null) {
                // 订阅状态变化事件
                controller.OnActiveStateChanged += HandleActiveStateChanged;
            }
        }
    
        private void HandleActiveStateChanged(bool newState) {
            activeLocal = newState;
            if (activeLocal) {
                Debug.Log("Game over");
            } else {
                Debug.Log("Nothing...");
            }
        }
    
        // 销毁时取消订阅,避免内存泄漏
        private void OnDestroy() {
            if (controller != null) {
                controller.OnActiveStateChanged -= HandleActiveStateChanged;
            }
        }
    }
    
  • 检查Inspector赋值:如果你本来打算在Inspector面板里把CollisionController拖到EmptyControllerColl的controller字段里,那要确保拖曳操作正确,这时候Start里的GetComponentInChildren可以去掉,但空值检查还是建议保留。

这样修改后,activeLocal就能正确同步active的状态啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 23:37:45