public void CreateNewBehavior([NotNull] Type behaviorType, Vector2 position)
        {
            Undo.SetCurrentGroupName("Behavior Tree changed");
            int undoGroup = Undo.GetCurrentGroup();

            Undo.RegisterCompleteObjectUndo(m_serializedBehaviorTree, "Changed Behavior Tree");

            var behavior = (SerializedBehavior_Base)ScriptableObject.CreateInstance(behaviorType);

            behavior.name = behaviorType.Name;
            AssetDatabase.AddObjectToAsset(behavior, m_serializedBehaviorTree);
            var node = new SerializedBehaviorTreeNode(behavior, this);

            AddElement(node);
            m_nodes.Add(node);

            SerializedProperty serializedDatas = m_serializedBehaviorTreeObject
                                                 .FindProperty(SerializedBehaviorDataPropertyName);
            int index = serializedDatas.arraySize++;
            SerializedProperty serializedData = serializedDatas.GetArrayElementAtIndex(index);

            serializedData.FindPropertyRelative(SerializedBehaviorPropertyName).objectReferenceValue = behavior;
            position -= m_editorWindow.position.position;
            position  = contentViewContainer.WorldToLocal(position);
            serializedData.FindPropertyRelative(NodeGraphInfoPropertyName)
            .FindPropertyRelative(PositionPropertyName).vector2Value = position;
            node.SetPosition(new Rect(position, s_defaultSize));

            node.RefreshExpandedState();
            node.RefreshPorts();

            m_serializedBehaviorTreeObject.ApplyModifiedProperties();

            Undo.CollapseUndoOperations(undoGroup);
        }
        private void RefreshNodes()
        {
            for (int i = 0, count = m_nodes.Count; i < count; ++i)
            {
                SerializedBehaviorTreeNode node = m_nodes[i];
                node.RefreshExpandedState();
                node.RefreshPorts();
            }

            m_rootNode.RefreshExpandedState();
            m_rootNode.RefreshPorts();
        }