public bool DrawLayout() { var module = m_MainModule.Dereference(m_Registry); var system = System.Dereference(m_Registry); if (null == system || system.IsRuntimeIncluded) { return(false); } m_AvailableSystems.Clear(); m_AvailableSystems.AddRange(module.EnumerateDependencies().SystemRefs()); m_AvailableComponentTypes.Clear(); m_AvailableComponentTypes.AddRange(module.EnumerateDependencies().ComponentTypeRefs().Select(r => (UTinyType.Reference)r.Dereference(m_Registry))); EditorGUI.BeginChangeCheck(); using (var scroll = new GUILayout.ScrollViewScope(m_Scroll, GUILayout.ExpandWidth(true))) { m_Scroll = scroll.scrollPosition; EditorGUI.BeginChangeCheck(); system.Name = EditorGUILayout.DelayedTextField("Name", system.Name); if (EditorGUI.EndChangeCheck()) { OnRenameEnded?.Invoke(system); } using (new EditorGUILayout.HorizontalScope()) { EditorGUILayout.PrefixLabel("Description"); system.Documentation.Summary = EditorGUILayout.TextArea(system.Documentation.Summary, GUILayout.Height(50)); } m_ExecuteAfterList.list = new List <UTinySystem.Reference>(system.ExecuteAfter); m_ExecuteAfterList.DoLayoutList(); m_ExecuteBeforeList.list = new List <UTinySystem.Reference>(system.ExecuteBefore); m_ExecuteBeforeList.DoLayoutList(); m_ComponentList.list = new List <UTinyType.Reference>(system.Components); m_ComponentList.DoLayoutList(); system.External = EditorGUILayout.Toggle(new GUIContent("External", "Use this to define systems externally"), system.External); if (system.External) { EditorGUILayout.HelpBox($"This system is assumed to be defined in any included script with the following signature", MessageType.Info); var name = UTinyBuildPipeline.GetJsTypeName(system); EditorGUILayout.SelectableLabel($"{name}.update = function(s,w) {{ /* ... */ }}", "TextArea"); } else { system.IncludeIterator = EditorGUILayout.Toggle("Include Iterator", system.IncludeIterator); EditorGUILayout.Space(); using (new GUIEnabledScope(false)) { var systemPrefix = UTinyBuildPipeline.GenerateSystemPrefix(system); if (system.IncludeIterator) { systemPrefix += UTinyBuildPipeline.GenerateSystemIteratorPrefix(system); } EditorGUILayout.TextArea(systemPrefix); } EditorGUILayout.Space(); system.TextAsset = (TextAsset)EditorGUILayout.ObjectField("Source", system.TextAsset, typeof(TextAsset), false); EditorGUILayout.Space(); if (null != system.TextAsset) { using (new GUIEnabledScope(false)) { var text = system.TextAsset.text; if (text.Length > kMaxChars) { text = text.Substring(0, kMaxChars) + "...\n\n<...etc...>"; } GUILayout.TextArea(text); } } EditorGUILayout.Space(); using (new GUIEnabledScope(false)) { var systemSuffix = UTinyBuildPipeline.GenerateSystemSuffix(system); if (system.IncludeIterator) { systemSuffix = UTinyBuildPipeline.GenerateSystemIteratorSuffix(system) + systemSuffix; } EditorGUILayout.TextArea(systemSuffix); } } } return(EditorGUI.EndChangeCheck()); }
/// <summary> /// Packages system objects to `systems.js` /// /// All systems and system dependencies are written to this file /// </summary> private static void GenerateSystems(UTinyBuildOptions options, UTinyBuildResults results) { var project = options.Project; var report = results.BuildReport.GetOrAddChild(UTinyBuildReport.CodeNode).AddChild(); var file = new FileInfo(Path.Combine(results.BinaryFolder.FullName, KSystemsFileName)); var writer = new UTinyCodeWriter(CodeStyle.JavaScript); PrependGeneratedHeader(writer, options.Project.Name); foreach (var reference in project.Module.Dereference(project.Registry).GetSystemExecutionOrder()) { var system = reference.Dereference(project.Registry); if (system == null) { Debug.LogWarning($"Can't resolve system named '{reference.Name}' with ID {reference.Id} -- ignoring, you should delete this system"); continue; } if (system.External) { continue; } // Fetch the module this system belongs to var systemModule = UTinyUtility.GetModules(system).FirstOrDefault(); if (system.IsRuntimeIncluded) { continue; } var reportSystemPos = writer.Length; UTinyJsdoc.WriteSystem(writer, system); writer.Line($"{UTinyBuildPipeline.GetJsTypeName(systemModule, system)}.update = {UTinyBuildPipeline.GenerateSystemPrefix(system)}"); writer.IncrementIndent(); if (system.IncludeIterator) { writer.Line(UTinyBuildPipeline.GenerateSystemIteratorPrefix(system)); writer.IncrementIndent(); } var text = system.TextAsset ? system.TextAsset.text : string.Empty; if (!string.IsNullOrEmpty(text)) { var lines = text.Split('\n'); foreach (var line in lines) { writer.Line(line); } } if (system.IncludeIterator) { writer.DecrementIndent(); writer.Line("});"); } writer.DecrementIndent(); writer.Line(UTinyBuildPipeline.GenerateSystemSuffix(system)); report.AddChild(AssetDatabase.GetAssetPath(system.TextAsset), Encoding.ASCII.GetBytes(writer.Substring(reportSystemPos)), system.TextAsset); } File.WriteAllText(file.FullName, writer.ToString(), Encoding.UTF8); report.Reset(file); }