diff --git a/CHANGELOG.md b/CHANGELOG.md index fa232e8..73f55be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,17 +1,21 @@ # Changelog -## [1.0.2] - 2020-07-14 +## [2.0.0] - 2021-02-16 +### Changed +- Code generation happens through CodeDom instead of custom generation + +### Removed +- Sorting Layer generator +## [1.0.2] - 2020-07-14 ### Fixed - Missing meta file ## [1.0.1] - 2020-07-14 - ### Fixed - Dependency ## [1.0.0] - 2020-07-11 - ### Added - Layers Generator - Sorting Layers Generator diff --git a/~Documentation/generated_files.png b/Documentation~/generated_files.png similarity index 100% rename from ~Documentation/generated_files.png rename to Documentation~/generated_files.png diff --git a/~Documentation/menu_items.png b/Documentation~/menu_items.png similarity index 100% rename from ~Documentation/menu_items.png rename to Documentation~/menu_items.png diff --git a/Editor/LayerGenerator.cs b/Editor/LayerGenerator.cs index f4dbacf..828e716 100644 --- a/Editor/LayerGenerator.cs +++ b/Editor/LayerGenerator.cs @@ -1,4 +1,7 @@ -using UnityEditor; +using System.CodeDom; +using System.Linq; +using System.Reflection; +using UnityEditor; using UnityEditorInternal; using UnityEngine; @@ -9,39 +12,51 @@ public class LayerGenerator : ICodeGenerator [MenuItem("TNRD/Code Generation/Layers")] private static void Execute() { - var generator = new LayerGenerator(); + LayerGenerator generator = new LayerGenerator(); generator.Generate(); } public void Generate() { - var layers = InternalEditorUtility.layers; + string[] layers = InternalEditorUtility.layers + .OrderBy(x => x) + .ToArray(); - var generator = new Generator(); - var @class = new Class("Layers"); + CodeCompileUnit codeCompileUnit = new CodeCompileUnit(); + CodeNamespace codeNamespace = new CodeNamespace(); + CodeTypeDeclaration classDeclaration = new CodeTypeDeclaration("Layers") + { + IsClass = true, + TypeAttributes = TypeAttributes.Public | TypeAttributes.Sealed + }; for (int i = 0; i < layers.Length; i++) { - var layerName = Utilities.GetScreamName(layers[i]); - var maskName = layerName + "_MASK"; - - @class.AddField( - new Field(layerName, i, typeof(int)) - { - IsConst = true, - }); - - @class.AddField( - new Field(maskName, string.Format("1 << {0}", i), typeof(int)) - { - IsConst = true, - }); + string layer = layers[i]; + string layerName = Utilities.GetScreamName(layer); + string maskName = layerName + "_MASK"; + int layerValue = LayerMask.NameToLayer(layer); + + CodeMemberField layerField = new CodeMemberField(typeof(int), layerName) + { + Attributes = MemberAttributes.Public | MemberAttributes.Const, + InitExpression = new CodePrimitiveExpression(layerValue) + }; + + CodeMemberField maskField = new CodeMemberField(typeof(int), maskName) + { + Attributes = MemberAttributes.Public | MemberAttributes.Const, + InitExpression = new CodePrimitiveExpression(1 << layerValue) + }; + + classDeclaration.Members.Add(layerField); + classDeclaration.Members.Add(maskField); } - generator.AddClass(@class); - generator.SaveToFile(Application.dataPath + "/Generated/Layers.cs"); + codeNamespace.Types.Add(classDeclaration); + codeCompileUnit.Namespaces.Add(codeNamespace); - AssetDatabase.Refresh(); + Utilities.GenerateToFile(codeCompileUnit, Application.dataPath + "/Generated", "Layers.cs"); } } } diff --git a/Editor/SortingLayerGenerator.cs b/Editor/SortingLayerGenerator.cs deleted file mode 100644 index a09725e..0000000 --- a/Editor/SortingLayerGenerator.cs +++ /dev/null @@ -1,47 +0,0 @@ -using UnityEditor; -using UnityEngine; - -namespace TNRD.CodeGeneration.Layers -{ - public class SortingLayerGenerator : ICodeGenerator - { - [MenuItem("TNRD/Code Generation/Sorting Layers")] - private static void Execute() - { - var generator = new SortingLayerGenerator(); - generator.Generate(); - } - - public void Generate() - { - var layers = SortingLayer.layers; - - var generator = new Generator(); - var @class = new Class("SortingLayers"); - - for (int i = 0; i < layers.Length; i++) - { - var layer = layers[i]; - var layerName = Utilities.GetScreamName(layer.name); - var layerIdName = layerName + "_ID"; - - @class.AddField( - new Field(layerName, layer.name, typeof(string)) - { - IsConst = true, - }); - - @class.AddField( - new Field(layerIdName, layer.id, typeof(int)) - { - IsConst = true, - }); - } - - generator.AddClass(@class); - generator.SaveToFile(Application.dataPath + "/Generated/SortingLayers.cs"); - - AssetDatabase.Refresh(); - } - } -} diff --git a/Editor/SortingLayerGenerator.cs.meta b/Editor/SortingLayerGenerator.cs.meta deleted file mode 100644 index 86ba41e..0000000 --- a/Editor/SortingLayerGenerator.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: cdb1ee23c22a4bb08f4b969f60999676 -timeCreated: 1594471247 \ No newline at end of file diff --git a/Editor/TagCodeGenerator.cs b/Editor/TagCodeGenerator.cs deleted file mode 100644 index 558472a..0000000 --- a/Editor/TagCodeGenerator.cs +++ /dev/null @@ -1,38 +0,0 @@ -using UnityEditor; -using UnityEditorInternal; -using UnityEngine; - -namespace TNRD.CodeGeneration.Tags -{ - public class TagCodeGenerator : ICodeGenerator - { - [MenuItem("TNRD/Code Generation/Tags")] - private static void Execute() - { - var generator = new TagCodeGenerator(); - generator.Generate(); - } - - public void Generate() - { - var tags = InternalEditorUtility.tags; - - var generator = new Generator(); - var tagsClass = new Class("Tags"); - - foreach (var tag in tags) - { - tagsClass.AddField( - new Field(Utilities.GetScreamName(tag), tag, typeof(string)) - { - IsConst = true, - }); - } - - generator.AddClass(tagsClass); - generator.SaveToFile(Application.dataPath + "/Generated/Tags.cs"); - - AssetDatabase.Refresh(); - } - } -} diff --git a/Editor/TagGenerator.cs b/Editor/TagGenerator.cs new file mode 100644 index 0000000..a2a58af --- /dev/null +++ b/Editor/TagGenerator.cs @@ -0,0 +1,51 @@ +using System.CodeDom; +using System.Linq; +using System.Reflection; +using UnityEditor; +using UnityEditorInternal; +using UnityEngine; + +namespace TNRD.CodeGeneration.Tags +{ + public class TagGenerator : ICodeGenerator + { + [MenuItem("TNRD/Code Generation/Tags")] + private static void Execute() + { + TagGenerator generator = new TagGenerator(); + generator.Generate(); + } + + public void Generate() + { + string[] tags = InternalEditorUtility.tags + .OrderBy(x => x) + .ToArray(); + + CodeCompileUnit compileUnit = new CodeCompileUnit(); + CodeNamespace codeNamespace = new CodeNamespace(); + CodeTypeDeclaration classDeclaration = new CodeTypeDeclaration("Tags") + { + IsClass = true, + TypeAttributes = TypeAttributes.Public | TypeAttributes.Sealed + }; + + foreach (string tag in tags) + { + CodeMemberField field = new CodeMemberField + { + Attributes = MemberAttributes.Public | MemberAttributes.Const, + Name = Utilities.GetScreamName(tag), + Type = new CodeTypeReference(typeof(string)), + InitExpression = new CodePrimitiveExpression(tag) + }; + classDeclaration.Members.Add(field); + } + + codeNamespace.Types.Add(classDeclaration); + compileUnit.Namespaces.Add(codeNamespace); + + Utilities.GenerateToFile(compileUnit, Application.dataPath + "/Generated", "Tags.cs"); + } + } +} diff --git a/Editor/TagCodeGenerator.cs.meta b/Editor/TagGenerator.cs.meta similarity index 100% rename from Editor/TagCodeGenerator.cs.meta rename to Editor/TagGenerator.cs.meta diff --git a/Editor/Utilities.cs b/Editor/Utilities.cs index 2ef327d..0d4fb46 100644 --- a/Editor/Utilities.cs +++ b/Editor/Utilities.cs @@ -1,36 +1,41 @@ using System; +using System.CodeDom; +using System.CodeDom.Compiler; +using System.Collections.Generic; +using System.IO; using System.Linq; using System.Reflection; +using Microsoft.CSharp; using UnityEditor; namespace TNRD.CodeGeneration { public static class Utilities { - [MenuItem("TNRD/Code Generation/Generate All", false, Int32.MaxValue)] + [MenuItem("TNRD/Code Generation/Generate All", false, int.MaxValue)] private static void GenerateAll() { - var typeDefinition = typeof(ICodeGenerator); - - var assembly = Assembly.GetExecutingAssembly(); - var types = assembly.GetTypes() + Type typeDefinition = typeof(ICodeGenerator); + + Assembly assembly = Assembly.GetExecutingAssembly(); + List types = assembly.GetTypes() .Where(x => x.GetInterfaces().Contains(typeDefinition)) .ToList(); - + for (int i = 0; i < types.Count; i++) { - var type = types[i]; + Type type = types[i]; if (type.IsAbstract) continue; - var instance = (ICodeGenerator) Activator.CreateInstance(type); + ICodeGenerator instance = (ICodeGenerator) Activator.CreateInstance(type); instance.Generate(); } } public static string GetScreamName(string name) { - var formattedName = ""; + string formattedName = ""; name = FilterSpaces(name); @@ -42,8 +47,8 @@ public static string GetScreamName(string name) continue; } - var c = name[i]; - var pc = name[i - 1]; + char c = name[i]; + char pc = name[i - 1]; if (char.IsUpper(c) && char.IsLower(pc)) formattedName += "_"; @@ -55,7 +60,7 @@ public static string GetScreamName(string name) private static string FilterSpaces(string name) { - var index = -1; + int index = -1; while ((index = name.IndexOf(' ')) != -1) { @@ -65,12 +70,34 @@ private static string FilterSpaces(string name) return name; } - var upperChar = char.ToUpper(name[index + 1]).ToString(); + string upperChar = char.ToUpper(name[index + 1]).ToString(); name = name.Remove(index, 2); name = name.Insert(index, upperChar); } return name; } + + public static void GenerateToFile(CodeCompileUnit unit, string directory, string filename) + { + CSharpCodeProvider codeProvider = new CSharpCodeProvider(); + CodeGeneratorOptions options = new CodeGeneratorOptions + { + BracingStyle = "C" + }; + + StringWriter writer = new StringWriter(); + codeProvider.GenerateCodeFromCompileUnit(unit, writer, options); + writer.Flush(); + string output = writer.ToString(); + + string directoryPath = directory; + string filePath = directoryPath + "/" + filename; + if (!Directory.Exists(directoryPath)) + Directory.CreateDirectory(directoryPath); + + File.WriteAllText(filePath, output); + AssetDatabase.Refresh(); + } } } diff --git a/README.md b/README.md index 78fe0f0..b5b741e 100644 --- a/README.md +++ b/README.md @@ -32,12 +32,12 @@ Once you have installed the package into your project you can access the generat You can generate the Tags, Layers, and Sorting Layers all separately by using their respective menu items, or generate them all by using the Generate All menu item. -![alt](./~Documentation/menu_items.png) +![alt](./Documentation~/menu_items.png) Once you have generated one or more through the menu, you will see the files appear in your project located int he Generated folder, which resides at top level in your Assets folder. -![alt](./~Documentation/generated_files.png) +![alt](./Documentation~/generated_files.png) To use the generated files you simply access them through their classes which are: Tags, Layers, and SortingLayers. Below is an example of a use case for the Tags. diff --git a/package.json b/package.json index ce56108..741f4e9 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { "name": "net.tnrd.layertagsgenerator", "displayName": "Layer Tags Generator", - "version": "1.0.2", + "version": "2.0.0", "unity": "2019.1", - "description": "A simple tool to generate files that contain the project's Layers, Sorting Layers, and Tags.", + "description": "A simple tool to generate files that contain the project's Layers and Tags.", "keywords": [ "layer", "layers", @@ -12,11 +12,8 @@ "generator" ], "author": { - "name": "Christiaan Bloemendaal", + "name": "TNRD", "email": "unity3d@tnrd.net", "url": "https://www.tnrd.net" - }, - "dependencies": { - "net.tnrd.codegenerator": "1.0.0" } -} +} \ No newline at end of file diff --git a/~Documentation.meta b/~Documentation.meta deleted file mode 100644 index a1f45fd..0000000 --- a/~Documentation.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: a8785b1699b84b618d52072b90c6d962 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/~Documentation/generated_files.png.meta b/~Documentation/generated_files.png.meta deleted file mode 100644 index 255183c..0000000 --- a/~Documentation/generated_files.png.meta +++ /dev/null @@ -1,92 +0,0 @@ -fileFormatVersion: 2 -guid: 9a0b6a66c6d9f0f43a4cd068c37eeaec -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 11 - mipmaps: - mipMapMode: 0 - enableMipMap: 1 - sRGBTexture: 1 - linearTexture: 0 - fadeOut: 0 - borderMipMap: 0 - mipMapsPreserveCoverage: 0 - alphaTestReferenceValue: 0.5 - mipMapFadeDistanceStart: 1 - mipMapFadeDistanceEnd: 3 - bumpmap: - convertToNormalMap: 0 - externalNormalMap: 0 - heightScale: 0.25 - normalMapFilter: 0 - isReadable: 0 - streamingMipmaps: 0 - streamingMipmapsPriority: 0 - grayScaleToAlpha: 0 - generateCubemap: 6 - cubemapConvolution: 0 - seamlessCubemap: 0 - textureFormat: 1 - maxTextureSize: 2048 - textureSettings: - serializedVersion: 2 - filterMode: -1 - aniso: -1 - mipBias: -100 - wrapU: -1 - wrapV: -1 - wrapW: -1 - nPOTScale: 1 - lightmap: 0 - compressionQuality: 50 - spriteMode: 0 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spriteGenerateFallbackPhysicsShape: 1 - alphaUsage: 1 - alphaIsTransparency: 0 - spriteTessellationDetail: -1 - textureType: 0 - textureShape: 1 - singleChannelComponent: 0 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - applyGammaDecoding: 0 - platformSettings: - - serializedVersion: 3 - buildTarget: DefaultTexturePlatform - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - physicsShape: [] - bones: [] - spriteID: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - spritePackingTag: - pSDRemoveMatte: 0 - pSDShowRemoveMatteOption: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/~Documentation/menu_items.png.meta b/~Documentation/menu_items.png.meta deleted file mode 100644 index bbd8fe7..0000000 --- a/~Documentation/menu_items.png.meta +++ /dev/null @@ -1,92 +0,0 @@ -fileFormatVersion: 2 -guid: bcf9ed4ca562919459ffa22a44d2914d -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 11 - mipmaps: - mipMapMode: 0 - enableMipMap: 1 - sRGBTexture: 1 - linearTexture: 0 - fadeOut: 0 - borderMipMap: 0 - mipMapsPreserveCoverage: 0 - alphaTestReferenceValue: 0.5 - mipMapFadeDistanceStart: 1 - mipMapFadeDistanceEnd: 3 - bumpmap: - convertToNormalMap: 0 - externalNormalMap: 0 - heightScale: 0.25 - normalMapFilter: 0 - isReadable: 0 - streamingMipmaps: 0 - streamingMipmapsPriority: 0 - grayScaleToAlpha: 0 - generateCubemap: 6 - cubemapConvolution: 0 - seamlessCubemap: 0 - textureFormat: 1 - maxTextureSize: 2048 - textureSettings: - serializedVersion: 2 - filterMode: -1 - aniso: -1 - mipBias: -100 - wrapU: -1 - wrapV: -1 - wrapW: -1 - nPOTScale: 1 - lightmap: 0 - compressionQuality: 50 - spriteMode: 0 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spriteGenerateFallbackPhysicsShape: 1 - alphaUsage: 1 - alphaIsTransparency: 0 - spriteTessellationDetail: -1 - textureType: 0 - textureShape: 1 - singleChannelComponent: 0 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - applyGammaDecoding: 0 - platformSettings: - - serializedVersion: 3 - buildTarget: DefaultTexturePlatform - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - physicsShape: [] - bones: [] - spriteID: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - spritePackingTag: - pSDRemoveMatte: 0 - pSDShowRemoveMatteOption: 0 - userData: - assetBundleName: - assetBundleVariant: