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 }