Exemple #1
0
        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();
    }