Skip to content

Commit 3639785

Browse files
authored
Merge pull request #6 from Thundernerd/develop
v2.0.0
2 parents c8fc448 + c54ea9f commit 3639785

15 files changed

+141
-327
lines changed

CHANGELOG.md

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
11
# Changelog
22

3-
## [1.0.2] - 2020-07-14
3+
## [2.0.0] - 2021-02-16
4+
### Changed
5+
- Code generation happens through CodeDom instead of custom generation
6+
7+
### Removed
8+
- Sorting Layer generator
49

10+
## [1.0.2] - 2020-07-14
511
### Fixed
612
- Missing meta file
713

814
## [1.0.1] - 2020-07-14
9-
1015
### Fixed
1116
- Dependency
1217

1318
## [1.0.0] - 2020-07-11
14-
1519
### Added
1620
- Layers Generator
1721
- Sorting Layers Generator
File renamed without changes.
File renamed without changes.

Editor/LayerGenerator.cs

Lines changed: 37 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
using UnityEditor;
1+
using System.CodeDom;
2+
using System.Linq;
3+
using System.Reflection;
4+
using UnityEditor;
25
using UnityEditorInternal;
36
using UnityEngine;
47

@@ -9,39 +12,51 @@ public class LayerGenerator : ICodeGenerator
912
[MenuItem("TNRD/Code Generation/Layers")]
1013
private static void Execute()
1114
{
12-
var generator = new LayerGenerator();
15+
LayerGenerator generator = new LayerGenerator();
1316
generator.Generate();
1417
}
1518

1619
public void Generate()
1720
{
18-
var layers = InternalEditorUtility.layers;
21+
string[] layers = InternalEditorUtility.layers
22+
.OrderBy(x => x)
23+
.ToArray();
1924

20-
var generator = new Generator();
21-
var @class = new Class("Layers");
25+
CodeCompileUnit codeCompileUnit = new CodeCompileUnit();
26+
CodeNamespace codeNamespace = new CodeNamespace();
27+
CodeTypeDeclaration classDeclaration = new CodeTypeDeclaration("Layers")
28+
{
29+
IsClass = true,
30+
TypeAttributes = TypeAttributes.Public | TypeAttributes.Sealed
31+
};
2232

2333
for (int i = 0; i < layers.Length; i++)
2434
{
25-
var layerName = Utilities.GetScreamName(layers[i]);
26-
var maskName = layerName + "_MASK";
27-
28-
@class.AddField(
29-
new Field(layerName, i, typeof(int))
30-
{
31-
IsConst = true,
32-
});
33-
34-
@class.AddField(
35-
new Field(maskName, string.Format("1 << {0}", i), typeof(int))
36-
{
37-
IsConst = true,
38-
});
35+
string layer = layers[i];
36+
string layerName = Utilities.GetScreamName(layer);
37+
string maskName = layerName + "_MASK";
38+
int layerValue = LayerMask.NameToLayer(layer);
39+
40+
CodeMemberField layerField = new CodeMemberField(typeof(int), layerName)
41+
{
42+
Attributes = MemberAttributes.Public | MemberAttributes.Const,
43+
InitExpression = new CodePrimitiveExpression(layerValue)
44+
};
45+
46+
CodeMemberField maskField = new CodeMemberField(typeof(int), maskName)
47+
{
48+
Attributes = MemberAttributes.Public | MemberAttributes.Const,
49+
InitExpression = new CodePrimitiveExpression(1 << layerValue)
50+
};
51+
52+
classDeclaration.Members.Add(layerField);
53+
classDeclaration.Members.Add(maskField);
3954
}
4055

41-
generator.AddClass(@class);
42-
generator.SaveToFile(Application.dataPath + "/Generated/Layers.cs");
56+
codeNamespace.Types.Add(classDeclaration);
57+
codeCompileUnit.Namespaces.Add(codeNamespace);
4358

44-
AssetDatabase.Refresh();
59+
Utilities.GenerateToFile(codeCompileUnit, Application.dataPath + "/Generated", "Layers.cs");
4560
}
4661
}
4762
}

Editor/SortingLayerGenerator.cs

Lines changed: 0 additions & 47 deletions
This file was deleted.

Editor/SortingLayerGenerator.cs.meta

Lines changed: 0 additions & 3 deletions
This file was deleted.

Editor/TagCodeGenerator.cs

Lines changed: 0 additions & 38 deletions
This file was deleted.

Editor/TagGenerator.cs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
using System.CodeDom;
2+
using System.Linq;
3+
using System.Reflection;
4+
using UnityEditor;
5+
using UnityEditorInternal;
6+
using UnityEngine;
7+
8+
namespace TNRD.CodeGeneration.Tags
9+
{
10+
public class TagGenerator : ICodeGenerator
11+
{
12+
[MenuItem("TNRD/Code Generation/Tags")]
13+
private static void Execute()
14+
{
15+
TagGenerator generator = new TagGenerator();
16+
generator.Generate();
17+
}
18+
19+
public void Generate()
20+
{
21+
string[] tags = InternalEditorUtility.tags
22+
.OrderBy(x => x)
23+
.ToArray();
24+
25+
CodeCompileUnit compileUnit = new CodeCompileUnit();
26+
CodeNamespace codeNamespace = new CodeNamespace();
27+
CodeTypeDeclaration classDeclaration = new CodeTypeDeclaration("Tags")
28+
{
29+
IsClass = true,
30+
TypeAttributes = TypeAttributes.Public | TypeAttributes.Sealed
31+
};
32+
33+
foreach (string tag in tags)
34+
{
35+
CodeMemberField field = new CodeMemberField
36+
{
37+
Attributes = MemberAttributes.Public | MemberAttributes.Const,
38+
Name = Utilities.GetScreamName(tag),
39+
Type = new CodeTypeReference(typeof(string)),
40+
InitExpression = new CodePrimitiveExpression(tag)
41+
};
42+
classDeclaration.Members.Add(field);
43+
}
44+
45+
codeNamespace.Types.Add(classDeclaration);
46+
compileUnit.Namespaces.Add(codeNamespace);
47+
48+
Utilities.GenerateToFile(compileUnit, Application.dataPath + "/Generated", "Tags.cs");
49+
}
50+
}
51+
}
File renamed without changes.

Editor/Utilities.cs

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,41 @@
11
using System;
2+
using System.CodeDom;
3+
using System.CodeDom.Compiler;
4+
using System.Collections.Generic;
5+
using System.IO;
26
using System.Linq;
37
using System.Reflection;
8+
using Microsoft.CSharp;
49
using UnityEditor;
510

611
namespace TNRD.CodeGeneration
712
{
813
public static class Utilities
914
{
10-
[MenuItem("TNRD/Code Generation/Generate All", false, Int32.MaxValue)]
15+
[MenuItem("TNRD/Code Generation/Generate All", false, int.MaxValue)]
1116
private static void GenerateAll()
1217
{
13-
var typeDefinition = typeof(ICodeGenerator);
14-
15-
var assembly = Assembly.GetExecutingAssembly();
16-
var types = assembly.GetTypes()
18+
Type typeDefinition = typeof(ICodeGenerator);
19+
20+
Assembly assembly = Assembly.GetExecutingAssembly();
21+
List<Type> types = assembly.GetTypes()
1722
.Where(x => x.GetInterfaces().Contains(typeDefinition))
1823
.ToList();
19-
24+
2025
for (int i = 0; i < types.Count; i++)
2126
{
22-
var type = types[i];
27+
Type type = types[i];
2328
if (type.IsAbstract)
2429
continue;
2530

26-
var instance = (ICodeGenerator) Activator.CreateInstance(type);
31+
ICodeGenerator instance = (ICodeGenerator) Activator.CreateInstance(type);
2732
instance.Generate();
2833
}
2934
}
3035

3136
public static string GetScreamName(string name)
3237
{
33-
var formattedName = "";
38+
string formattedName = "";
3439

3540
name = FilterSpaces(name);
3641

@@ -42,8 +47,8 @@ public static string GetScreamName(string name)
4247
continue;
4348
}
4449

45-
var c = name[i];
46-
var pc = name[i - 1];
50+
char c = name[i];
51+
char pc = name[i - 1];
4752
if (char.IsUpper(c) && char.IsLower(pc))
4853
formattedName += "_";
4954

@@ -55,7 +60,7 @@ public static string GetScreamName(string name)
5560

5661
private static string FilterSpaces(string name)
5762
{
58-
var index = -1;
63+
int index = -1;
5964

6065
while ((index = name.IndexOf(' ')) != -1)
6166
{
@@ -65,12 +70,34 @@ private static string FilterSpaces(string name)
6570
return name;
6671
}
6772

68-
var upperChar = char.ToUpper(name[index + 1]).ToString();
73+
string upperChar = char.ToUpper(name[index + 1]).ToString();
6974
name = name.Remove(index, 2);
7075
name = name.Insert(index, upperChar);
7176
}
7277

7378
return name;
7479
}
80+
81+
public static void GenerateToFile(CodeCompileUnit unit, string directory, string filename)
82+
{
83+
CSharpCodeProvider codeProvider = new CSharpCodeProvider();
84+
CodeGeneratorOptions options = new CodeGeneratorOptions
85+
{
86+
BracingStyle = "C"
87+
};
88+
89+
StringWriter writer = new StringWriter();
90+
codeProvider.GenerateCodeFromCompileUnit(unit, writer, options);
91+
writer.Flush();
92+
string output = writer.ToString();
93+
94+
string directoryPath = directory;
95+
string filePath = directoryPath + "/" + filename;
96+
if (!Directory.Exists(directoryPath))
97+
Directory.CreateDirectory(directoryPath);
98+
99+
File.WriteAllText(filePath, output);
100+
AssetDatabase.Refresh();
101+
}
75102
}
76103
}

0 commit comments

Comments
 (0)