private void OnParticleCollision(GameObject other)
        {
            collisions.Clear();
            int count = attachedParticleSystem.GetCollisionEvents(other, collisions);

            if (SpawnControl == SpawnControl.ByReceiver)
            {
                for (int i = 0; i < count; i++)
                {
                    DecalReceiverHelper.SendParticleCollisionEvent(collisions[i]);
                }
            }
            else if (SpawnControl == SpawnControl.BySpawnController)
            {
                for (int i = 0; i < count; i++)
                {
                    var point  = collisions[i].intersection;
                    var normal = collisions[i].normal;

                    var decal = SpawnController.SpawnDecal();
                    decal.transform.position  = point + normal * Offset;
                    decal.transform.up        = normal;
                    decal.transform.rotation *= Quaternion.AngleAxis(Random.value * 360f * RotationJitter, Vector3.up);

                    if (ParentOnCollide)
                    {
                        decal.transform.SetParent(collisions[i].colliderComponent.transform);
                    }
                }
            }
        }
        void SpawnOnCollision(Collision collision)
        {
            if (string.IsNullOrEmpty(TagCheck) || collision.gameObject.CompareTag(TagCheck))
            {
                if (SpawnControl == SpawnControl.ByReceiver)
                {
                    DecalReceiverHelper.SendCollision(collision);
                }
                else if (SpawnControl == SpawnControl.BySpawnController)
                {
                    var contact = collision.contacts[0];

                    var point  = contact.point;
                    var normal = contact.normal;

                    var decal = SpawnController.SpawnDecal();
                    decal.transform.position  = point + normal * Offset;
                    decal.transform.up        = normal;
                    decal.transform.rotation *= Quaternion.AngleAxis(Random.value * 360f * RotationJitter, Vector3.up);

                    if (ParentOnCollide)
                    {
                        decal.transform.SetParent(collision.transform);
                    }
                }
            }
        }
        private void Update()
        {
            bool shift = Input.GetKey(KeyCode.LeftShift);

            if ((Input.GetMouseButtonDown(0) && !shift) || (Input.GetMouseButton(0) && shift))
            {
                if (UseGPURaycast)
                {
                    Vector2 uv = Vector2.zero;

                    uv.x = Input.mousePosition.x / RaycastCamera.pixelWidth;
                    uv.y = Input.mousePosition.y / RaycastCamera.pixelHeight;

                    bool isHitted = GPURaycast.RaycastToRegisteredTargets(RaycastCamera, uv, out hitInfo);

                    if (isHitted)
                    {
                        DecalReceiverHelper.SendGPURaycastInfo(hitInfo);
                    }
                }
                else
                {
                    Ray r = RaycastCamera.ScreenPointToRay(Input.mousePosition);

                    RaycastHit hitInfo;
                    if (Physics.Raycast(r, out hitInfo))
                    {
                        DecalReceiverHelper.SendPhysicsRaycastInfo(hitInfo);
                    }
                }
            }
        }