Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        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;
                        }
                    }
                }
            }
        }
Exemplo n.º 3
0
        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;
                    }
                }
            }
        }