一起学Unity3D:让角色更鲜活——刚体
在现实生活中,我们无时无刻都在受着力的作用,小伙伴们推一下,我们会往前走一小段;想不开跳楼的时候我们会被重力摔的妈都不认识;脸被拳头打中的时候,身体会旋转180°然后倒地……因为我们生活在物理世界,会受力的作用做出相应的反映,那么在游戏世界里,为了实现这些现实的物理效果呢,Unity引入了刚体。
刚体是物体能够在物理控制下运动,通过接受力和扭曲,使物体能像现实世界一样运动,任何物体,想要受重力影响,受脚本施加的外力作用,或者与其他物体进行碰撞交互,都必须为它添加刚体组件。
下面博主以篮球在地面来回弹跳为例带大家认识刚体。
第一步:新建工程,创建一个Cube,拍扁拉长做个地面,再创建一个Sphere,摆一个帅气pose
第二步:选中小球,菜单栏Component——>:Physics——>Rigidbody,这样就为小球添加了刚体组件
Mass:物体的质量,以卵击石基本就描述了这个参数的作用,在碰撞的时候,小质量的物体想撞飞大质量的物体,简直做梦
Drag:物体收到的阻力。对于接受过9年义务教育的人,不多说,你懂的。
Angular Drag:物体旋转的时候受到的阻力
Use Gravity:是否受到重力
Is Kinematic:是否使用动力学,打上勾以后,物体将不再受力、碰撞的影响,任何力作用在物体上,简直就是纹丝不动,包括重力。
Iterpolate:插值,当你发现刚体运动抖动时,可以尝试下面的选项
Collistion Detection:碰撞检测模式,用于避免高速运动的物体穿过其他物体时,却未发生碰撞,比如射击游戏的子弹常常需要它
Constraints:约束。
其中Freeze Position:冻结选中的轴(X,Y,Z轴),冻结了以后,在相应轴的移动将无效
其中Freeze Rotation:冻结选中的轴(X,Y,Z轴),冻结了以后,在相应轴的旋转将无效
第三步:新建C#脚本,将脚本添加到Sphere上
[csharp] view plaincopyprint?using UnityEngine;
using System.Collections;
public class RigidTest : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
void OnCollisionEnter(Collision collisionInfo)
{
//print(collisionInfo.gameObject.name);
//为刚体添加力,方向向上,大小为200
rigidbody.AddForce(Vector3.up * 200);
}
}
[csharp] view plaincopyprint?using UnityEngine;
using System.Collections;
public class RigidTest : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
void OnCollisionEnter(Collision collisionInfo)
{
//print(collisionInfo.gameObject.name);
//为刚体添加力,方向向上,大小为200
rigidbody.AddForce(Vector3.up * 200);
}
}
using UnityEngine;
using System.Collections;
public class RigidTest : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
void OnCollisionEnter(Collision collisionInfo)
{
//print(collisionInfo.gameObject.name);
//为刚体添加力,方向向上,大小为200
rigidbody.AddForce(Vector3.up * 200);
}
}
运行游戏,小球会像篮球一样上下弹
这里还需要说明的是,OnCollistionEnter函数是物体在发生碰撞的一瞬间调用,相应的还有OnCollistionStay是物体在碰撞后与物体接触时调用,OnCollistionExit是物体理考碰撞物时调用,大家可以分别测试一下,体会一下。参数Collistion是被碰撞的物体信息,球落下时,地板被碰撞,那么从collistionInfo便存贮着底板的相关信息,打印collistionInfo.gameObject.name为"Cube"
>>相关产品