为什么 'Is Kinematics' 在 HoloLens 上的工作方式不同?

Why 'Is Kinematics' works different on HoloLens?

概览
我想要一个立方体,我可以使用组件 ColliderRigidbodyObjectManipulator 在场景中拖动它。在播放模式下一切正常,但是运行它在hololens上,立方体在拖动几次后开始飞来飞去。

重现步骤(所有组件都是通过编辑器设置的,不是通过代码设置的)

  1. 创建新项目并设置 AR/HoloLens
  2. 导入 MRTK 2.4
  3. 使用 Box Collider 创建多维数据集。设置 Is Trigger = true
  4. Rigidbody 添加到多维数据集。设置 Use Gravity = falseIs Kinematic = true
  5. Object Manipulator 添加到多维数据集。我有一个方法在 On Manipulation Ended 之后被调用,但不知道这是否重要。

预期行为
刚体设置为 Is Kinematic = trueUse Gravity = false,以便立方体在释放拖动后保持 still/stops 移动。这在统一播放模式下尝试时有效。但是 运行 它在全息透镜上,立方体的行为就像 Is Kinematic = false 并且在与它交互后开始四处飞行。有时是第二次拖后,有时是第三次拖后。

错误
在更新这个 post 之前,我没有注意到 hololens 左下角的开发控制台。在场景的开头,我收到消息 [Physics.PhysX] BV4 midphase only supported on intel platforms 但那一刻一切都很好。随着立方体开始飞来飞去,我得到了一个 NullReferenceExeption: Object reference not set to an instance of an object.

我解决了我的问题。我知道大概的原因,但我并不完全理解。在 OnManipulationEnded 之后被调用的方法导致了那个。

  1. 我有一个列表,由 OnTriggerEnter/-Exit 填充和排出(退出看起来一样,除了添加→删除):

     private void OnTriggerEnter(Collider other){
     if (other.gameObject.layer != 31) return;
     _objectsCollidingWith.Add(other.gameObject);}
    
  2. OnManipulationEnded 触发了这个方法:

     private int GetMeshes(List<KeyValuePair<Transform, Mesh>> transMeshes){
     foreach (GameObject go in _objectsCollidingWith)
     {
         transMeshes.Add(new KeyValuePair<Transform, Mesh>(go.transform , go.GetComponent<MeshFilter>().mesh));
     }
     return transMeshes.Count;}
    

所以我从 GetMeshes 得到了很多空引用,因为列表 _objectsCollidingWith 中的一些游戏对象是空的。那是因为网格每隔一段时间就会更新一次。这导致了很多空引用,直到立方体飞走了。
我一直通过设备门户使用日志提供程序,但看不出是什么导致了这个错误。但是在 运行 通过全息仿真的项目之后,我可以在控制台中看到它们来自哪里。

我是如何解决我的问题的?
我发现这个 post 是因为我意识到我的 OnTriggerExit 没有被调用,并且被设置为具有空对象和一些具有相同名称的空间网格经常触发 OnTriggerEnter。我还在 GetMeshes 的 foreach 循环中添加了这一行,因为偶尔还有一个空对象:

if (go == null)
  continue;

PS:请原谅奇怪的代码格式,不知何故这里的编辑不允许我把括号放在其他地方