public void SetAsPixelPerfect()
        {
            #if UNITY_EDITOR
            if (Vector3H == null)
            {
                base.Awake();
            }

            if (_sprite == null)
            {
                GetSprite();
            }

            if (_pixelPerfectPlugin == null)
            {
                GetPixelPerfectPlugin();
            }

            if (Vector3H == null || _sprite == null || _pixelPerfectPlugin == null)
            {
                return;
            }
            #endif

            // Reset position
            if (IsAChildSprite)
            {
                _transform.localPosition = VectorHVD(
                    Utils.AlignToGrid(LocalPosition.x, _pixelPerfectPlugin.PixelStep),
                    Utils.AlignToGrid(LocalPosition.y, _pixelPerfectPlugin.PixelStep),
                    Vector3D(_transform.localPosition));
            }

            // PointPosition
            _transform.position = VectorHVD(
                Utils.AlignToGrid(Vector3H(_transform.position), _pixelPerfectPlugin.PixelStep),
                Utils.AlignToGrid(Vector3V(_transform.position), _pixelPerfectPlugin.PixelStep),
                Vector3D(_transform.position));

            // Scale
            if (SpriteScale == 0)
            {
                //The user was at 0 scale the last update, so save the current scale
                if (_prevSpriteScale == 0)
                {
                    _initialScale = _transform.localScale;
                }
                //The user just changed the scale to 0, so restore the original scale
                else
                {
                    _transform.localScale = _initialScale;
                }
            }
            else
            {
                var adjustedSpriteScale = SpriteScale < 0 ? 1f / (float)SpriteScale * -1f : SpriteScale;
                var scale = 1f;

                #if PC2D_TK2D_SUPPORT
                if (_spriteTk2d != null)
                {
                    scale = _pixelPerfectPlugin.Tk2DPixelsPerMeter * adjustedSpriteScale * (1 / _pixelPerfectPlugin.PixelsPerUnit);
                }
                else
                {
                #endif

                scale = _sprite.pixelsPerUnit * adjustedSpriteScale * (1 / _pixelPerfectPlugin.PixelsPerUnit);

                    #if PC2D_TK2D_SUPPORT
            }
                    #endif

                _transform.localScale = new Vector3(
                    Mathf.Sign(_transform.localScale.x) * scale,
                    Mathf.Sign(_transform.localScale.y) * scale,
                    _transform.localScale.z);
            }
        }
        public Vector3 OverridePosition(float deltaTime, Vector3 originalPosition)
        {
            if (!enabled)
            {
                return(originalPosition);
            }

            // We do this so we can have the camera movement not snapping to the grid, while the sprites are
            var cameraPixelStep = _pixelStep;

            if (SnapMovementToGrid && !SnapCameraToGrid)
            {
                cameraPixelStep = 1f / (PixelsPerUnit * (ViewportScale + Zoom - 1));
            }

            // If shaking, align the shake parent position to pixel-perfect
            _parent = _transform.parent;
            if (_parent != null && _parent.position != Vector3.zero)
            {
                _parent.position = VectorHVD(Utils.AlignToGrid(Vector3H(_parent.position), cameraPixelStep), Utils.AlignToGrid(Vector3V(_parent.position), cameraPixelStep), Vector3D(_parent.position));
            }

            return(VectorHVD(Utils.AlignToGrid(Vector3H(originalPosition), cameraPixelStep), Utils.AlignToGrid(Vector3V(originalPosition), cameraPixelStep), 0));
        }