void BakeShadows()
        {
#if UNITY_EDITOR
            ShadowContainer container = null;
            ShadowFactory.Instance.Get(new ShadowRenderingRequest(this), ref container);
            var renderTexture = container.Texture;
            Debug.Assert(renderTexture);
            var texture = new Texture2D(renderTexture.width, renderTexture.height,
                                        TextureFormat.ARGB32, false);

            var activeTexture = RenderTexture.active;
            RenderTexture.active = renderTexture;
            texture.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0);
            RenderTexture.active = activeTexture;

            var textureName = $"{SceneManager.GetActiveScene().name} - {gameObject.name} @{size}.png";
            var texturePath = BAKED_SHADOWS_PATH + textureName;
            Directory.CreateDirectory(BAKED_SHADOWS_PATH);
            File.WriteAllBytes(texturePath, texture.EncodeToPNG());
            AssetDatabase.Refresh(ImportAssetOptions.DontDownloadFromCacheServer);

            var importer = (TextureImporter)AssetImporter.GetAtPath(texturePath);

            TextureImporterSettings importSettings = new TextureImporterSettings();
            importer.ReadTextureSettings(importSettings);
            importSettings.textureType    = TextureImporterType.Sprite;
            importSettings.spriteMeshType = SpriteMeshType.Tight;
            importSettings.spriteGenerateFallbackPhysicsShape = false;
            importSettings.alphaSource         = TextureImporterAlphaSource.FromInput;
            importSettings.alphaIsTransparency = true;
            importSettings.mipmapEnabled       = false;
            importer.SetTextureSettings(importSettings);
            importer.SaveAndReimport();

            var bakedSprite = AssetDatabase.LoadAssetAtPath <Sprite>(texturePath);
            bakedShadows.Add(bakedSprite);

            if (Graphic is Image image)
            {
                SpriteAtlasCache.AddToSameAtlas(bakedSprite, image.sprite);
            }

            shadowRenderer.SetSprite(bakedSprite);
#endif
        }
        void RemoveBakedShadow()
        {
#if UNITY_EDITOR
            foreach (var sprite in bakedShadows)
            {
                if (!sprite)
                {
                    continue;
                }

                if (Graphic is Image)
                {
                    SpriteAtlasCache.RemoveFromAllAtlas(sprite);
                }

                var path = AssetDatabase.GetAssetPath(sprite);
                AssetDatabase.DeleteAsset(path);
            }

            bakedShadows.Clear();
#endif
        }