Advertisement
Guest User

Untitled

a guest
May 26th, 2015
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.24 KB | None | 0 0
  1. using UnityEditor;
  2. using System.CodeDom;
  3. using System.IO;
  4. using System.CodeDom.Compiler;
  5.  
  6. public class CreateEditorWindowSubclassMenuItem {
  7. [MenuItem("Assets/Create/File/EditorWindow Subclass...", false, 12)]
  8. private static void CreateEditorWindowClass() {
  9. var filePath = EditorUtility.SaveFilePanelInProject("Save file", "EditorWindowSubclass", "cs", "Enter class name");
  10. if (!string.IsNullOrEmpty(filePath)) {
  11. using (var streamWriter = new StreamWriter(File.Create(filePath))) {
  12. using (var tw = new IndentedTextWriter(streamWriter, " ")) {
  13. var fileName = Path.GetFileNameWithoutExtension(filePath);
  14. var unit = BuildEditorWindowSubclassUnit(fileName);
  15. var provider = CodeDomProvider.CreateProvider("CSharp");
  16. provider.GenerateCodeFromCompileUnit(unit, tw, new CodeGeneratorOptions());
  17. }
  18. }
  19. }
  20. AssetDatabase.Refresh();
  21. }
  22.  
  23. private static CodeCompileUnit BuildEditorWindowSubclassUnit(string className) {
  24. var unit = new CodeCompileUnit();
  25.  
  26. var @namespace = new CodeNamespace();
  27. unit.Namespaces.Add(@namespace);
  28.  
  29. @namespace.Imports.Add(new CodeNamespaceImport("UnityEngine"));
  30. @namespace.Imports.Add(new CodeNamespaceImport("UnityEditor"));
  31. @namespace.Imports.Add(new CodeNamespaceImport("System.Collections"));
  32.  
  33. var declaration = new CodeTypeDeclaration { Name = className };
  34. @namespace.Types.Add(declaration);
  35.  
  36. declaration.BaseTypes.Add(new CodeTypeReference { BaseType = "EditorWindow" });
  37.  
  38. var methodAwake = new CodeMemberMethod {
  39. Name = "Init",
  40. Attributes = MemberAttributes.Static
  41. };
  42. methodAwake.Statements.Add(new CodeVariableDeclarationStatement(className, "window"));
  43. methodAwake.Statements.Add(
  44. new CodeAssignStatement(
  45. new CodeVariableReferenceExpression("window"),
  46. new CodeMethodInvokeExpression(
  47. new CodeMethodReferenceExpression(
  48. null,
  49. "CreateInstance",
  50. new CodeTypeReference(className)
  51. )
  52. )
  53. )
  54. );
  55. methodAwake.Statements.Add(
  56. new CodeExpressionStatement(
  57. new CodeMethodInvokeExpression(
  58. new CodeMethodReferenceExpression(
  59. new CodeVariableReferenceExpression("window"),
  60. "Show"
  61. )
  62. )
  63. )
  64. );
  65.  
  66. declaration.Members.Add(methodAwake);
  67. declaration.Members.Add(new CodeMemberMethod { Name = "OnGUI" });
  68.  
  69. return unit;
  70. }
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement