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

Unity实例化Igaguri预制体不移动问题求助

Unity预制体实例化后不移动的排查建议

针对你遇到的Igaguri预制体实例化后停在原地的问题,虽然断点显示代码执行正常,但可以从以下几个方向排查:

  • 检查Rigidbody核心设置
    确保预制体上的Rigidbody组件:

    • 未勾选Is Kinematic:如果预制体默认开启了这个选项,即使代码里没设置,物体也会处于运动学状态,不受力的影响
    • 质量(Mass)设置合理:不要设为0(0质量物体不受力),也不要过大(200的力可能不足以推动大质量物体)
    • 确认Use Gravity处于开启状态(即使不开,AddForce也应生效,但排除这个变量)
  • 排查初始碰撞导致的冻结
    你的代码在OnCollisionEnter里会把Rigidbody设为isKinematic = true,如果实例化的预制体一开始就卡在其他碰撞体内部(比如生成在地面、场景模型里),会立刻触发碰撞,直接冻住物体:

    • 修改实例化代码,给预制体一个安全的生成位置,比如:
      GameObject igaguri = Instantiate(igaguriPrefab, transform.position + new Vector3(0, 1, 0), Quaternion.identity);
      
    • 在OnCollisionEnter里添加调试日志,确认是否一生成就触发了碰撞:
      private void OnCollisionEnter(Collision collision)
      {
          Debug.Log($"触发碰撞:{collision.gameObject.name}");
          GetComponent<Rigidbody>().isKinematic = true;
          GetComponent<ParticleSystem>().Play();
      }
      
  • 调整AddForce的力模式
    AddForce默认使用ForceMode.Force模式,该模式下力的效果会受物体质量影响。如果质量较大,200的力可能看不到明显移动,可以改用冲量模式:

    GetComponent<Rigidbody>().AddForce(dir, ForceMode.Impulse);
    
  • 验证碰撞体与层级设置

    • 确认预制体上的碰撞体组件(如SphereCollider)未勾选Is Trigger,否则不会触发OnCollisionEnter,但如果是Trigger状态物体不会被阻挡,不过仍需排除这个可能
    • 检查Layer碰撞矩阵,确保预制体所在层级与场景中其他物体的层级允许碰撞(避免因层级设置导致物体穿透但无碰撞反馈)
  • 添加调试输出确认参数
    在Shoot方法里添加日志,确认力的参数和Rigidbody状态:

    public void Shoot(Vector3 dir)
    {
        Rigidbody rb = GetComponent<Rigidbody>();
        Debug.Log($"施加力:{dir} | 运动学状态:{rb.isKinematic} | 物体质量:{rb.mass}");
        rb.AddForce(dir);
    }
    

内容的提问来源于stack exchange,提问作者難波八郎

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 07:45:03