Unity_物理引擎细说_01

1、Rigidbody 刚体组件

  1. Rigidbody.position 位置
  2. Rigidbody.rotation 旋转
  3. Rigidbody.velocity 模拟物体以某个速度向某个方向移动
    private Rigidbody rig;
    void Start()
    {
        rig = GetComponent<Rigidbody>();
        //为位置和旋转赋值
        //rig.position = Vector3.zero;
        //rig.rotation = Quaternion.identity;
    }
    void Update()
    {
        //控制物体的移动
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        rig.velocity = new Vector3(h, 0, v) * 2.5f;
    }
  1. Rigidbody.AddExplosionForce 爆炸力
    //实现炸弹爆炸效果
    private Rigidbody rig;
    private Collider[] cols;
    //是否已经爆炸
    private bool isTrue = false;
    void Start()
    {
        rig = GetComponent<Rigidbody>();
    }
    private void OnCollisionEnter(Collision collision)
    {
        if (collision.transform.name == "Targer")
        {
            if (isTrue == false)
            {
                float explosionForce = 800;
                Vector3 explosionPosition = transform.position;
                float explosionRadius = 6.5f;
                //返回以参数1为原点和参数2为半径的球体内“满足一定条件”的碰撞体集合
                cols = Physics.OverlapSphere(explosionPosition, explosionRadius);
                foreach (var item in cols)
                {
                    //print(item.name);
                    if (item.GetComponent<Rigidbody>())
                    {
                        Rigidbody rigs = item.GetComponent<Rigidbody>();
                        //为指定范围内带有刚体组件的碰撞体添加爆炸力方法
                        rigs.AddExplosionForce(explosionForce, explosionPosition, explosionRadius);
                    }
                }
                Destroy(gameObject);
                isTrue = true;
            }
        }
    }
  1. Rigidbody.AddForce 恒定力 / Rigidbody.AddRelativeForce 相对恒定力
    private Rigidbody rig;
    void Start()
    {
        rig = GetComponent<Rigidbody>();

        //添加恒定力
        rig.AddForce(Vector3.up * 3);
        //添加相对恒定力
        rig.AddRelativeForce(Vector3.up * 3);
    }
  1. Rigidbody.AddForce 扭矩力 / Rigidbody.AddRelativeForce 相对扭矩力
    private Rigidbody rig;
    void Start()
    {
        rig = GetComponent<Rigidbody>();
    }
    void Update()
    {
        //添加扭矩力
        rig.AddTorque(Vector3.up * 3);
        //添加相对扭矩力
        rig.AddRelativeTorque(Vector3.up * 3);
    }
  1. Rigidbody.AddForceAtPosition 在指定位置点上施加力
    private Rigidbody rig;
    void Start()
    {
        rig = GetComponent<Rigidbody>();
    }
    void Update()
    {
        rig.AddForceAtPosition(Vector3.up * 3, transform.position);
    }
  1. Rigidbody.Sleep 刚体休眠 / Rigidbody.WakeUp 刚体唤醒
    private Rigidbody rig;
    // Start is called before the first frame update
    void Start()
    {
        rig = GetComponent<Rigidbody>();
        
        //强制当前刚体休眠
        rig.Sleep();
    }
    // Update is called once per frame
    void Update()
    {
        if (rig.IsSleeping() && Input.GetMouseButtonDown(0))
        {
            //强制唤醒当前刚体
            rig.WakeUp();
        }
    }

2、Constant Force 恒定力组件

属性功能
力 (Force)在世界坐标空间中应用的力的向量。
相对力 (Relative Force)在对象局部坐标空间中应用的力的向量。
扭矩 (Torque)在世界坐标空间中应用的扭矩的向量。对象会围绕此向量开始旋转。此向量越长,旋转便越快。
相对扭矩 (Relative Torque)在局部坐标空间中应用的扭矩的向量。对象会围绕此向量开始旋转。此向量越长,旋转便越快。

3、碰撞和触发

3.1、碰撞器
  1. 碰撞的条件:

    1)两者都要具有碰撞组件也就是Collider;
    2)其中之一带有刚体组件,两者都有也可。
    
  2. 碰撞的三阶段:

    1) 当进入碰撞时执行 void OnCollisionEnter(Collison collision);
    2) 当碰撞体与刚体触发时每帧执行void OnCollisionStay(Collision collision);
    3) 当停止碰撞时执行void OnCollisionExit(Collision collision)。
    
3.1、触发器
  1. 触发的条件:

    1)两者具有碰撞组件Collider;
    2)其中之一带有刚体组件,两者都有也可;
    3)其中之一勾选Is Trigger,两者都有也可。
    
  2. 触发的三阶段:

    1)当Collider碰撞体进入触发器时执行 void OnTriggerEnter(Collider collider );
    2) 当碰撞体与触发器接触时每帧执行 void OnTriggerStay(Collider collider );
    3)当停止触发时执行void OnTriggerExit(Collider collider )。
    

附加:作用力方式详解

ForceMode为枚举类型,用来控制力的作用方式,有4个枚举成员,在以下举例中均设刚体质量为m=2.0f,力向量为f=(10.0f,0.0f,0.0f)。
(1)ForceMode.Force:默认方式,使用刚体的质量计算,以每帧间隔时间为单位计算动量。设FixedUpdate()的执行频率采用系统默认值(即0.02s),则由动量定理:f•t=m•v,
可得:100.02=2v1,从而可得v1=0.1,即每帧刚体在X轴上值增加0.1米,从而可计算得刚体的每秒移动速度为v2=(1/0.02)*v1=5m/s。
(2)ForceMode.Acceleration:在此种作用方式下会忽略刚体的实际质量而采用默认值1.0f,时间间隔以系统帧频间隔计算(默认值为0.02s),即f•t=1.0•v
即可得v1= f•t=10*0.02=0.2,即刚体每帧增加0.2米,从而可得刚体的每秒移动速度为v2=(1/0.02)*v1=10m/s。
(3)ForceMode.Impulse:此种方式采用瞬间力作用方式,即把t的值默认为1,不再采用系统的帧频间隔,即f•1.0=m•v
即可得v1=f/m=10.0/2.0=5.0,即刚体每帧增加5.0米,从而可得刚体每秒的速度为v2=(1/0.02)*5.0=250m/s。
(4)ForceMode.VelocityChange:此种作用方式下将忽略刚体的实际质量,采用默认质量1.0,同时也忽略系统的实际帧频间隔,采用默认间隔1.0,即f•1.0=1.0•v
即可得v1=f=10.0,即刚体每帧沿X轴移动距离为10米,从而可得刚体每秒的速度为v2=(1/0.02)*v1=500m/s。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值