static void Main(string[] args) { var stm = File.OpenRead(@"D:\tex.dds.phyre"); var header = Phyre.Archive.ReadHeader(stm); var objectsTable = Phyre.Archive.ReadObjectsTable(stm); objectsTable.Unpack(); ClassPrinter printer = new ClassPrinter(); foreach (var c in objectsTable.Classes) { printer.Print(c); } var instanceListHeaders = new List <Archive.PInstanceListHeader>(); var instances = ((Archive.DX11Header)header).baseHeader.instanceListCount; for (uint i = 0; i < instances; ++i) { var h = Phyre.Archive.ReadInstanceListHeader(stm); instanceListHeaders.Add(h); Console.WriteLine($"Objects count: {h.m_count} Type: {objectsTable.Classes[h.m_classID - 1]} {h.m_objectsSize}"); } var mems = objectsTable.classDescriptors.Sum(v => v.classDataMemberCount); Console.WriteLine(); }
private void OnWizardCreate() { if (string.IsNullOrEmpty(eventClassType)) { Debug.LogError("Cannot create event class with empty name."); return; } string eventClassName = $"{eventClassType}Event"; string eventListenerClassName = $"{eventClassName}Listener"; string eventInspectorClassName = $"{eventClassName}Inspector"; ClassPrinter gameEvent = new ClassPrinter() .Lines( "using System.Collections.Generic;", "using UnityEngine;") .EmptyLine(); if (!string.IsNullOrEmpty(eventNamespace)) { gameEvent .Line($"namespace {eventNamespace} {{") .EmptyLine() .Indent(); } gameEvent .Lines( $"[CreateAssetMenu(menuName = \"Game Events/{eventClassType}\", fileName = \"{eventClassName}.asset\")]", $"public class {eventClassName} : ScriptableObject {{") .Indent() .Line($"private readonly List<{eventListenerClassName}> eventListeners = new List<{eventListenerClassName}>();") .EmptyLine() .Line($"public void Invoke({payloadClassType} payload) {{") .Indent() .Line("for (int i = eventListeners.Count -1; i >= 0; i--) {") .Indent() .Line("eventListeners[i].OnEventInvoked(payload);") .Outdent() .Line("}") .Outdent() .Line("}") .EmptyLine() .Line($"public void AddListener({eventListenerClassName} listener) {{") .Indent() .Line("if (!eventListeners.Contains(listener)) {") .Indent() .Line("eventListeners.Add(listener);") .Outdent() .Line("}") .Outdent() .Line("}") .EmptyLine() .Line($"public void RemoveListener({eventListenerClassName} listener) {{") .Indent() .Line("eventListeners.Remove(listener);") .Outdent() .Line("}") .Outdent() .Line("}"); if (!string.IsNullOrEmpty(eventNamespace)) { gameEvent .Outdent() .Line("}"); } ClassPrinter gameEventListener = new ClassPrinter() .Lines( "using System;", "using UnityEngine;", "using UnityEngine.Events;") .EmptyLine(); if (!string.IsNullOrEmpty(eventNamespace)) { gameEventListener .Line($"namespace {eventNamespace} {{") .EmptyLine() .Indent(); } gameEventListener .Lines( "[Serializable]", $"public class Unity{eventClassName} : UnityEvent<{payloadClassType}> {{}}") .EmptyLine() .Lines( $"[AddComponentMenu(\"Game Events/{eventListenerClassName}\")]", $"public class {eventListenerClassName} : MonoBehaviour {{") .EmptyLine() .Indent() .Lines( $"public {eventClassName} evt;", $"public Unity{eventClassName} response;") .EmptyLine() .Line("private void OnEnable() {") .Indent() .Line("evt.AddListener(this);") .Outdent() .Line("}") .EmptyLine() .Line("private void OnDisable() {") .Indent() .Line("evt.RemoveListener(this);") .Outdent() .Line("}") .EmptyLine() .Line($"public void OnEventInvoked({payloadClassType} payload) {{") .Indent() .Line("response.Invoke(payload);") .Outdent() .Line("}") .Outdent() .Line("}"); if (!string.IsNullOrEmpty(eventNamespace)) { gameEventListener .Outdent() .Line("}"); } ClassPrinter inspector = new ClassPrinter() .Lines( "using UnityEditor;", "using UnityEngine;") .EmptyLine(); if (!string.IsNullOrEmpty(eventNamespace)) { inspector .Line($"namespace {eventNamespace} {{") .Indent(); } inspector .Lines( $"[CustomEditor(typeof({eventClassName}))]", $"public class {eventInspectorClassName} : Editor {{") .EmptyLine() .Indent() .Lines( $"private {payloadClassType} payload;", $"private EventBindings<{eventListenerClassName}, {eventClassName}> bindings;") .EmptyLine() .Line("private void OnEnable() {") .Indent() .Line($"bindings = new EventBindings<{eventListenerClassName}, {eventClassName}>(target as {eventClassName});") .Outdent() .Line("}") .Line("public override void OnInspectorGUI() {") .Indent() .Lines( "base.OnInspectorGUI();", "GUI.enabled = Application.isPlaying;", GetInspectorField(payloadClassType), "if (GUILayout.Button(\"Invoke\")) {") .Indent() .Line($"(target as {eventClassName})?.Invoke(payload);") .Outdent() .Line("}") .Line("bindings.OnInspectorGUI();") .Outdent() .Line("}") .Outdent() .Line("}"); if (!string.IsNullOrEmpty(eventNamespace)) { inspector .Outdent() .Line("}"); } if (!Directory.Exists(GetSelectedFolderFull() + "/Editor")) { AssetDatabase.CreateFolder(GetSelectedFolderRel(), "Editor"); } File.WriteAllText(GetSelectedFolderRel() + $"/{eventClassName}.cs", gameEvent.ToString()); File.WriteAllText(GetSelectedFolderRel() + $"/{eventListenerClassName}.cs", gameEventListener.ToString()); File.WriteAllText(GetSelectedFolderRel() + $"/Editor/{eventInspectorClassName}.cs", inspector.ToString()); AssetDatabase.Refresh(); }