Unity API详解——Rigidbody类

Rigidbody类的功能是用来模拟GameObject对象在现实世界中的物理特性,包括重力、阻力、质量、速度等。对RIgidbody对象属性的赋值代码通常放在脚本的OnFixedUpdate()方法中。本博客主要介绍Rigidbody类的一些实例属性和实例方法,最后对Rigidbody类中功能相近、关联性较强的API之间的关系进行了注解。

一、Rigidbody类实例属性

在Rigidbody类中,涉及的实例属性有collisionDectionMode、drag、inertiaTensor、mass和velocity,下面介绍这些属性。

1、collisionDectionMode属性:碰撞检测模式

(1)基本语法

public CollisionDetectionMode collisionDetectionMode {
    
     get ; set; }

(2)功能说明

此属性用于设置刚体的碰撞检测。刚体的碰撞检测模式有3中,即枚举类型collisionDetectionMode的三个值。

Discrete:静态离散检测模式,为系统的默认设置。在此模式下,只有在某一帧中一个刚体的上方,而下一帧移动到了另一个刚体的下方,这样就会发生穿越现象。

Continuous:静态连续检测模式,一般用在高速运动刚体的目标碰撞体上,防止被穿越,检测强度比Discrete强

ContinuousDyamic:最强的连续动态检测模式,一般用在两个高速运动的物体上,防止互相穿越。其计算消耗最大,一般情况下慎用

总之,无论那种检测模式都有可能被穿越,为了防止穿越现象的发生,除了设置其碰撞检测模式外,还要适当增加两物体碰撞器的厚度,一般不要小鱼0.1,同时尽量降低两物体碰撞时的相对速度。

(3)代码实现

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CollisionDectionMode_test : MonoBehaviour
{
    
    
    public Rigidbody A, B;
    Vector3 v1, v2;

    void Start()
    {
    
    
        A.useGravity = false;
        B.useGravity = false;
        v1 = A.position;
        v2 = B.position;
    }
    void OnGUI()
    {
    
    
        if(GUI.Button(new Rect(10.0f,10.0f,200.0f,45.0f),"Discrete模式不被穿越"))
        {
    
    
            inists();
            A.collisionDetectionMode = CollisionDetectionMode.Discrete;
            B.collisionDetectionMode = CollisionDetectionMode.Discrete;
            A.velocity = new Vector3(0.0f, -10.0f, 0.0f);
        }
        if (GUI.Button(new Rect(10.0f, 60.0f, 200.0f, 45.0f), "Discrete模式被穿越"))
        {
    
    
            inists();
            A.collisionDetectionMode = CollisionDetectionMode.Discrete;
            B.collisionDetectionMode = CollisionDetectionMode.Discrete;
            A.velocity = new Vector3(0.0f, -40.0f, 0.0f);
        }
        if (GUI.Button(new Rect(10.0f, 110.0f, 200.0f, 45.0f), "Continuous模式不被穿越"))
        {
    
    
            inists();
            A.collisionDetectionMode = CollisionDetectionMode.Continuous;
            B.collisionDetectionMode = CollisionDetectionMode.Continuous;
            A.velocity = new Vector3(0.0f, -20.0f, 0.0f);
        }
        if (GUI.Button(new Rect(10.0f, 160.0f, 200.0f, 45.0f), "Continuous模式被穿越"))
        {
    
    
            inists();
            A.collisionDetectionMode = CollisionDetectionMode.Continuous;
            B.collisionDetectionMode = CollisionDetectionMode.Continuous;
            A.velocity = new Vector3(0.0f, -15.0f, 0.0f);
            B.velocity = new Vector3(0.0f, 15.0f, 0.0f);
        }
        if (GUI.Button(new Rect(10.0f, 210.0f, 200.0f, 45.0f), "ContinuousDynamic模式"))
        {
    
    
            inists();
            A.collisionDetectionMode = CollisionDetectionMode.ContinuousDynamic;
            B.collisionDetectionMode = CollisionDetectionMode.ContinuousDynamic;
            A.velocity = new Vector3(0.0f, -200.0f, 0.0f);
            B.velocity = new Vector3(0.0f, 200.0f, 0.0f);
        }
        if (GUI.Button(new Rect(10.0f, 260.0f, 200.0f, 45.0f), "重置"))
        {
    
    
            inists();
        }
    }
    //初始化A、B
    void inists()
    {
    
    
        A.position = v1;
        A.rotation = Quaternion.identity;
        A.velocity = Vector3.zero;
        A.angularVelocity = Vector3.zero;
        B.position = v2;
        B.rotation = Quaternion.identity;
        B.velocity = Vector3.zero;
        B.angularVelocity = Vector3.zero;
    }
}

在这段代码中,首先声明了两个Rigidbody变量A、B和两个Vector3变量v1、v2,然后再Start方法中设置A、B的useGiavity属性为false,并将A、B的Position赋值给v1和v2,然后再OnGUI方法中定义了多个Button,用来演示Discrete、Continuous和ContinuousDynamic的功能。最后顶一个一个inists方法,用于重置变量A、B对应刚体的状态。

①新建一个Cube立方体,将C#脚本挂载在立方体上
在这里插入图片描述
②新建一个子立方体,选择添加一个组件,单击physics;弹出新的窗口,单击rigidbody(刚体)
在这里插入图片描述
③将变量A、B指定为Cube2、Cube3
在这里插入图片描述
④查看像真实的物体一样接受摩擦力和重力,还可以与其他物体发生相互碰撞效果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Prototype___/article/details/130602986
今日推荐