//a special object field for the BBParameter class to let user choose either a real value or enter a string to read data from a Blackboard
        public static BBParameter BBParameterField(string prefix, BBParameter bbParam, bool blackboardOnly = false, MemberInfo member = null)
        {
            if (bbParam == null){
                EditorGUILayout.LabelField(prefix, "Non Set Variable");
                return null;
            }

            GUILayout.BeginVertical();
            GUILayout.BeginHorizontal();

            //override if we have a memeber info
            if (member != null){
                blackboardOnly = member.RTGetAttribute<BlackboardOnlyAttribute>(false) != null;
            }

            //Direct assignement
            if (!blackboardOnly && !bbParam.useBlackboard){

                GUILayout.BeginVertical();
                bbParam.value = GenericField(prefix, bbParam.value, bbParam.varType, member);
                GUILayout.EndVertical();

            //Dropdown variable selection
            } else {

                GUI.color = new Color(0.9f,0.9f,1f,1f);
                var varNames = new List<string>();

                //Local
                if (bbParam.bb != null){
                    varNames.AddRange(bbParam.bb.GetVariableNames(bbParam.varType));
                }

                //Seperator
                varNames.Add("/");

                //Globals
                foreach (var globalBB in GlobalBlackboard.allGlobals) {
                    var globalVars = globalBB.GetVariableNames(bbParam.varType);
                    if (globalVars.Length == 0){
                        varNames.Add(globalBB.name + "/");
                    }
                    for (var i = 0; i < globalVars.Length; i++){
                        globalVars[i] = globalBB.name + "/" + globalVars[i];
                    }
                    varNames.AddRange( globalVars );
                }

                //Dynamic
                varNames.Add("(DynamicVar)");

                //New
                if (bbParam.bb != null){
                    varNames.Add("(Create New)");
                }

                var isDynamic = !string.IsNullOrEmpty(bbParam.name) && !varNames.Contains(bbParam.name);
                if (!isDynamic){

                    bbParam.name = StringPopup(prefix, bbParam.name, varNames, false, true);

                    if (bbParam.name == "(DynamicVar)"){
                        bbParam.name = "_";
                    }

                    if (bbParam.bb != null && bbParam.name == "(Create New)"){
                        if (bbParam.bb.AddVariable(prefix, bbParam.varType) != null){
                            bbParam.name = prefix;
                        } else {
                            bbParam.name = null;
                        }
                    }

                } else {

                    bbParam.name = EditorGUILayout.TextField(prefix + " (" + bbParam.varType.FriendlyName() + ")", bbParam.name);
                }
            }

            GUI.color = Color.white;
            GUI.backgroundColor = Color.white;

            if (!blackboardOnly){
                bbParam.useBlackboard = EditorGUILayout.Toggle(bbParam.useBlackboard, EditorStyles.radioButton, GUILayout.Width(18));
            }

            GUILayout.EndHorizontal();

            if (bbParam.isNone || bbParam.bb == null){
                GUI.backgroundColor = new Color(0.8f,0.8f,1f,0.5f);
                GUI.color = new Color(1f,1f,1f,0.5f);
                GUILayout.BeginVertical("textfield");

                var info = string.Empty;
                if (bbParam.bb == null){
                    info = "<i>No current Blackboard reference</i>";
                }
                else if (bbParam.isNone){
                    info = "Select '" + bbParam.varType.FriendlyName() + "' Assignable Blackboard Variable";
                }

                GUILayout.Label(info);

                GUILayout.EndVertical();
                GUILayout.Space(2);
            }

            GUILayout.EndVertical();
            GUI.backgroundColor = Color.white;
            GUI.color = Color.white;
            return bbParam;
        }
        //a special object field for the BBParameter class to let user choose either a real value or enter a string to read data from a Blackboard
        public static BBParameter BBParameterField(string prefix, BBParameter bbParam, bool blackboardOnly = false, MemberInfo member = null)
        {
            if (bbParam == null){
                EditorGUILayout.LabelField(prefix, "Non Set Variable");
                return null;
            }

            GUILayout.BeginVertical();
            GUILayout.BeginHorizontal();

            //override if we have a memeber info
            if (member != null){
                blackboardOnly = member.RTGetAttribute<BlackboardOnlyAttribute>(false) != null;
            }

            //Direct assignement
            if (!blackboardOnly && !bbParam.useBlackboard){

                bbParam.value = GenericField(prefix, bbParam.value, bbParam.varType, member);

            //Dropdown variable selection
            } else {

                GUI.color = new Color(0.9f,0.9f,1f,1f);
                var varNames = new List<string>();

                //Local
                if (bbParam.bb != null)
                    varNames.AddRange(bbParam.bb.GetVariableNames(bbParam.varType));

                //Globals
                foreach (var globalBB in GlobalBlackboard.allGlobals.Where(globalBB => globalBB != bbParam.bb)) {
                    varNames.Add(globalBB.name + "/");
                    var globalVars = globalBB.GetVariableNames(bbParam.varType);
                    for (var i = 0; i < globalVars.Length; i++)
                        globalVars[i] = globalBB.name + "/" + globalVars[i];
                    varNames.AddRange( globalVars );
                }

                //Dynamic
                varNames.Add("(DynamicVar)");

                var isDynamic = !string.IsNullOrEmpty(bbParam.name) && !varNames.Contains(bbParam.name);
                if (!isDynamic){

                    bbParam.name = StringPopup(prefix, bbParam.name, varNames, false, true);
                    if (bbParam.name == "(DynamicVar)"){
                        bbParam.name = "_";
                    }

                } else {

                    bbParam.name = EditorGUILayout.TextField(prefix + " (" + bbParam.varType.FriendlyName() + ")", bbParam.name);
                }
            }

            GUI.color = Color.white;
            GUI.backgroundColor = Color.white;

            if (!blackboardOnly)
                bbParam.useBlackboard = EditorGUILayout.Toggle(bbParam.useBlackboard, EditorStyles.radioButton, GUILayout.Width(18));

            GUILayout.EndHorizontal();

            if (bbParam.useBlackboard && string.IsNullOrEmpty(bbParam.name)){

                GUI.backgroundColor = new Color(0.8f,0.8f,1f,0.5f);
                GUI.color = new Color(1f,1f,1f,0.5f);
                GUILayout.BeginVertical("textfield");

                GUILayout.BeginHorizontal();

                if ( bbParam.bb != null && bbParam.varType != typeof(object) ){
                    if (GUILayout.Button("<b>+</b>", (GUIStyle)"label", GUILayout.Width(20) )){
                        if (bbParam.bb.AddVariable(prefix, bbParam.varType) != null)
                            bbParam.name = prefix;
                    }
                    EditorGUIUtility.AddCursorRect(GUILayoutUtility.GetLastRect(), MouseCursor.ArrowPlus);
                }

                if (bbParam.bb != null){
                    GUILayout.Label("Select a '" + bbParam.varType.FriendlyName() + "' Blackboard Variable");
                } else {
                    GUILayout.Label("<i>No current Blackboard reference</i>");
                }

                GUILayout.EndHorizontal();
                GUILayout.EndVertical();
                GUILayout.Space(2);
            }

            GUILayout.EndVertical();
            GUI.backgroundColor = Color.white;
            GUI.color = Color.white;
            return bbParam;
        }