// // Procedural Lightning for Unity // (c) 2015 Digital Ruby, LLC // Source code may be used for personal or commercial projects. // Source code may NOT be redistributed or sold. // using UnityEngine; using UnityEngine.UI; using System.Collections; namespace DigitalRuby.ThunderAndLightning { #if UNITY_EDITOR && !UNITY_WEBPLAYER /// /// Helps create lightning sprite sheets /// public class LightningSpriteSheetCreator : MonoBehaviour { /// The width of the spritesheet in pixels [Tooltip("The width of the spritesheet in pixels")] public int Width = 512; /// The height of the spritesheet in pixels [Tooltip("The height of the spritesheet in pixels")] public int Height = 512; /// The number of rows in the spritesheet [Tooltip("The number of rows in the spritesheet")] public int Rows = 5; /// The number of columns in the spritesheet [Tooltip("The number of columns in the spritesheet")] public int Columns = 5; /// Delay in between frames to export. Gives time for animations and effects to happen. [Tooltip("Delay in between frames to export. Gives time for animations and effects to happen.")] public float FrameDelay = 0.1f; /// Background color for the sprite sheet. Usually black or transparent. [Tooltip("Background color for the sprite sheet. Usually black or transparent.")] public Color BackgroundColor = Color.black; /// The full path and file name to save the saved sprite sheet to [Tooltip("The full path and file name to save the saved sprite sheet to")] public string SaveFileName; /// The label to notify that the export is working and then completed [Tooltip("The label to notify that the export is working and then completed")] public Text ExportCompleteLabel; private bool exporting; private RenderTexture renderTexture; private void Start() { } private void Update() { } private IEnumerator ExportFrame(int row, int column, float delay) { yield return WaitForSecondsLightning.WaitForSecondsLightningPooled(delay); float cellWidth = (float)Width / (float)Columns; float cellHeight = (float)Height / (float)Rows; float x = ((float)column * cellWidth) / (float)Width; float y = ((float)row * cellHeight) / (float)Height; float w = cellWidth / (float)Width; float h = cellHeight / (float)Height; Camera.main.clearFlags = CameraClearFlags.Nothing; Camera.main.targetTexture = renderTexture; Rect existingViewportRect = Camera.main.rect; Camera.main.rect = new Rect(x, 1.0f - y - h, w, h); Camera.main.Render(); Camera.main.rect = existingViewportRect; Camera.main.targetTexture = null; Camera.main.clearFlags = CameraClearFlags.SolidColor; } private IEnumerator PerformExport(float delay) { yield return WaitForSecondsLightning.WaitForSecondsLightningPooled(delay); RenderTexture.active = renderTexture; Texture2D png = new Texture2D(Width, Height, TextureFormat.ARGB32, false, false); png.ReadPixels(new Rect(0, 0, Width, Height), 0, 0); RenderTexture.active = null; byte[] pngBytes = png.EncodeToPNG(); if (string.IsNullOrEmpty(SaveFileName)) { SaveFileName = System.IO.Path.Combine(Application.persistentDataPath, "LightningSpriteSheet.png"); } System.IO.File.WriteAllBytes(SaveFileName, pngBytes); ExportCompleteLabel.text = "Done!"; exporting = false; renderTexture = null; } /// /// Export button is tapped /// public void ExportTapped() { if (exporting) { return; } exporting = true; ExportCompleteLabel.text = "Processing..."; renderTexture = new RenderTexture(Width, Height, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Default); renderTexture.anisoLevel = 4; renderTexture.antiAliasing = 4; RenderTexture.active = renderTexture; GL.Clear(true, true, BackgroundColor, 0.0f); RenderTexture.active = null; float delay = FrameDelay * 0.5f; for (int i = 0; i < Rows; i++) { for (int j = 0; j < Columns; j++) { StartCoroutine(ExportFrame(i, j, delay)); delay += FrameDelay; } } StartCoroutine(PerformExport(delay)); } } #endif }