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

  使用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没感知到触屏,则检查一下各个BoxCollder的尺寸是否正常。这个尺寸会受到多个因素的影响:包括Box Collider的size参数,还有GameObject(包括自己和祖宗)的scale。

时间: 2024-10-07 05:04:17

使用NGUI时遇到物理引擎错误的相关文章

Unity的物理引擎是如何实现碰撞的呢?

物理引擎不允许两个碰撞器重叠,当两个或多个物体碰撞时,Unity会根 据他们的旋转速度计算碰撞效果.计算主要根据物体的碰撞器是静止的还 是动态的.物体是不移动的,例如,墙,地面,院子里的喷池等.动态物 体是移动的,例如玩家控制的球,汽车.当计算碰撞时,静态物体不会被 影响,而动态物体会被影响.例如动态的球碰到“静态”的方块时球被弹 开,而方块不受影响.物理引擎有“碰撞器”重叠发生时,物理引擎孩子 计算碰撞器体积,并追踪碰撞器重叠,但不会在碰撞重叠的物体上体现出 来,因为这不叫碰撞.我们把碰撞器放

瘸腿蛤蟆笔记34-cocos2d-x-3.2 Box2d物理引擎World类介绍

上篇回顾 本篇名言:将爱的能量传送给别人,我们自己就会变成一条管道,吸纳来自上天的神圣能源.而那种玄秘体验是我们每个人都得以品尝的! [詹姆士·雷德非] 上篇中,我们学习了Box2d物理引擎dynamics模块中的Contact类,该类包含所有的接触类型.物体碰撞的具体都在该类中. 蛤蟆接着学习dynamics模块中的类,这次咱们学习World这个类. 理论介绍 World类(其实是b2World类,蛤蟆之前说过,Box2d中的类都是b2开头的)包含Body和Joint. 它管理所有的仿真允许异

实例介绍Cocos2d-x中Box2D物理引擎:碰撞检测

在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact(b2Contact* contact).两个物体开始接触时会响应,但只调用一次.virtual void EndContact(b2Contact* contact).分离时响应.但只调用一次.virtual void PreSolve(b2Contact* contact, const b2Ma

实例介绍Cocos2d-x中Box2D物理引擎:碰撞检測

在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact(b2Contact* contact).两个物体開始接触时会响应,但仅仅调用一次. virtual void EndContact(b2Contact* contact).分离时响应. 但仅仅调用一次. virtual void PreSolve(b2Contact* contact, const

【Cocos2d-x】物理引擎使用入门

相关概念 什么是物理引擎? 科学模型:科学研究中对事物的合理简化. 物理引擎是一个计算机程序模拟牛顿力学模型,使用质量.速度.摩擦力和空气阻力等变量. 可以用来预测这种不同情况下的效果.它主要用在科学模拟和电子游戏中. 一般,物理引擎只负责物理计算,而不进行画面渲染. 关于box2d Box2D是一款免费的开源二维物理引擎,由Erin Catto使用C++编写.它已被用于蜡笔物理学.愤怒的小鸟.地狱边境等游戏的开发. Cocos2d-x本身已经集成box2d. 以上解释来自维基百科. Box2D

Cocos2d-x 使用物理引擎进行碰撞检测

[转自]: http://blog.csdn.net/cbbbc/article/details/38541099 通常在游戏简单逻辑判断和模拟真实的物理世界时,我们只需要在定时器中判断游戏中各个精灵的条件是否满足判断条件就可以了.例如,在飞机大战中,判断我方子弹和敌机是否发生碰撞一般在定时器中通过敌机所在位置的矩形是否包括了子弹的位置来判断是否发生碰撞.在消除类游戏中,判断在y轴或x轴上是否要消除相同物品一般在定时器中通过循环来检测在某个方向上是否有连续的相同物品满足消除个数来移除精灵就可以了

物理引擎Havok教程

物理引擎Havok教程(一) 搭建开发环境 网上关于Havok的教程实在不多,而且Havok学习起来还是有一定难度的,所以这里写了一个系列教程,希望能够帮到读者.这是第一期. 一.Havok物理引擎简介       Havok引擎,全称为Havok游戏动力开发工具包(Havok Game Dynamics SDK),一般称为Havok,是一个用于物理系统方面的游戏引擎,为电子游戏所设计,注重在游戏中对于真实世界的模拟.使用碰撞功能的Havok引擎可以让更多真实世界的情况以最大的拟真度反映在游戏中

基于HT for Web 3D呈现Box2DJS物理引擎

上篇我们基于HT for Web呈现了A* Search Algorithm的3D寻路效果,这篇我们将采用HT for Web 3D来呈现Box2DJS物理引擎的碰撞效果,同上篇其实Box2DJS只是二维的平面碰撞物理引擎,但同样通过3D的呈现能让人更直观的体验到碰撞效果,先上张最终例子效果图: Box2D最早是Erin Catto在GDC大会上的一个展示例子,后来不断完善成C++的开源物理引擎库,这些年了衍生出Java.ActionScript以及JS等版本,被广泛应用在游戏领域.说其丰富的确

cocos2d_x_02_使用内置物理引擎

最终效果图: 一.新建工程 进入cocos2d-x的tools下的bin目录: /Users/beyond/Desktop/cocos2d-x/cocos2d-x-3.3beta0/tools/cocos2d-console/bin目录 打开终端,切换到上述bin目录 使用cocos命令,创建工程,格式如下: cocos new 工程名 -p 包名 -l 语言 -d 目标文件夹, 例如 : cocos new 01_cocos2d-x-p com.beyond-l cpp -d /Users/b