float CalculateFrictionCoefficient(EFrictionType frictionType) { float frictionCoefficient = 0.0f; //determine our friction values Collider coll = GetComponent <Collider>(); float ourFriction = (frictionType == EFrictionType.EFT_Static) ? coll.material.staticFriction : coll.material.dynamicFriction; PhysicMaterialCombine ourCombine = coll.material.frictionCombine; //check if we are colliding against an object Vector3 ourPosition = transform.position; float ourHeight = transform.localScale.y; float ourGroundBuffer = 0.25f; int layer = LayerMask.NameToLayer("Ball"); int layerMask = 1 << layer; layerMask = ~layerMask; RaycastHit hit; if (Physics.Raycast(ourPosition, -Vector3.up, out hit, (ourHeight * 0.5f) + ourGroundBuffer, layerMask)) { float hitFriction = (frictionType == EFrictionType.EFT_Static) ? hit.collider.material.staticFriction : hit.collider.material.dynamicFriction; PhysicMaterialCombine hitCombine = hit.collider.material.frictionCombine; //Average < Minimum < Multiply < Maximum bool isMax = hitCombine == PhysicMaterialCombine.Maximum || ourCombine == PhysicMaterialCombine.Maximum; bool isMultiply = hitCombine == PhysicMaterialCombine.Multiply || ourCombine == PhysicMaterialCombine.Multiply; bool isMin = hitCombine == PhysicMaterialCombine.Minimum || ourCombine == PhysicMaterialCombine.Minimum; bool isAverage = hitCombine == PhysicMaterialCombine.Average || ourCombine == PhysicMaterialCombine.Average; if (isMax) { frictionCoefficient = hitFriction > ourFriction ? hitFriction : ourFriction; } else if (isMultiply) { frictionCoefficient = hitFriction * ourFriction; } else if (isMin) { frictionCoefficient = hitFriction < ourFriction ? hitFriction : ourFriction; } else if (isAverage) { frictionCoefficient = (hitFriction + ourFriction) * 0.5f; } } return(frictionCoefficient); }
float CalculateFrictionalForce(EFrictionType frictionType) { return(CalculateNormalForce() * CalculateFrictionCoefficient(frictionType)); }