Skip to content

Commit 10dc286

Browse files
committed
Add editor window for auto creation of new variables
1 parent 4d15739 commit 10dc286

File tree

3 files changed

+256
-0
lines changed

3 files changed

+256
-0
lines changed

Packages/SOVariables/Editor/Window.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 237 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,237 @@
1+
using System;
2+
using System.IO;
3+
using System.Linq;
4+
using UnityEditor;
5+
using UnityEngine;
6+
7+
namespace RaCoding.GameEvents
8+
{
9+
public class VariableWindow : EditorWindow
10+
{
11+
private static readonly string TAB = " ";
12+
private static readonly string PACKAGE_NAMESPACE = "RaCoding.Variables";
13+
private static readonly string IMMUTABLEVARIABLE_CLASS_SUFFIX = "ImmutableVariable";
14+
private static readonly string MUTABLEVARIABLE_CLASS_SUFFIX = "MutableVariable";
15+
private static readonly string MUTABLEVARIABLEREFERENCE_CLASS_SUFFIX = "MutableVariableReference";
16+
private static readonly string VARIABLEEDITOR_CLASS_SUFFIX = "VariableEditor";
17+
18+
private string _newNamespace = "RaCoding.Variables";
19+
private string _newType = "Sprite";
20+
private string _newTypeNamespace = "UnityEngine";
21+
22+
private bool _groupEnabled;
23+
private bool _overrideExistingFiles = false;
24+
25+
[MenuItem("Window/RaCoding/SO Variable Creator")]
26+
static void Init()
27+
{
28+
// Get existing open window or if none, make a new one:
29+
var window = (VariableWindow)EditorWindow.GetWindow(typeof(VariableWindow));
30+
window.Show();
31+
}
32+
33+
void OnGUI()
34+
{
35+
GUILayout.Label("Base Settings", EditorStyles.boldLabel);
36+
_newNamespace = EditorGUILayout.TextField("Namespace", _newNamespace);
37+
_newType = EditorGUILayout.TextField("Type", _newType);
38+
_newTypeNamespace = EditorGUILayout.TextField("Type Namespace", _newTypeNamespace);
39+
40+
_groupEnabled = EditorGUILayout.BeginToggleGroup("Optional Settings", _groupEnabled);
41+
_overrideExistingFiles = EditorGUILayout.Toggle("Override existing files", _overrideExistingFiles);
42+
EditorGUILayout.EndToggleGroup();
43+
44+
GUILayout.Space(10);
45+
46+
if (GUILayout.Button("Generate"))
47+
{
48+
GenerateScripts();
49+
}
50+
}
51+
52+
private string GenerateClassNames(string suffix)
53+
{
54+
if (string.IsNullOrEmpty(_newType))
55+
{
56+
throw new ArgumentException("Type can not be null or empty!");
57+
}
58+
return _newType.First().ToString().ToUpper() + _newType[1..] + suffix;
59+
}
60+
61+
private string GenerateVariableNamesPrefix()
62+
{
63+
if (string.IsNullOrEmpty(_newType))
64+
{
65+
throw new ArgumentException("Type can not be null or empty!");
66+
}
67+
return _newType.First().ToString().ToLower() + _newType[1..];
68+
}
69+
70+
private string GenerateClassPath(string className)
71+
{
72+
return "Assets/" + className + ".cs";
73+
}
74+
75+
private void GenerateScripts()
76+
{
77+
Debug.Log("Generating scripts...");
78+
79+
// class names
80+
string immutableVariableClassName = GenerateClassNames(IMMUTABLEVARIABLE_CLASS_SUFFIX);
81+
string mutableVariableClassName = GenerateClassNames(MUTABLEVARIABLE_CLASS_SUFFIX);
82+
string mutableVariableReferenceClassName = GenerateClassNames(MUTABLEVARIABLEREFERENCE_CLASS_SUFFIX);
83+
string variableEditorClassName = GenerateClassNames(VARIABLEEDITOR_CLASS_SUFFIX);
84+
85+
// class paths
86+
string immutableVariableClassPath = GenerateClassPath(immutableVariableClassName);
87+
string mutableVariableClassPath = GenerateClassPath(mutableVariableClassName);
88+
string mutableVariableReferenceClassPath = GenerateClassPath(mutableVariableReferenceClassName);
89+
string variableEditorClassPath = GenerateClassPath(variableEditorClassName);
90+
91+
if (CheckFilesGeneration(new string[] {immutableVariableClassPath, mutableVariableClassPath,
92+
mutableVariableReferenceClassPath, variableEditorClassPath}))
93+
{
94+
GenerateImmutableVariable(immutableVariableClassName, immutableVariableClassPath);
95+
GenerateMutableVariable(mutableVariableClassName, mutableVariableClassPath);
96+
GenerateMutableVariableReference(mutableVariableReferenceClassName, GenerateVariableNamesPrefix(), mutableVariableClassName, mutableVariableReferenceClassPath);
97+
GenerateVariableEditor(variableEditorClassName, mutableVariableClassName, variableEditorClassPath);
98+
}
99+
else
100+
{
101+
Debug.LogError("Could not generate files because they already exist!");
102+
}
103+
104+
AssetDatabase.Refresh();
105+
}
106+
107+
// returns true if files can be generated
108+
private bool CheckFilesGeneration(string[] classPath)
109+
{
110+
bool doesFileExist;
111+
for (int i = 0; i < classPath.Length; i++)
112+
{
113+
doesFileExist = File.Exists(classPath[i]);
114+
if (doesFileExist == true && _overrideExistingFiles == false)
115+
{
116+
return false;
117+
}
118+
}
119+
return true;
120+
}
121+
122+
private void GenerateImmutableVariable(string className, string classPath)
123+
{
124+
Debug.Log("Writing ImmutableVariable classfile...");
125+
126+
using (StreamWriter outfile = new(classPath))
127+
{
128+
outfile.WriteLine("using UnityEngine;");
129+
if (string.IsNullOrEmpty(_newTypeNamespace) == false
130+
&& _newTypeNamespace != "UnityEngine")
131+
{
132+
outfile.WriteLine("using " + _newTypeNamespace + ";");
133+
}
134+
if (_newNamespace != PACKAGE_NAMESPACE)
135+
{
136+
outfile.WriteLine("using RaCoding.Variables;");
137+
}
138+
outfile.WriteLine("");
139+
outfile.WriteLine("namespace " + _newNamespace);
140+
outfile.WriteLine("{");
141+
outfile.WriteLine(TAB + "[CreateAssetMenu(fileName = \"" + className + "\"," +
142+
" menuName = \"RaCoding/Variables/Immutable/Create new immutable "+ _newType + " variable\")]");
143+
outfile.WriteLine(TAB + "public class " + className + " : ImmutableVariable<" + _newType + "> {}");
144+
outfile.WriteLine("}");
145+
}
146+
}
147+
148+
private void GenerateMutableVariable(string className, string classPath)
149+
{
150+
Debug.Log("Writing MutableVariable classfile...");
151+
152+
using (StreamWriter outfile = new(classPath))
153+
{
154+
outfile.WriteLine("using UnityEngine;");
155+
if (string.IsNullOrEmpty(_newTypeNamespace) == false
156+
&& _newTypeNamespace != "UnityEngine")
157+
{
158+
outfile.WriteLine("using " + _newTypeNamespace + ";");
159+
}
160+
if (_newNamespace != PACKAGE_NAMESPACE)
161+
{
162+
outfile.WriteLine("using RaCoding.Variables;");
163+
}
164+
outfile.WriteLine("");
165+
outfile.WriteLine("namespace " + _newNamespace);
166+
outfile.WriteLine("{");
167+
outfile.WriteLine(TAB + "[CreateAssetMenu(fileName = \"" + className + "\"," +
168+
" menuName = \"RaCoding/Variables/Mutable/Create new mutable " + _newType + " variable\")]");
169+
outfile.WriteLine(TAB + "public class " + className + " : MutableVariable<" + _newType + "> {}");
170+
outfile.WriteLine("}");
171+
}
172+
}
173+
174+
private void GenerateMutableVariableReference(string className, string variableNamePrefix,
175+
string mutableVariableClassName, string classPath)
176+
{
177+
Debug.Log("Writing MutableVariableReference classfile...");
178+
179+
using (StreamWriter outfile = new(classPath))
180+
{
181+
outfile.WriteLine("using UnityEngine;");
182+
if (string.IsNullOrEmpty(_newTypeNamespace) == false
183+
&& _newTypeNamespace != "UnityEngine")
184+
{
185+
outfile.WriteLine("using " + _newTypeNamespace + ";");
186+
}
187+
if (_newNamespace != PACKAGE_NAMESPACE)
188+
{
189+
outfile.WriteLine("using RaCoding.Variables;");
190+
}
191+
outfile.WriteLine("");
192+
outfile.WriteLine("namespace " + _newNamespace);
193+
outfile.WriteLine("{");
194+
outfile.WriteLine(TAB + "[System.Serializable]");
195+
outfile.WriteLine(TAB + "public class " + className + " : MutableVariableReference<" + _newType + ">");
196+
outfile.WriteLine(TAB + "{");
197+
outfile.WriteLine(TAB + TAB + "[SerializeField] private " + mutableVariableClassName + " " + variableNamePrefix + "MutableVariable;");
198+
outfile.WriteLine("");
199+
outfile.WriteLine(TAB + TAB + "protected override MutableVariable<" + _newType + "> Reference => " + variableNamePrefix + "MutableVariable; ");
200+
outfile.WriteLine(TAB + "}");
201+
outfile.WriteLine("}");
202+
}
203+
}
204+
private void GenerateVariableEditor(string className, string mutableVariableClassName,
205+
string classPath)
206+
{
207+
Debug.Log("Writing VariableEditor classfile...");
208+
209+
using (StreamWriter outfile = new(classPath))
210+
{
211+
outfile.WriteLine("using UnityEditor;");
212+
outfile.WriteLine("using UnityEngine;");
213+
if (string.IsNullOrEmpty(_newTypeNamespace) == false
214+
&& _newTypeNamespace != "UnityEngine")
215+
{
216+
outfile.WriteLine("using " + _newTypeNamespace + ";");
217+
}
218+
if (_newNamespace != PACKAGE_NAMESPACE)
219+
{
220+
outfile.WriteLine("using RaCoding.Variables;");
221+
}
222+
outfile.WriteLine("");
223+
outfile.WriteLine("namespace " + _newNamespace);
224+
outfile.WriteLine("{");
225+
outfile.WriteLine(TAB + "[CustomEditor(typeof("+ mutableVariableClassName + "), editorForChildClasses: true)]");
226+
outfile.WriteLine(TAB + "public class " + className + " : VariableEditor<" + _newType + ">");
227+
outfile.WriteLine(TAB + "{");
228+
outfile.WriteLine(TAB + TAB + "protected override void AssignResetValue()");
229+
outfile.WriteLine(TAB + TAB + "{");
230+
outfile.WriteLine(TAB + TAB + TAB + "resetValue.objectReferenceValue = value.objectReferenceValue;");
231+
outfile.WriteLine(TAB + TAB + "}");
232+
outfile.WriteLine(TAB + "}");
233+
outfile.WriteLine("}");
234+
}
235+
}
236+
}
237+
}

Packages/SOVariables/Editor/Window/VariableWindow.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)