private IEnumerator DelayedOnHit(Vector3 pointA, Vector3 pointB) { var vector = pointB - pointA; var maxDistance = vector.magnitude; var ray = new Ray(pointA, vector); var hit = default(RaycastHit); if (Physics.Raycast(ray, out hit, maxDistance, layers) == true) { var distance01 = Mathf.InverseLerp(0.0f, radius, hit.distance); // Wait based on hit distance yield return(new WaitForSeconds(distance01 * delayMax)); var finalUp = orientation == OrientationType.CameraUp ? P3dHelper.GetCameraUp(_camera) : Vector3.up; var finalPosition = hit.point + hit.normal * offset; var finalNormal = normal == NormalType.HitNormal ? hit.normal : -ray.direction; var finalRotation = Quaternion.LookRotation(-finalNormal, finalUp); var finalPressure = 1.0f - distance01; hitCache.InvokePoint(gameObject, preview, priority, finalPressure, finalPosition, finalRotation); hitCache.InvokeRaycast(gameObject, preview, priority, finalPressure, hit, finalRotation); } }
private void CheckCollision(Collision collision) { if (cooldown > 0.0f) { return; } var impulse = collision.impulse.magnitude / Time.fixedDeltaTime; // Only handle the collision if the impact was strong enough if (impulse >= impactMin) { cooldown = delay; // Calculate up vector ahead of time var finalUp = orientation == OrientationType.CameraUp ? P3dHelper.GetCameraUp(_camera) : Vector3.up; var contacts = collision.contacts; var pressure = Mathf.InverseLerp(impactMin, impactPressure, impulse); var finalRoot = root != null ? root : gameObject; for (var i = contacts.Length - 1; i >= 0; i--) { var contact = contacts[i]; if (P3dHelper.IndexInMask(contact.otherCollider.gameObject.layer, layers) == true) { var finalPosition = contact.point + contact.normal * offset; var finalRotation = Quaternion.LookRotation(-contact.normal, finalUp); hitCache.InvokePoint(finalRoot, preview, priority, pressure, finalPosition, finalRotation); if (raycastDistance > 0.0f) { var ray = new Ray(contact.point + contact.normal * raycastDistance, -contact.normal); var hit = default(RaycastHit); if (contact.otherCollider.Raycast(ray, out hit, raycastDistance * 2.0f) == true) { hitCache.InvokeRaycast(finalRoot, preview, priority, pressure, hit, finalRotation); } } if (onlyUseFirstContact == true) { break; } } } } }
private void CheckCollision(Collision collision) { if (cooldown > 0.0f) { return; } var speed = collision.relativeVelocity.magnitude; // Only handle the collision if the impact was strong enough if (speed >= speedMin) { cooldown = delay; // Calculate up vector ahead of time var finalUp = orientation == OrientationType.CameraUp ? P3dHelper.GetCameraUp(_camera) : Vector3.up; var contacts = collision.contacts; var pressure = Mathf.InverseLerp(speedMin, speedPressure, speed); for (var i = contacts.Length - 1; i >= 0; i--) { var contact = contacts[i]; var finalPosition = contact.point + contact.normal * offset; var finalRotation = Quaternion.LookRotation(-contact.normal, finalUp); hitCache.InvokePoints(gameObject, null, null, false, contact.otherCollider, finalPosition, finalRotation, 1.0f); if (raycastDistance > 0.0f) { var ray = new Ray(contact.point + contact.normal * raycastDistance, -contact.normal); var hit = default(RaycastHit); if (contact.otherCollider.Raycast(ray, out hit, raycastDistance * 2.0f) == true) { hitCache.InvokeRaycast(gameObject, null, null, false, hit, pressure); } } if (onlyUseFirstContact == true) { break; } } } }