private void GeneratePorts(DrawNodeViewGraph drawNode)
    {
        var members = drawNode.InnerNode.GetType().GetMembers();

        foreach (var m in members)
        {
            var atrs = m.GetCustomAttributes();

            foreach (var a in atrs)
            {
                if (a is ConnectionAttribute connection)
                {
                    switch (connection.ConnectionPointType)
                    {
                    case ConnectionPointType.In:
                        var port = GeneratePort(drawNode, Direction.Input, connection.NameOfField, Port.Capacity.Multi);
                        drawNode.ConnectedPorts.Add(port, (m, Direction.Input));
                        break;

                    case ConnectionPointType.Out:
                    case ConnectionPointType.Link:
                        var port2 = GeneratePort(drawNode, Direction.Output, connection.NameOfField);
                        drawNode.ConnectedPorts.Add(port2, (m, Direction.Output));
                        break;
                    }
                }
            }
        }
    }
    private Port GeneratePort(DrawNodeViewGraph node, Direction direction, string portName, Port.Capacity capacity = Port.Capacity.Single)
    {
        var port = node.InstantiatePort(Orientation.Horizontal, direction, capacity, typeof(BaseDecisionNode));

        port.portName = portName;
        node.outputContainer.Add(port);

        node.RefreshExpandedState();
        node.RefreshPorts();
        return(port);
    }
    private DrawNodeViewGraph AddNodeToDecision(BaseDecisionNode node)
    {
        var drawNode = new DrawNodeViewGraph();

        drawNode.title     = node.TitleOfNode;
        drawNode.GUID      = Guid.NewGuid().ToString();
        drawNode.InnerNode = node;
        drawNode.styleSheets.Add(Resources.Load <StyleSheet>("Node"));

        drawNode.SetPosition(new Rect(node.coords, new Vector2(150, 50)));
        GeneratePorts(drawNode);
        GenerateCustomField(drawNode);

        AddElement(drawNode);
        drawNodes.Add(drawNode);
        return(drawNode);
    }
    private DrawNodeViewGraph EntryPoint(Strategy strategy)
    {
        var node      = new DrawNodeViewGraph();
        var startNode = strategy.nodes.FirstOrDefault(x => x is StartDecision);

        if (startNode == null)
        {
            OnClickAddNode(Vector2.zero, typeof(StartDecision));
            startNode = strategy.nodes.FirstOrDefault(x => x is StartDecision);
        }

        node.title     = startNode.TitleOfNode;
        node.GUID      = Guid.NewGuid().ToString();
        node.InnerNode = startNode;

        node.SetPosition(new Rect(startNode.coords, new Vector2(150, 50)));
        GeneratePorts(node);
        drawNodes.Add(node);
        return(node);
    }
    private void GenerateCustomField(DrawNodeViewGraph drawNode)
    {
        var so = new SerializedObject(drawNode.InnerNode);

        if (drawNode.InnerNode != null)
        {
            foreach (var m in drawNode.InnerNode.GetType().GetMembers())
            {
                foreach (var a in m.GetCustomAttributes())
                {
                    if (a is SerializeField)
                    {
                        var field = m as FieldInfo;

                        if (field.FieldType == typeof(int))
                        {
                            var intField = new IntegerField(m.Name + ":");
                            intField.value = (int)(m as FieldInfo).GetValue(drawNode.InnerNode);

                            intField.RegisterValueChangedCallback((evt) => IntChangeReact(evt, m as FieldInfo, drawNode.InnerNode));
                            drawNode.contentContainer.Add(intField);
                        }

                        if (field.FieldType == typeof(Strategy))
                        {
                            var objectField = new ObjectField(m.Name + ":")
                            {
                                objectType = typeof(Strategy)
                            };
                            objectField.value = (m as FieldInfo).GetValue(drawNode.InnerNode) as Strategy;

                            objectField.RegisterValueChangedCallback((evt) => ChangeStrategy(evt, m as FieldInfo, drawNode.InnerNode));

                            drawNode.contentContainer.Add(objectField);
                        }

                        if (field.FieldType.BaseType == typeof(Enum))
                        {
                            var enumField = new EnumField(m.Name + ":");
                            var property  = so.FindProperty(m.Name);
                            enumField.value = (Enum)Enum.ToObject(field.FieldType, field.GetValue(drawNode.InnerNode));
                            enumField.Init((Enum)Enum.ToObject(field.FieldType, field.GetValue(drawNode.InnerNode)));

                            enumField.RegisterValueChangedCallback((evt) => EnumChangeReact(evt, field, drawNode.InnerNode));
                            drawNode.contentContainer.Add(enumField);
                        }

                        if (field.FieldType == typeof(float))
                        {
                            var floatField = new FloatField(m.Name + ":");
                            floatField.value = (float)field.GetValue(drawNode.InnerNode);
                            floatField.RegisterValueChangedCallback((evt) => FloatFieldReact(evt, field, drawNode.InnerNode));
                            drawNode.contentContainer.Add(floatField);
                        }

                        if (field.FieldType == typeof(bool))
                        {
                            var boolField = new Toggle(m.Name + ":");
                            boolField.value = (bool)field.GetValue(drawNode.InnerNode);
                            boolField.RegisterValueChangedCallback((evt) => BoolFieldReact(evt, field, drawNode.InnerNode));
                            drawNode.contentContainer.Add(boolField);
                        }

                        drawNode.RefreshPorts();
                        drawNode.RefreshExpandedState();
                    }
                }
            }
        }
    }