1、Physics Material 物理材质
Physic Material 用于调整碰撞体对象的摩擦力和弹力效果。
-
物理材质的创建:
在Project视图空白处,鼠标右击-----选中Create-----physicMaterial
属性 | 功能 |
---|---|
Dynamic Friction | 作用于运动中的对象的摩擦力,通常设为0到1之间的值。值为0时,对象像冰块一样光滑;值为1时,不受力(合力为0)的对象将很快停止运动。 |
Static Friction | 作用于静止在其他物体表面的对象的摩擦力,通常设为0到1之间的值。值为0时,对象像冰块一样容易滑动;值为1时,需要施加很大的力才能使对象开始运动。 |
Bounciness | 对象的表面弹性。值为0时,对象完全没有弹力;值为1时,对象变为具有完全弹性的理想刚体(在碰撞过程中完全不随损失能量)。 |
Friction Combine | 发生碰撞的两个碰撞体对象的摩擦力的混合方式:01、Maximum - 取两个对象的摩擦力的最大值;02、Multiply - 取两个对象的摩擦力相乘后的值;03、Minimum - 取两个对象的摩擦力的最小值; 04、Average - 取两个对象的摩擦力的平均值。 |
Bounce Combine | 发生碰撞的两个碰撞体对象的弹力的混合方式。其参数与Friction Combine的参数相同。 |
2、Joint 关节
连接刚体与刚体的对应的物理模拟。
关节类型:
链条关节,固定关节,弹簧关节,角色关节和可配置关节。
-
链条关节(hinge joint)
将两个物体以链条的形式绑在一起,当力量大于链条的固定力矩时,两个物体就会产生相互的拉力。
-
固定关节(fixed joint)
将两个物体永远以相对的位置固定在一起,即使发生物理改变,它们之间的相对位置也将不变。
-
弹簧关节(spring joint)
将两个物体以弹簧的形式绑定在一起,挤压它们会得到向外的力,拉伸它们将得到向里的力。
-
角色关节(character joint)
可以模拟角色的骨骼关节。
-
可配置关节(configurable joint)
可以模拟任意关节的效果。
3、射线检测
- Debug.DrawLine / Debug.DrawRay 绘制射线
Debug.DrawLine(transform.position, Vector3.right, Color.green, 100);
Debug.DrawRay(transform.position, Vector3.right, Color.green, 100);
- 示例
public Transform playerTrans;
private Rigidbody playerRigid;
public float camRayLength = 100;
private int floorMask;
// Start is called before the first frame update
void Start()
{
//LayerMask一般用于Physics.Raycast光线投射
//只选定Layermask层内的碰撞器,其它层内碰撞器忽略
floorMask = LayerMask.GetMask("Floor");
playerRigid = playerTrans.GetComponent<Rigidbody>();
}
private void FixedUpdate()
{
Turning();
}
/// <summary>
/// player旋转 前提:摄像机对着地面
/// </summary>
private void Turning()
{
// 从鼠标光标沿相机方向创建一个射线
Ray camRay = Camera.main.ScreenPointToRay(Input.mousePosition);
// 存储被射线击中的物体的信息.
RaycastHit floorHit;
//如果检测到碰撞,返回true
bool isCollider = Physics.Raycast(camRay, out floorHit, camRayLength, floorMask);
// 如果它碰到"Floor"层上的东西,进行射线检测
if (isCollider)
{
//Debug.Log(isCollider); //检测到发生了碰撞输出true
//Debug.Log(floorHit.collider); //输出碰撞体的名字
//Debug.Log(floorHit.point); //输出碰撞的点的坐标
// 取得从playerTrans指向floorHit的向量
Vector3 offectPos = floorHit.point - playerTrans.position;
// 确保该向量的y值为0
offectPos.y = 0f;
Quaternion newRotatation = Quaternion.LookRotation(offectPos);
// 平滑的转过去
playerRigid.MoveRotation(newRotatation);
}
}