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

如何基于用户输入旋转预制体中多个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:36:03