Unity3D物理引擎中刚体组件的运用

 物理引擎对于当前大多数游戏都是必不可少的一部分。在虚拟现实逐渐兴起的今天,玩家对游戏的真实感,以及操作感要求越来越高。Unity3D内置PhysX物理仿真引擎,具有高效低耗,仿真度膏的特点。

1、什么是刚体?
刚体使物体能在物理控制下运动。刚体可通过接受力使物体允许效果更加真实。总而言之,Unity3D中任何物体想要受到重力、外力的影响都必须包含一个刚体组件。

2、怎样给物体添加刚体?
选中物体,然后在点击菜单 Components>Physics>Rigidbody,来给物体增加一个刚体。

3、刚体组件中有什么属性?(介绍常用属性)
1)质量(Mass) 发生碰撞时,质量大的物体能够推开质量小的物体。
2)阻力(Drag)默认为0,没什么好解释的吧……
3)旋转阻力(Augular Drag)默认值为0.05
4)使用重力(Use Gravity)用来设定是否在刚体上施加重力用来模拟现实世界中的自由落体状态等。勾选即选中。
5)是否遵循运动学(Is Kinematic)用来设置刚体是否遵循牛顿物理学定律 勾选表示不会调用物理计算,只受脚本和动画的影响而运动!!!

4、常用方法
1)AddForce函数:对刚体施加一个指定方向的力,使其发生移动。
函数表示如下:
function AddForce(force: Vector3,mode: ForceMode=ForceMode.Force) : void
函数ForceMode有四种模式:Force、Impulse、Acceleration、VelocityChange
Force表示施加一个恒力, Impulse表示施加一个瞬间冲击力
Acceleration表示对物体施加加速度 VelocityChange 表示改变物体速度
2)MovePosition函数:将刚体移动到position位置。
函数表示如下:
function MovePosition(position : Vector3) : void
3)MoveRoration函数:将刚体旋转相对应的角度。

5、简单案例
1)案例说明:使用上面介绍的三种函数,对场景中的正方体施加恒力、爆炸力、移动和旋转。重置按钮使正方体复位。
案例运行效果如下图1.1所示:
这里写图片描述
图1.1

2)制作流程:
1.使用在场景中创建4个Cube搭建成围墙,修改尺寸调整位置,创建一个Cube作为本案例的主角,创建一个Plane对象充当地板,为Cube和Plane分别添加纹理图片。
2.使用UGUI在场景里创建5个button按钮,如上图1.1所示。界面布局就完成了,接下来就需要编写脚本对主角Cube进行操作。
3、在Assets内点击鼠标右键,Create>C#Script,重命名为Script2,双击打开脚本编写代码。

using UnityEngine;
using System.Collections;
public class Script2 : MonoBehaviour {
    protected Transform m_transform;
    public float force;    //施加在物体上的力
    public float speed;    //物体移动速度
    private bool ForceMode_Impulse;    //布尔类型变量,用来判断当前是否对物体施加爆炸力
    private bool ForceMode_Force;      //布尔类型变量,用来判断当前是否对物体施加恒力
    private bool CubeMovePosition;     //判断物体是否移动
    private bool CubeMoveRotation;     //判断物体是否旋转
    private Vector3 eulerAngle = new Vector3(0, 100, 0);    //三维向量,用来设置物体绕那个轴旋转
    private Vector3 cubePosition;      //存储物体的位置
    private Quaternion cubeRotation;   // 存储物体旋转状态
    void Awake()
    {
        cubePosition = this.transform.position;   //记录物体初始位置
        cubeRotation = this.transform.rotation;   //记录物体初始状态
    }

       // Use this for initialization
       void Start () {
        m_transform = this.transform;

       }

       // Update is called once per frame
       void Update () {
        if (ForceMode_Impulse)//爆炸力 使物体向右移动
        {
            this.GetComponent<Rigidbody>().AddForce(Vector3.right * force, ForceMode.Impulse);
        }
        if (ForceMode_Force)//恒力 使物体向右移动
        {
            this.GetComponent<Rigidbody>().AddForce(Vector3.right * force, ForceMode.Force);
        }
        if (CubeMovePosition)//移动方块
        {
            this.GetComponent<Rigidbody>().MovePosition(m_transform.position + Vector3.right * Time.deltaTime);
        }
        if (CubeMoveRotation)//旋转方块
        {
            Quaternion deltaRotation = Quaternion.Euler(eulerAngle * Time.deltaTime);
            this.GetComponent<Rigidbody>().MoveRotation(m_transform.rotation * deltaRotation);
      }

       }
    public void OnClick1()//施加爆炸力
    {
        ForceMode_Impulse = !ForceMode_Impulse;
    }
    public void OnClick2()//施加横力
    {
        ForceMode_Force = !ForceMode_Force;
    }
    public void OnClick3()//移动方块
    {
        CubeMovePosition = !CubeMovePosition;
    }
    public void OnClick4()//旋转方块
    {
        CubeMoveRotation = !CubeMoveRotation;
    }
    public void OnClick5()//重置方块
    {    
        this.GetComponent<Rigidbody>().isKinematic = true;//先不遵循物理学定律,消除物体的移动、旋转
        this.GetComponent<Rigidbody>().isKinematic = false;//然后遵循物理学定律
        m_transform.position = cubePosition;   //将物体的位置修改为初始状态
        m_transform.rotation = cubeRotation;   // 将物体的旋转状态修改为初始状态
    }
}

OnClick1()————OnClick4()功能类似,是当点击button按钮后,更改物体的状态

4、保存脚本,在Unity中把Script2脚本拖拽到游戏体Cube上。在Inspector面板上就会看到该脚本的设置面板。如下图1.2所示。
Force和Speed可以任意修改。
这里写图片描述
图1.2

发布了23 篇原创文章 · 获赞 15 · 访问量 5万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览