1、刚体
与同样可以控制物体的Transform组件相比:
- Transform重点在于物体的位置和旋转上
- RigidBody重点放在物体的力、速度和扭矩上
RigidBody组件:
Mass:质量(kg)
Drag:阻力;用于表示物体移动时会受到的空气阻力,0为不受阻力影响
AngularDrag:角阻力;用于表示当物体根据扭矩旋转时受到的空气阻力大小
UseGravity:是否使用重力
IsKinematic:运动学;刚体不会受到物理特性的影响,但是仍然可以触发物理检测等功能
Interpolate:插值;
- none 无
- interpolate 根据上一帧的变化进行插值
- extrapolate 根据下一帧的变化进行插值
CollisionDetection:碰撞检测;
- discrete 离散的
- continuous 持续
- continuousDynamic 连续动态
- ContinuousSpeculative;连续检测
constraints :冻结;冻结刚体在某个轴向的移动或旋转
RigidBody类常用属性方法:
属性方法 | 详解 |
position | 刚体的位置 |
rotation | 刚体的旋转 |
velocity | 刚体的速度 |
AddForce | 向刚体添加一个力 |
AddExplosionForce | 向模拟爆炸的刚体添加一个力 |
AddTorque | 向刚体添加一个扭矩 |
MovePosition | 移动刚体 |
MoveRotation | 旋转刚体 |
IsSleeping | 是否在休眠状态 |
Sleep | 让刚体进入至少一帧的休眠 |
WakeUp | 唤醒刚体 |
2、碰撞器
1.BoxCollider 方体碰撞器
参数:
EditCollider:编辑碰撞器;
IsTrigger:是触发器;触发事件并忽略碰撞
2.球体碰撞器
3.胶囊碰撞器
4.地形碰撞器
5.网格碰撞器
参数:
Convex:凸面;触发器是否为凸面
CookingOptions:烹饪选项;
细节:
WheelCollider(车轮碰撞器):
- 最大转弯角度:steerAngle;
- 最大动力:motorTorque;
3、物理关节
1.Hinge Joint铰链关节
作用:组合两个刚体
参数:
EditAngularLimits(编辑关节角度限制):
ConnectedBody(连接刚体):
ConnectedArticulation(连接关节):
Anchor(锚点):轴的锚点位置
Axis(轴):关节轴的方向
UseSpring(使用弹簧):
Spring(弹簧力):弹力
Damper(阻尼):阻尼力
TargetPosition(目标角度):弹簧会朝着该角度变化
UseMotor(使用动力):使用电机动力运动
Target Velocity(目标速度):
Force(力):
FreeSpin(自由旋转):勾选则电机不会停止
Limits(限制):角度限制
BreakForce(断开力):
BreakTorque(断开力矩):
2.Spring Joint弹簧关节
3.Fixed Joint固定关节
施加力可使两者分离
4、物理材质
体现不同的物理特性;
放在MeshCollider组件中的“材质”选项;
参数:
DynamicFriction(动摩擦力):数值范围为0-1;
StaticFriction(静摩檫力):静摩檫力,数值范围为0-1;
Bounciness(弹力):数值范围为0-1。0代表无弹力,1代表弹力最大;
FrictionCombine(摩檫力组合):摩檫力的组合模式;
Average(平均值):使用两个摩檫力的平均值;
Minimum(乘积):使用两个摩檫力的乘积;
Maximum(最大值):使用两个摩檫力中的最大值;
BounceCombine(弹力组合):与“摩檫力组合”类似;
5、碰撞检测
要求:
- 两物体有碰撞器组件
- 至少有一个游戏物体具有刚体组件(一般是游戏角色添加)
碰撞监听方法:
- OnCollisionEnter
- OnCollisionStay
- OnCollisionExit
6、触发检测
触发监听方法:
- OnTriggerEnter
- OnTriggerStay
- OnTriggerExit
7、射线
1.射线碰撞检测
射线的创建:
//the one
Ray ray1=Camera.main.ScreenPointToRay(Input.mousePosition);
//the two
Ray ray2=new Ray(Vector3.zero,Vector3.up);
射线碰撞信息类:
RaycastHit hit;
//是否碰撞
bool res=Physics.Raycast(ray,out hit);
//碰撞坐标
hit.point;
2.射线多碰撞检测
创建方式还是一样
RaycastHit[] hits;
//是否碰撞
hits=Physics.RaycastAll(ray);
- Physics.RaycastAll(ray,distance,layer);layer:数量<<层数,1<<10 = 仅发射其中一层,这一层指定为第十层