Unity 单个脚本挂载多个GameObject时调用其函数失败如何解决
问题根因
调用失效和“Script_1挂在多个物体上导致无法定位”没有直接关联,核心问题出在组件检索的范围边界上:
- 当前使用的
GetComponentsInChildren<Script_1>(),只会检索挂载Script_2的当前游戏物体、以及它所有向下延伸的子物体层级里的Script_1组件,完全不会检索同级物体、上级物体、场景其他独立分支物体上的Script_1,自然会出现找不到组件、调用无响应的情况。 - 附带修正代码规范问题:
scr .CallMyFunction()中变量名和方法之间的多余空格不影响编译,但不符合通用编码规范。
分场景落地方案
目标Script_1属于Script_2的子物体层级
- 先核对场景层级结构,确认所有需要被调用的Script_1,确实都挂在Script_2所在物体的子节点下,没有错位挂载到其他层级
- 补全检索覆盖范围:将原检索代码修改为
GetComponentsInChildren<Script_1>(true),传入的true参数会让检索连带覆盖未激活的物体,避免因物体未激活导致组件漏检 - 性能优化:不要每次触发调用时都重新遍历子层级找组件,最好在
Start/Awake初始化阶段,把找到的所有Script_1存入缓存列表,后续直接遍历缓存列表发起调用,减少运行时的遍历开销
目标Script_1分散在场景不同位置,不属于Script_2的子物体
- 放弃层级检索逻辑,直接全场景匹配Script_1组件:低版本Unity使用
Object.FindObjectsOfType<Script_1>(true),高版本Unity使用Object.FindObjectsByType<Script_1>(FindObjectsSortMode.None),这两个方法会遍历当前打开的整个场景,找到所有物体(包括未激活物体)上的Script_1组件,遍历完成后统一调用对应方法即可 - 高稳定性方案:如果场景内需要被调用的Script_1数量不多,直接在Script_2中声明一个
public List<Script_1> targetScripts的公开列表,在Unity Inspector面板上将需要调用的Script_1手动拖拽到列表槽位中,完全靠手动指定组件引用,不需要写任何检索逻辑,从根源上避免定位失效的问题
仅需调用特定的几个Script_1,不需要全场景遍历
- 给需要被调用的Script_1所在物体打上统一的自定义Tag,检索时先匹配对应Tag的物体,再提取物体上的Script_1组件,避免误调用无关物体上的脚本
- 对于需要全局统一调度的Script_1,可以给Script_1添加一个静态全局列表:在Script_1的
OnEnable方法中将自身加入列表,OnDisable方法中将自身从列表移除,调用时直接遍历这个静态列表即可,无需每次遍历场景层级查找组件
内容的提问来源于stack exchange,提问作者Ray
相关产品推荐
相关产品推荐

