为什么 'Is Kinematics' 在 HoloLens 上的工作方式不同?
Why 'Is Kinematics' works different on HoloLens?
概览
我想要一个立方体,我可以使用组件 Collider
、Rigidbody
和 ObjectManipulator
在场景中拖动它。在播放模式下一切正常,但是运行它在hololens上,立方体在拖动几次后开始飞来飞去。
重现步骤(所有组件都是通过编辑器设置的,不是通过代码设置的)
- 创建新项目并设置 AR/HoloLens
- 导入 MRTK 2.4
- 使用
Box Collider
创建多维数据集。设置 Is Trigger = true
- 将
Rigidbody
添加到多维数据集。设置 Use Gravity = false
和 Is Kinematic = true
- 将
Object Manipulator
添加到多维数据集。我有一个方法在 On Manipulation Ended
之后被调用,但不知道这是否重要。
预期行为
刚体设置为 Is Kinematic = true
和 Use 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
之后被调用的方法导致了那个。
我有一个列表,由 OnTriggerEnter/-Exit 填充和排出(退出看起来一样,除了添加→删除):
private void OnTriggerEnter(Collider other){
if (other.gameObject.layer != 31) return;
_objectsCollidingWith.Add(other.gameObject);}
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:请原谅奇怪的代码格式,不知何故这里的编辑不允许我把括号放在其他地方
概览
我想要一个立方体,我可以使用组件 Collider
、Rigidbody
和 ObjectManipulator
在场景中拖动它。在播放模式下一切正常,但是运行它在hololens上,立方体在拖动几次后开始飞来飞去。
重现步骤(所有组件都是通过编辑器设置的,不是通过代码设置的)
- 创建新项目并设置 AR/HoloLens
- 导入 MRTK 2.4
- 使用
Box Collider
创建多维数据集。设置Is Trigger = true
- 将
Rigidbody
添加到多维数据集。设置Use Gravity = false
和Is Kinematic = true
- 将
Object Manipulator
添加到多维数据集。我有一个方法在On Manipulation Ended
之后被调用,但不知道这是否重要。
预期行为
刚体设置为 Is Kinematic = true
和 Use 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
之后被调用的方法导致了那个。
我有一个列表,由 OnTriggerEnter/-Exit 填充和排出(退出看起来一样,除了添加→删除):
private void OnTriggerEnter(Collider other){ if (other.gameObject.layer != 31) return; _objectsCollidingWith.Add(other.gameObject);}
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:请原谅奇怪的代码格式,不知何故这里的编辑不允许我把括号放在其他地方