使用NGUI时遇到物理引擎错误

在使用NGUI时,遇到PhysX引擎错误'Supplied NxActorDesc is not valid.'和'Can't compute mass from shapes'。错误与Box Collider有关,特别是在Z轴负数且未设为Trigger时。解决方案是检查Box Collider尺寸及对象缩放,确保碰撞体正常以避免影响物理计算和触屏响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  使用NGUI时偶尔会遇到以下两个报错:

 

  • Supplied NxActorDesc is not valid. createActor returns NULL.
  • Actor::updateMassFromShapes: Can't compute mass from shapes: must have at least one non-trigger shape!

 

  通过在网上搜索,得知第一个错误其实是PhysX引擎的报错。显然Unity使用了PhysX作为物理引擎。第二个报错说的是无法通过形状计算质量,看来也是物理方面的错误。

 

  目前这两个错误的具体程序原因未知,但试验发现这和NGUI对象上挂载的BoxCollider形状有关。以下方法可以很容易地重现这两个错误(注意以下步骤都是在编辑状态下,不用播放):

  1. 在Unity编辑器中创建一个空场景。
  2. 在菜单栏中点击NGUI -> Create -> 2D UI,创建出一个UI Root。
  3. 选中刚创建的UI Root,在菜单栏中点击NGUI -> Create -> Panel,在UI Root之下创建出一个Panel孩子。
  4. 选中刚创建的Panel,在菜单栏中点击NGUI -> Create -> Widget,在UI Root之下创建出一个Widget孩子。
  5. 选中刚创建的Widget,在它身上挂载一个Box Collider。
  6. 关键的地方来了:不要勾选Box Collider的Is Trigger属性;设置Box Collider的大小——x和y都设为正数,但z设为负数;另外将Widget的local scale设为(0, 0, 0)。
  7. 选中Panel,将其隐藏(相当于SetActive(false)),这时就会报“Supplied NxActorDesc is not valid. createActor returns NULL.”。
  8. 再把Panel打开(相当于SetActive(true)),就会报“Actor::updateMassFromShapes: Can't compute mass from shapes: must have at least one non-trigger shape!”。

  如果研究过NGUI内部原理,就会知道NGUI内部会强制给每个Panel挂载一个刚体(Rigidboy)。这是因为在Unity中,没有刚体的碰撞体(Collider)属于静态碰撞体,而静态碰撞体的移动会触发物理引擎中大量的性能开销。(见这篇Unity文档,里面提到“Colliders can be added to an object without a Rigidbody component to create floors, walls and other motionless elements of a scene. These are referred to as static colliders. In general, you should not reposition static colliders by changing the Transform position since this will impact heavily on the performance of the physics engine.”。)恐怕是刚体和碰撞体之间的交互出了问题。

 

  一种猜测是:刚体的质量中心是由刚体上各个碰撞体的形状计算出来的(见官方文档对Rigidbody.centerOfMass的说明)。如果碰撞体的形状不正常,那可能就无法计算出质量中心,物理引擎会报错;或者计算出的质量中心就可能是一个非法的数。后一种情况可能还会影响NGUI的触屏检测。有一次我们某个界面上挂载BoxCollider的按钮出bug,点击之后毫无反应,甚至连触摸反馈动画也没有。我本想在UICamera下断点,看看是谁截住了OnClick消息,却发现连UICamera都没感知到触屏。研究了很久才发现那个按钮的BoxCollider的z尺寸设成了负数,调试中我发现那个按钮所在Panel的刚体质量中心是(NaN, NaN, NaN)。将那个BoxCollider的尺寸改成正数后,bug就消失了。(不过后来我也研究过,并不是Box Collider的尺寸为负就一定会导致该bug,可能要正好在某些数值下导致刚体质量中心为(NaN, NaN, NaN)才行。)

 

  所以目前的结论就是:如果在NGUI中遇到了物理引擎的报错,或者UICamera没感知到触屏,则检查一下各个BoxCollider的尺寸是否正常。这个尺寸会受到多个因素的影响:包括Box Collider的size参数,还有GameObject(包括自己和祖宗)的scale。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值