如何基于用户输入旋转预制体中多个RigidBody并修复主控脚本空引用错误
错误原因
你抛出NullReferenceException的核心原因是Start方法中获取Rigidbody的逻辑错误:GetComponent(string)是查找当前脚本挂载物体上、和传入字符串同名的组件类型,你传入的LeftForearm2/LeftBicep2等是子物体的名称,不是组件名称,因此所有Rigidbody变量都被赋值为null,调用AddTorque时触发空引用。
修复方案
方案1:代码自动获取
修改Start方法的逻辑,先通过Transform.Find找到对应名称的子物体,再获取子物体挂载的Rigidbody组件:
void Start() { forearmL = transform.Find("LeftForearm2").GetComponent<Rigidbody>(); forearmR = transform.Find("RightForearm2").GetComponent<Rigidbody>(); shoulderL = transform.Find("LeftBicep2").GetComponent<Rigidbody>(); shoulderR = transform.Find("RightBicep2").GetComponent<Rigidbody>(); thighL = transform.Find("LeftThigh2").GetComponent<Rigidbody>(); thighR = transform.Find("RightThigh2").GetComponent<Rigidbody>(); legL = transform.Find("LeftLeg2").GetComponent<Rigidbody>(); legR = transform.Find("RightLeg2").GetComponent<Rigidbody>(); // 可选:增加空判断方便排查问题 if(forearmL == null) Debug.LogError("找不到LeftForearm2子物体的Rigidbody,请检查子物体名称/路径是否正确"); // 可以按需求给其他变量都加上空判断 }
如果对应肢体不是预制体根节点的直接子物体,需要补全嵌套路径,比如肢体存在于UpperBody/LeftArm节点下,就写为transform.Find("UpperBody/LeftArm/LeftForearm2")。
方案2:Inspector手动赋值
直接删除Start方法中所有Rigidbody变量的赋值代码,在Unity编辑器中选中挂载了Movement脚本的预制体,把对应肢体的Rigidbody组件逐一拖拽到Inspector面板对应变量的赋值框中即可,该方式更稳定,不会因为子物体路径修改失效。
后续适配Mirror的注意事项
- 输入读取逻辑仅在本地控制的玩家对象中执行,避免所有客户端都读取本地输入
- 肢体的物理状态同步请挂载
NetworkTransform组件,按需求将左右肢体的网络权限分配给对应玩家 - 力的施加逻辑建议写在
[Command]/[ServerRpc]中保证多端同步一致
内容的提问来源于stack exchange,提问作者user17247507
相关产品推荐
相关产品推荐

