Unity3D_(物理引擎)Rigidbody组件
Rigidbody组件刚体(Rigidbody)是Unity物理引擎中的重要组件,一个游戏对象添加了刚体组件以后就开始接受物理力学的影响了,比如重力、空气摩擦力、碰撞产生的推力
Learn
相同高度不同重量物体下落时间
相同重量不同空气阻力对物体的影响
碰撞相关的三个事件
触发器相关的三个事件
创建一个场景Gary,新建四个Cube,一个作为地面,另外三个作为测试方块
给Cube添加材质球(材质Material)
三个测试方块后改名 A、B、C
给Cube添加Rigidbody组件
Mass:质量
Drag:空气阻力
Angular Drag:角阻力
Use Gravity:使用重力
Is Kinematic:是否使用动力学
Interpolate:插值
Collision Detection:碰撞检测
Constraints:约束
相同高度不同重量物体下落时间
修改A、B、C物体Mass的值
A:Mass修改为10
B:Mass修改为50
C:Mass修改为100
结论:不同质量的物体从同一高度自由落体至地面,到达地面的时间相同,最后的速度相同,但动能不相同,
相同重量不同空气阻力对物体的影响
保持A、B、C物体Mass的值相同(10),修改其Drag(空气阻力)的值
A:Drag修改为1
B:Drag修改为10
C:Drag修改为50
结论:相同重量物体,空气阻力越小物体下落快,当物体重量和空气阻力相同时物体会保持下落,当物体重量小于空气阻力时,物体保持不动
(当我把B物体空气阻力改为45时B物体还会保持下落,改为48时,B物体只会下滑0.0033高度,C物体空气阻力为50时在空中y轴值保持不变)
给A物体添加一个RigidTest.cs脚本
AddForce()施加力
AddTorque()施加力矩
AddForceAtPosition()在指定位置施加力
//AddExplosionForce()施加爆炸力
(测试时建议将A物体重力设置低一些,按1给物体施加力,按2给物体施加力矩,按3在指定位置给物体施加力)
using System.Collections; using System.Collections.Generic; using UnityEngine; public class RightText : MonoBehaviour { private Rigidbody r; // Use this for initialization void Start() { r = GetComponent<Rigidbody>(); } // Update is called once per frame void Update() { if (Input.GetKey(KeyCode.Alpha1)) { //施加力 r.AddForce(new Vector3(0f, 10f, 0f)); } if (Input.GetKey(KeyCode.Alpha2)) { //施加力矩 r.AddTorque(new Vector3(0f, 10f, 0f)); } if (Input.GetKey(KeyCode.Alpha3)) { //在指定位置施加力 r.AddForceAtPosition(new Vector3(0f, 10f, 0f), new Vector3(0.5f, 0.5f, 0.5f)); } } }
Collider的主要功能是进行碰撞检测 使用刚体时,一般都会和Collider共同使用
碰撞事件
发生碰撞的两个物体必须都带有Collider
发生碰撞的两个物体至少有一个带有刚体
发生碰撞的两个物体必须有相对运动
碰撞相关的三个事件
碰撞开始时调用一次void OnCollisionEnter(Collision other)
碰撞持续发生时调用void OnCollisionStay(Collision other)
碰撞结束时调用void OnCollisionExit(Collision other)
(A物体与地面进行了碰撞检测)
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ColliderText : MonoBehaviour { void OnCollisionEnter(Collision other) { print("碰撞开始!!!"); } void OnCollisionStay(Collision other) { print("碰撞中!!!"); } void OnCollisionExit(Collision other) { print("开始结束!!!"); } }
触发器相关的三个事件
刚刚进入触发范围时调用一次void OnTriggerEnter(Collider other)
持续在触发范围内会一直调用void OnTriggerStay(Collider other)
离开触发范围时会调用一次void OnTriggerExit(Collider other)
勾选A物体Box Collider下的Is Trigger属性(无视碰撞触发函数)
(因为A物体不会和地面进行碰撞,所以就直接穿过去了)
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ColliderText : MonoBehaviour { //刚刚进入触发范围时调用一次_ void OnTriggerEnter(Collider other) { print("触发开始!!!"); } //持续在触发范围内会一直调用_ void OnTriggerStay(Collider other) { print("触发器检测中!!!"); } //离开触发范围时会调用一次 void OnTriggerExit(Collider other) { print("触发结束!!!"); } }
物理材质
物理材质能够给物体添加摩擦力和弹力
物理材质只能添加到带有Collider的对象上