原创文章,转载请注明: 转载自All-iPad.net
本文链接地址: Unity 3D Physics Components
其中最基本的关系:
Collider是最基本的触发物理的条件,例如碰撞检测。基本上,没有Collider物理系统基本没有意义(除了重力)。
Rigidbody是物体的基本物理属性设置,当检测碰撞完之后,就要计算物理效果,而Rigidbody就是提供计算基本参数的玩意。
PhysicMaterial则是附加的基本物理参数,是一个物理材质,UNITY3D有自带默认的物理材质的系数(在Edit/Project Settings/Physic下设置),它参与碰撞的计算例如反弹效果摩擦效果等。
Rigidbody部分:
Rigidbody组件的中文手册:http://game.ceeger.com/Script/Rigidbody/Rigidbody.html
Rigidbody相关具体函数我就不解释了,看官方手册就很明朗,不过有几个还是要讲一下。
1.
如果没有Rigidbody而设置了Collider碰撞的话,那这个物体就是个死死不会动的物体。
假设有Rigidbody去撞它的话,那将会被弹开。不过,假设该脚本控制的是位移而不是物理加力的方式的话,将穿透过去。
两个没有Rigidbody的物体,也是穿透。
若碰撞体设置了isTrigger属性,将取代UNITY的物理函数来运算。可以在触发函数里将其屏蔽,再次触发碰撞等效果。
2.
如果物理系统感觉不真实不好,那很可能是缩放的问题。如果你的游戏世界非常大,所以的东西将显示移动非常慢,确保你所有的模型为真实世界大小。例如,一个汽车应该有4米长,一个角色约2米高。物体以相同的加速度下落,不论大或小,重或轻。如果你的游戏世界有较大的缩放,物体仍以相同的加速度下落,但是因为所有的物体都比较大,物体的下落显得就比较慢。(BY U3D圣典的翻译)
3.
当改变刚体参数的时候(例如质量等),应该在FixedUpdate函数中使用它,物理模拟以离散的时间步执行。FixedUpdate函数在每一步之前被立即调用。(修改自U3D圣典的翻译)
4.
isKinematic这个参数指的是是否受物理力的影响,如果勾上则不收AddForce等物理添加力的函数影响了。
5.
collisionDetectionMode 碰撞检测模式
使用这个创建一个刚体的连续碰撞检测,从没有碰撞检测的其他物体传递,用来防止快速移动的物体,为了获得最佳效果,为快速移动的物体设置这个值为CollisionDetectionMode.ContinuousDynamic,以及为其他与之需要碰撞的物体设置这个值,为CollisionDetectionMode.Continuous。这个对物理性能有很大影响,所以只要给它设置为默认值 CollisionDetectionMode.Discrete,假如快速物体的碰撞没有任何问题。连续碰撞检测只支持刚体的球体、胶囊或盒子碰撞器。(BY U3D圣典的翻译)
6.
AddTorque()
添加一个让物体旋转的力——力矩。
参照百度百科:http://baike.baidu.com/view/36869.htm
7.
关于爆炸和聚拢。
AddForceAtPosition()提供一个聚拢的力
AddExplosionForce()可用于炸弹爆炸的效果
ClosestPointOnBounds()可以计算范围内从内到外的伤害,可以计算爆炸范围内不同地点受到的伤害。好东西。
8.
与collider相应的时间触发
OnCollisionEnter/OnCollisionExit/OnCollisionStay
9.
当collider的isTrigger属性为true的时候,其碰撞事件将转移到自定义脚本那。若想两方同时触发,再加个碰撞体来检测。或者直接触发完后将isTrigger设为false,则会再触发rigidbody的碰撞。
Collider部分:
Collider倒没啥好讲的,主要就是一个isTrigger属性。还有选用怎么样的Collider,选用的话看情况而定了。
其中物理材质在下面提一下,这个对于物理效果来说还是挺重要的。
OnCollisionEnter这个由碰撞引起的函数很用。
PhysicMaterial部分:
PhysicMaterial的各属性手册:http://game.ceeger.com/Script/PhysicMaterial/PhysicMaterial.html
一般来说只用前三个吧。
1.dynamicFriction
移动时候使用的摩擦力。这个值在0到1之间。
2.staticFriction
当物体在表面静止时使用的摩擦力。通常在0到1之间。
3.bounciness
表面的弹力怎样?0值没有弹力。1值没有能量损失的反弹。
设置好材质直接用就可以了,拖到collider里面。
原址:http://blog.sina.com.cn/s/blog_5b6cb95001017vfr.html
原文档地址:http://unity3d.com/support/documentation/Components/comp-DynamicsGroup.html
Unity内建了NVIDIA PhysX物理引擎,这允许我们创建一些非常酷的效果。
如果想要让一个对象被物理控制,只需要给他们添加一个刚体组件即可。当您这样做了以后,该对象将受到重力的影响,并可以与在游戏世界中的其他对象发生碰撞。
刚体是一种物理模拟对象,你可以把刚体应用到玩家可以推动的对象上,比如crates或loose对象,你也可以通过脚本给刚体施加力来让他们移动.
但是你不能直接移动non-Kinematic刚体对象的位置,否则他们将不能与其他对象进行正确的碰撞,相反,你应该通过给刚体施加力和扭矩来移动他们。你还可以给刚体添加Jionts来让他们的行为更复杂,比如你可以通过swinging chain来创建一个物理的门。
你还可 以使用刚体来创建载具,比如汽车,你可以使用四个Wheel Colliders并用脚本来给Wheel施加力,这个力的大小可以根据玩家的输入来决定。(也就是玩家控制汽车的移动)
同样还可以用刚体来实现飞机,也是用脚本来控制给刚体的施加力。也可以通过添加各种Joints来实现复杂的载具或者机器人等。
在大多数情况下,刚体都与基本的Colliders组合使用。
一个刚体对象绝对不能有一个父对象是刚体,同样的,也不能有一个子对象是刚体
不能对一个刚体对象的父节点执行缩放操作
当把isKinematic属性打开的时候就表示创建了Kinematic刚体,它将不再受到外力、重力和碰撞的影响,这时你只能直接设置这些对象的位置、旋转及缩放属性,或者是执行动画,但是他们仍然还能与其他非Kinematic刚体进行交互。
Kinematic刚体与其他非Kinematic刚体发生碰撞时能够正确的唤醒其他对象,并且能够给放置在他们上面的非Kinematic刚体施加正确的摩擦力。
几个典型的使用Kinematic刚体的例子:
1. 有时候你希望某个对象能够被物理控制,但在某些情况下你又能直接指定这些对象的位置、旋转、缩放以及对他们执行动画操作。比如你可以创建一个动画角色,这个角色由多个Kinematic刚体及Joints联合构成,在绝大多数情况下该角色都是由动画控制的,不具有完全的物理属性,但是当角色被击中,你希望击中动画表现的像布娃娃一样由物理控制时,你可以将isKinematic属性关闭,这时角色又具有了完全的物理属性。
2. 有时候你希望能够实现一个可移动的对象,它能够把其他对象推动,但他自己不会被推动,这时使用Kinematic刚体会更合适。比如一个运动的平台,在上面放置一些刚体,这些刚体能被平台带动,但平台本身不会受这些刚体的影响。在这种情况下把平台设置为Kinematic会比简单的将为其指定Collider而不带刚体属性要好。
3. 还有一种情况是使用一个Kinematic刚体来执行动画,同时使用Joints连接一个非Kinematic的刚体。
静态碰撞体指具有Collider但又不是刚体的游戏对象。静态碰撞体用来构造关卡,这些对象始终保持在固定的地方,永远不会移动。你可以给一个已存在的渲染模型添加一个Mesh Collider,当然最好的方法是在导入模型的时候勾选生成碰撞模型来生成,也可以使用其他类型的碰撞体。
绝对不应该在每桢的处理中来移动静态碰撞体,因为移动静态碰撞体为导致PhysX内部重新计算,这个计算开销是相当昂贵的,会导致性能的急剧下降。同样的道理,如果用移动静态碰撞体的方法来唤醒一个处理Sleep状态的刚体,这种行为的结果是未定义的,同时,移动静态碰撞体时,与之相接触的刚体也不会受到摩擦力。
如果你希望一个碰撞体能够移动,那么把它设置为Kinematic刚体就是了。
如果你想创建一个人形的角色,那么可以使用Character Controller组件。这可以是第三人称视角游戏里的主角,FPS游戏里的射手,或者是其他类型的敌军角色,等等。
这些控制器不遵循物理学规则,比如在DOOM中,你可以每小时跑90英里,或者是在一桢的时间里迅速停下来。角色控制器使用自己的碰撞检测来确保你的角色可以沿着墙壁走,还能够上下楼梯,等等。
角色控制器不会直接受力的影响,不过可以通过脚本给这些刚体施加力来移动他们。通常情况下,所有的人形角色都是用Character Controller来实现。
角色控制器不是物理对象,所以如果你希望角色表现出真正的物理属性,比如沿绳子摆动、被大石块推动等等,那么你只能使用刚体,刚体对象允许你使用Joints和对角色施加外力。角色控制器总是与y轴对齐的,所以如果你希望角色能够在空间中任意旋转,比如在一个变化的重力环境下,那么你还是只能使用刚体。但是,使用具有完全物理属性的刚体来实现一个具有非物理表现的角色同样也是非常困难的。另一个区别是,角色控制器可以平滑的越过一定的高度,但是刚体不可以。
如果你为一个角色控制器指定一个刚体类型的父对象,那么你将获得类似于Joints的行为。
刚体 (Rigidbody) 刚体能让对象受物理控制
恒力 (Constant Force) 给刚体指定一个恒力,用于快速实现火箭等对象
Sphere Colliders 用于球形物体
Box Collider 用于方块形物体
Capsule Collider 用于胶囊形物体
Mesh Collider 从渲染模型生成碰撞体
Physic Material 物理材质,用于调整对象的物理属性,比如摩擦力,弹力,等等
Hinge Joint 用于实现类似门的连接
Sprint Joint 类似弹簧的连接
Fixed Joint 用于把对象固定在一起
Configurable Joint 用于创建复杂的组合连接
Character Controller和Character Joint,用于控制角色
Wheel Collider 一种特殊的碰撞器,用于实现地上的载具
Skinned Cloth 用于实现蒙皮布料
Interactive Cloth 用于创建可交互的布料,只是普通的布料模拟
原创文章,转载请注明: 转载自All-iPad.net
本文链接地址: Unity 3D Physics Components