U3D physics总结
物理系统基于collider, 没有collider的物体不会发生任何主动和被动的物理交互,也不会产生trigger相关消息。
当且仅当A和B都有碰撞体时,两者才有可能发生交互,才有可能产生trigger消息。
碰撞体collider分为两大类:trigger collider, 非trigger collider
trigger collider就是触发器,一个勾选了Is trigger的 collider不产生任何物理交互,只在其它collider进入其范围时触发一个OnTriggerEnter消息,停留其间触发OnTriggerStaty消息,退出时触发OnTriggerExit消息。
Is trigger选项将会使RigidBoy组件的物理碰撞效果失效,但会受到重力的作用。
非trigger collider就是物理碰撞体。一个取消勾选Is trigger的collider就是一个物理碰撞体(这是默认选项)。
又分为两类:障碍物(或称静态碰撞体static collider,只有collider组件)和刚体(或称动态碰撞体dynamic collider,同时有collider和rigidbody组件)
static collider一般为场景中不动的障碍物,会阻挡其它碰撞体的运动但不会被推动。如果非要移动静态碰撞体则会导致物理系统额外的计算开销及不可知的错误,对游性能造成很外的影响,不要这样使用。
dynamic collider就是动态碰撞体,刚体,具有collider和rigidbody两种组件。可以碰撞其它碰撞体,也可以被碰。
刚体如果勾选了rigidbody组件的 Is kinematic属性将变为运动学刚体,这种物体与障碍物的表现有些类似,可以称为半动态碰撞体,可移动的障碍物。运动学刚体可以推动其它物体却不可以被其它物体推动。且不受重力影响。
不存在一个物体既是触发器又是是碰撞体。只能二选一。要么是trigger, 要么非trigger
总结:物理系统中物体的分类:触发器(collider组件勾选了Is Trigger),障碍物(仅有collider组件),可移动障碍物(有collider和rigidbody组件且rigidbody组件勾选了Is Kinematic),刚体(同时具有collider和rigidbody组件)
触发器不产生任何物理交互。障碍物静止不动,会阻拦其它则体运动。
可移动障物可推动其它刚体或被刚体推动,不与障碍物互动。
刚体与则体可以互动。
——————————————————————————————————————————————————————
2018.8.9
物理系统
1,collider存在的目的是为了物理碰撞,而不是仅为了给出物体的包围盒
collider + rigidbody 称为动态collider,这在游戏中模拟运动物件,受物理作用(被撞动,被阻停等)
仅collider而无rigidbody称静态collider,不受物理作用,这在游戏中用来模拟不动物,如地面,墙等
不要移动静态collider(设置position),它对性能冲击很大(因为物理碰撞是使用场景八叉树来做的,
而八叉树的建立很慢,将场景中所有静态物件按空间八叉树组织起来,通常是游戏开始前创建完成,
当静态物件位置改变时就需要重建八叉树,而动态物件不是维护在此树上的,故移动动态collider消耗不大)
总之,静态collider在运行时不要做这些操作:move, enable/disenable, scale
2,刚体:让物体可以受力和给予力(作用,反作用力)
3,meshcollider 不参与碰撞,必须勾选convex才行,因为mesh太复杂,convex是mesh的近似
4,碰撞或触发器消息都是广播的,如OnTriggerEnter或OnCollisionEnter
假设:有A,B,C三个物体,B,C静止不动,A(勾选了isTrigger)向B,C(勾选了isTrigger或未勾选)运动,
A 同时(或先后)与B,C发生了接触,则:
A收到一次B进入的消息 - OnTriggerEnter(b)
A收到一次C进入的消息 - OnTriggerEnter(c)
B收到一次A进入的消息 - OnTriggerEnter(a)
C收到一次A进入的消息 - OnTriggerEnter(a)
对于物理碰撞,同理:
假设:有A,B,C三个物体,B,C静止不动,A(有RigidBody)向B,C(有RigidBody或无)运动,
A 同时(或先后)与B,C发生了接触,则:
A收到一次B碰撞的消息 - OnCollisionEnter(b)
A收到一次C碰撞的消息 - OnCollisionEnter(c)
B收到一次A碰撞的消息 - OnCollisionEnter(a)
C收到一次A碰撞的消息 - OnCollisionEnter(a)
5,Kinematic Rigidbody Collider
当刚体组件的Kinematic勾选时,它就成了这样一个运动学刚体,这时候它只阻挡物体不会被移动,
这用来模拟门之类的,当门锁上时,不可被移动,当门打开时,可以被推动。
不同于静态collider, 运动学刚体在运动中会给其它物体施加摩擦力并唤醒(刚体停止运动后就进入睡眠)其它物体