private void ExecCollisionProcess(Collision collision)
        {
            float collisionVelocity = this.colliderVelocities[Array.IndexOf(this.colliders, collision.contacts[0].thisCollider)];

            SIGVerseLogger.Info("HSR Collision Detection! Time=" + Time.time + ", Collision Velocity=" + collisionVelocity +
                                ", Part=" + collision.contacts[0].thisCollider.name + ", Collided object=" + SIGVerseUtils.GetHierarchyPath(collision.collider.transform));

            // Effect
            GameObject effect = MonoBehaviour.Instantiate(this.collisionEffect);

            Vector3 contactPoint = SIGVerseUtils.CalcContactAveragePoint(collision);

            effect.transform.position   = contactPoint;
            effect.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);

            Destroy(effect, 1.0f);

            // Send the collision notification
            foreach (GameObject destination in this.collisionNotificationDestinations)
            {
                ExecuteEvents.Execute <IHSRCollisionHandler>
                (
                    target: destination,
                    eventData: null,
                    functor: (reciever, eventData) => reciever.OnHsrCollisionEnter(collision, collisionVelocity, 0.5f)
                );
            }

            this.collidedTime = Time.time;
        }
        private void ExecCollisionProcess(CollisionType collisionType, Collision collision)
        {
            SIGVerseLogger.Info("Object collision occurred. name=" + this.name + " Collided object=" + SIGVerseUtils.GetHierarchyPath(collision.collider.transform) + ", vel=" + collision.relativeVelocity);

            // Effect
            GameObject effect = MonoBehaviour.Instantiate(this.collisionEffect);

            Vector3 contactPoint = SIGVerseUtils.CalcContactAveragePoint(collision);

            effect.transform.position   = contactPoint;
            effect.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);

            Destroy(effect, 1.0f);

            // Sound
            if (this.objectCollisionAudioSource != null)
            {
                this.objectCollisionAudioSource.Play();
            }

            foreach (GameObject destination in this.destinations)
            {
                ExecuteEvents.Execute <ITransferredCollisionHandler>
                (
                    target: destination,
                    eventData: null,
                    functor: (reciever, eventData) => reciever.OnTransferredCollisionEnter(collisionType, collision, collision.relativeVelocity.magnitude, 0.1f)
                );
            }
        }
        protected static string GetDataLine(string elapsedTime, Collision collision, float collisionVelocity, float effectScale, string dataType)
        {
            Vector3 contactAve = SIGVerseUtils.CalcContactAveragePoint(collision);

            string dataLine = elapsedTime + "," + dataType;

            dataLine += "\t" + contactAve.x + "\t" + contactAve.y + "\t" + contactAve.z + "\t" + effectScale;

            // Following data is unused now
            dataLine += "\t" + collisionVelocity +
                        "\t" + SIGVerseUtils.GetHierarchyPath(collision.contacts[0].thisCollider.transform) +
                        "\t" + SIGVerseUtils.GetHierarchyPath(collision.contacts[0].otherCollider.transform);

            return(dataLine);
        }