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

