private List <BehaviorParameter> GetParameterList(JsonData data) { List <BehaviorParameter> dataList = new List <BehaviorParameter>(); foreach (JsonData item in data) { BehaviorParameter parameter = new BehaviorParameter(); parameter.parameterType = int.Parse(item["parameterType"].ToString()); parameter.parameterName = item["parameterName"].ToString(); if (((IDictionary)item).Contains("CNName")) { parameter.CNName = item["CNName"].ToString(); } parameter.intValue = int.Parse(item["intValue"].ToString()); parameter.floatValue = float.Parse(item["floatValue"].ToString()); parameter.boolValue = bool.Parse(item["boolValue"].ToString()); parameter.compare = int.Parse(item["compare"].ToString()); dataList.Add(parameter); } return(dataList); }
private static ConditionGroup DrawGroup(NodeValue nodeValue, ConditionGroup group) { Rect area = GUILayoutUtility.GetRect(0f, 1, GUILayout.ExpandWidth(true)); bool select = (selectIndex == group.index); GUI.enabled = true; EditorGUILayout.BeginHorizontal("box", GUILayout.ExpandWidth(true)); { if (selectIndex < 0 || nodeId < 0 || nodeId != nodeValue.id) { nodeId = nodeValue.id; selectIndex = group.index; } Rect rect = new Rect(area.x, area.y, area.width, 30); GUI.backgroundColor = select ? new Color(0, 1, 0, 1) : Color.white;// GUI.Box(rect, string.Empty); GUI.backgroundColor = Color.white; if (GUILayout.Button("选择", GUILayout.Width(50))) { selectIndex = group.index; } for (int i = group.parameterList.Count - 1; i >= 0; --i) { string parameter = group.parameterList[i]; BehaviorParameter behaviorParameter = nodeValue.parameterList.Find(a => (a.parameterName.CompareTo(parameter) == 0)); if (null == behaviorParameter) { group.parameterList.RemoveAt(i); } } GUI.enabled = select && !BehaviorManager.Instance.CurrentOpenConfigSubTree(); for (int i = 0; i < nodeValue.parameterList.Count; ++i) { BehaviorParameter parameter = nodeValue.parameterList[i]; string name = group.parameterList.Find(a => (a.CompareTo(parameter.parameterName) == 0)); EditorGUILayout.BeginHorizontal(); { EditorGUILayout.LabelField(i.ToString(), GUILayout.Width(10)); bool value = !string.IsNullOrEmpty(name); bool oldValue = value; value = EditorGUILayout.Toggle(value, GUILayout.Width(10)); if (value) { if (!oldValue) { group.parameterList.Add(parameter.parameterName); break; } } else { if (oldValue) { group.parameterList.Remove(parameter.parameterName); } } } EditorGUILayout.EndHorizontal(); GUILayout.Space(10); } GUI.enabled = true; GUI.enabled = !BehaviorManager.Instance.CurrentOpenConfigSubTree(); if (GUILayout.Button("删除")) { if (null != BehaviorManager.behaviorAddDelConditionGroup) { BehaviorManager.behaviorAddDelConditionGroup(nodeValue.id, group.index, false); } } GUI.enabled = true; } EditorGUILayout.EndHorizontal(); if (select) { return(group); } return(null); }
public BehaviorCompare CompareBool(BehaviorParameter parameter) { BehaviorCompare behaviorCompare = (this.boolValue == parameter.boolValue) ? BehaviorCompare.EQUALS : BehaviorCompare.NOT_EQUAL; return(behaviorCompare); }
public void AddParameter(BehaviorParameter parameter) { parameterList.Add(parameter); }
private void DrawNode(NodeValue nodeValue, string title) { if (nodeValue.NodeType != (int)NODE_TYPE.CONDITION && nodeValue.NodeType != (int)NODE_TYPE.ACTION) { return; } EditorGUILayout.BeginVertical("box", GUILayout.ExpandWidth(true)); { EditorGUILayout.LabelField(title); int height = (nodeValue.parameterList.Count * 70) + 20; height = height <= 300 ? height : 300; scrollPos = EditorGUILayout.BeginScrollView(scrollPos, GUILayout.Height(height)); { GUI.backgroundColor = new Color(0.85f, 0.85f, 0.85f, 1f); for (int i = 0; i < nodeValue.parameterList.Count; ++i) { BehaviorParameter behaviorParameter = nodeValue.parameterList[i]; Action DelCallBack = () => { if (null != BehaviorManager.behaviorNodeParameter) { BehaviorManager.behaviorNodeParameter(nodeValue.id, behaviorParameter, false); } }; EditorGUILayout.BeginVertical("box"); { string parameterName = behaviorParameter.parameterName; BehaviorParameter tempParameter = behaviorParameter.Clone(); tempParameter = DrawParameter.Draw(behaviorParameter, DrawParameterType.NODE_PARAMETER, DelCallBack); if (parameterName.CompareTo(behaviorParameter.parameterName) != 0) { if (null != BehaviorManager.behaviorNodeChangeParameter) { BehaviorManager.behaviorNodeChangeParameter(nodeValue.id, parameterName, behaviorParameter.parameterName); } } else { tempParameter.Clone(behaviorParameter); } } EditorGUILayout.EndVertical(); } GUI.backgroundColor = Color.white; } EditorGUILayout.EndScrollView(); } EditorGUILayout.EndVertical(); GUILayout.Space(10); EditorGUILayout.BeginVertical("box"); { DrawAddParameter(nodeValue); } EditorGUILayout.EndVertical(); }
private static BehaviorTreeData ImportParameter(BehaviorTreeData behaviorData) { string fileName = "table_behaviortree"; TableRead.Instance.Init(); string csvPath = string.Format("{0}/StreamingAssets/CSVAssets/", Application.dataPath); // Extend.GameUtils.CombinePath(Application.dataPath, "StreamingAssets", "CSV"); //string.Format("{0}/StreamingAssets/CSV/", Application.dataPath); TableRead.Instance.ReadCustomPath(csvPath); // Debug.LogError(filePath + " " + fileName); List <int> keyList = TableRead.Instance.GetKeyList(fileName); Dictionary <string, BehaviorParameter> parameterDic = new Dictionary <string, BehaviorParameter>(); for (int i = 0; i < behaviorData.parameterList.Count; ++i) { BehaviorParameter parameter = behaviorData.parameterList[i]; parameterDic[parameter.parameterName] = parameter; } for (int i = 0; i < keyList.Count; ++i) { int key = keyList[i]; string EnName = TableRead.Instance.GetData(fileName, key, "EnName"); string cnName = TableRead.Instance.GetData(fileName, key, "CnName"); string typeName = TableRead.Instance.GetData(fileName, key, "Type"); int type = int.Parse(typeName); string floatContent = TableRead.Instance.GetData(fileName, key, "FloatValue"); float floatValue = float.Parse(floatContent); string intContent = TableRead.Instance.GetData(fileName, key, "IntValue"); int intValue = int.Parse(intContent); string longContent = TableRead.Instance.GetData(fileName, key, "LongValue"); long longValue = long.Parse(intContent); string boolContent = TableRead.Instance.GetData(fileName, key, "BoolValue"); bool boolValue = (int.Parse(boolContent) == 1); string stringValue = TableRead.Instance.GetData(fileName, key, "StringValue"); BehaviorParameter parameter = new BehaviorParameter(); parameter.parameterName = EnName; parameter.CNName = cnName; parameter.compare = (int)BehaviorCompare.EQUALS; parameter.parameterType = type; parameter.floatValue = floatValue; parameter.intValue = intValue; parameter.longValue = longValue; parameter.boolValue = boolValue; parameter.stringValue = stringValue; if (parameterDic.ContainsKey(EnName)) { if (parameterDic[EnName].parameterType != type) { Debug.LogError("已经存在参数:" + EnName + " type:" + (BehaviorParameterType)parameterDic[EnName].parameterType + " newType:" + (BehaviorParameterType)type); } parameterDic[EnName].CloneFrom(parameter); } else { behaviorData.parameterList.Add(parameter); } } return(behaviorData); }
public static BehaviorParameter Draw(BehaviorParameter behaviorParameter, DrawParameterType drawParameterType, Action DelCallBack) { if (null == behaviorParameter) { return(behaviorParameter); } { string[] parameterNameArr = EnumNames.GetEnumNames <BehaviorParameterType>(); int index = EnumNames.GetEnumIndex <BehaviorParameterType>((BehaviorParameterType)(behaviorParameter.parameterType)); BehaviorParameterType behaviorParameterType = EnumNames.GetEnum <BehaviorParameterType>(index); bool enableChangeType = (drawParameterType == DrawParameterType.GLOBAL_PARAMETER_ADD); GUI.enabled = enableChangeType; { index = EditorGUILayout.Popup(index, parameterNameArr); behaviorParameter.parameterType = (int)EnumNames.GetEnum <BehaviorParameterType>(index); GUILayout.Space(5); } GUI.enabled = true; } EditorGUILayout.BeginHorizontal(); { if (drawParameterType == DrawParameterType.NODE_PARAMETER) { List <BehaviorParameter> parameterList = BehaviorManager.Instance.GlobalParameter.parameterList; string[] parameterArr = new string[parameterList.Count]; int index = -1; for (int i = 0; i < parameterList.Count; ++i) { BehaviorParameter p = parameterList[i]; parameterArr[i] = p.parameterName; if (behaviorParameter.parameterName.CompareTo(p.parameterName) == 0) { index = i; } } int result = EditorGUILayout.Popup(index, parameterArr, GUILayout.ExpandWidth(true)); if (result != index) { behaviorParameter.parameterName = parameterArr[result]; } } else if (drawParameterType == DrawParameterType.GLOBAL_PARAMETER || (drawParameterType == DrawParameterType.GLOBAL_PARAMETER_ADD) || drawParameterType == DrawParameterType.RUNTIME_PARAMETER) { GUI.enabled = (drawParameterType == DrawParameterType.GLOBAL_PARAMETER_ADD); behaviorParameter.parameterName = EditorGUILayout.TextField(behaviorParameter.parameterName); GUI.enabled = true; } BehaviorCompare[] compareEnumArr = new BehaviorCompare[] { }; if (behaviorParameter.parameterType == (int)BehaviorParameterType.Int) { compareEnumArr = new BehaviorCompare[] { BehaviorCompare.GREATER, BehaviorCompare.GREATER_EQUALS, BehaviorCompare.LESS_EQUAL, BehaviorCompare.LESS, BehaviorCompare.EQUALS, BehaviorCompare.NOT_EQUAL }; } if (behaviorParameter.parameterType == (int)BehaviorParameterType.Float) { compareEnumArr = new BehaviorCompare[] { BehaviorCompare.GREATER, BehaviorCompare.LESS }; } if (behaviorParameter.parameterType == (int)BehaviorParameterType.Bool) { compareEnumArr = new BehaviorCompare[] { BehaviorCompare.EQUALS, BehaviorCompare.NOT_EQUAL }; } string[] compareArr = new string[compareEnumArr.Length]; int compare = behaviorParameter.compare; bool found = false; for (int i = 0; i < compareEnumArr.Length; ++i) { string name = System.Enum.GetName(typeof(BehaviorCompare), compareEnumArr[i]); compareArr[i] = name; if ((BehaviorCompare)behaviorParameter.compare == compareEnumArr[i]) { compare = i; found = true; } } if (!found) { compare = 0; } GUI.enabled = (drawParameterType != DrawParameterType.GLOBAL_PARAMETER) && (drawParameterType != DrawParameterType.RUNTIME_PARAMETER); { compare = EditorGUILayout.Popup(compare, compareArr, GUILayout.Width(65)); behaviorParameter.compare = (int)(compareEnumArr[compare]); } GUI.enabled = true; } EditorGUILayout.EndHorizontal(); GUILayout.Space(5); EditorGUILayout.BeginHorizontal(); { GUI.enabled = (drawParameterType != DrawParameterType.GLOBAL_PARAMETER); { if (behaviorParameter.parameterType == (int)BehaviorParameterType.Int) { behaviorParameter.intValue = EditorGUILayout.IntField("DefaultIntValue", behaviorParameter.intValue); } if (behaviorParameter.parameterType == (int)BehaviorParameterType.Float) { behaviorParameter.floatValue = EditorGUILayout.FloatField("DefaultFloatValue", behaviorParameter.floatValue); } if (behaviorParameter.parameterType == (int)BehaviorParameterType.Bool) { behaviorParameter.boolValue = EditorGUILayout.Toggle("DefaultBoolValue", behaviorParameter.boolValue); } } GUI.enabled = true; if (drawParameterType == DrawParameterType.NODE_PARAMETER || drawParameterType == DrawParameterType.GLOBAL_PARAMETER) { if (GUILayout.Button("Del")) { if (null != DelCallBack) { DelCallBack(); } } } } EditorGUILayout.EndHorizontal(); return(behaviorParameter); }
private void DrawNode(NodeValue nodeValue, string title) { if (nodeValue.NodeType != (int)NODE_TYPE.CONDITION && nodeValue.NodeType != (int)NODE_TYPE.ACTION) { return; } ConditionGroup conditionGroup = DrawConditionGroup(nodeValue); for (int i = 0; i < nodeValue.parameterList.Count; ++i) { nodeValue.parameterList[i].index = i; } GUI.enabled = !BehaviorManager.Instance.CurrentOpenConfigSubTree(); EditorGUILayout.BeginVertical("box", GUILayout.ExpandWidth(true)); { EditorGUILayout.LabelField(title); int height = (nodeValue.parameterList.Count * 58); height = height <= 300 ? height : 300; scrollPos = EditorGUILayout.BeginScrollView(scrollPos, GUILayout.Height(height)); { GUI.backgroundColor = new Color(0.85f, 0.85f, 0.85f, 1f); for (int i = 0; i < nodeValue.parameterList.Count; ++i) { BehaviorParameter behaviorParameter = nodeValue.parameterList[i]; Action DelCallBack = () => { if (null != BehaviorManager.behaviorNodeParameter) { BehaviorManager.behaviorNodeParameter(nodeValue.id, behaviorParameter, false); } }; Color color = Color.white; if (null != conditionGroup) { string name = conditionGroup.parameterList.Find(a => (a.CompareTo(behaviorParameter.parameterName) == 0)); if (!string.IsNullOrEmpty(name)) { color = colorArr[0]; } } GUI.backgroundColor = color; // new Color(0.85f, 0.85f, 0.85f, 1f); EditorGUILayout.BeginVertical("box"); { string parameterName = behaviorParameter.parameterName; BehaviorParameter tempParameter = behaviorParameter.Clone(); tempParameter = DrawParameter.Draw(behaviorParameter, DrawParameterType.NODE_PARAMETER, DelCallBack); if (parameterName.CompareTo(behaviorParameter.parameterName) != 0) { if (null != BehaviorManager.behaviorNodeChangeParameter) { BehaviorManager.behaviorNodeChangeParameter(nodeValue.id, parameterName, behaviorParameter.parameterName); } } else { behaviorParameter.CloneFrom(tempParameter); } } EditorGUILayout.EndVertical(); } GUI.backgroundColor = Color.white; } EditorGUILayout.EndScrollView(); } EditorGUILayout.EndVertical(); GUI.enabled = true; GUILayout.Space(10); EditorGUILayout.BeginVertical("box"); { DrawAddParameter(nodeValue); } EditorGUILayout.EndVertical(); }
public static BehaviorParameter Draw(BehaviorParameter behaviorParameter, DrawParameterType drawParameterType, Action DelCallBack) { if (null == behaviorParameter) { return(behaviorParameter); } EditorGUILayout.BeginHorizontal(); { string[] parameterNameArr = EnumNames.GetEnumNames <BehaviorParameterType>(); int index = EnumNames.GetEnumIndex <BehaviorParameterType>((BehaviorParameterType)(behaviorParameter.parameterType)); BehaviorParameterType behaviorParameterType = EnumNames.GetEnum <BehaviorParameterType>(index); GUI.enabled = false; if (drawParameterType == DrawParameterType.NODE_PARAMETER) { EditorGUILayout.BeginHorizontal(); { behaviorParameter.index = EditorGUILayout.IntField(behaviorParameter.index, GUILayout.Width(30)); } EditorGUILayout.EndHorizontal(); } bool enableChangeType = (drawParameterType == DrawParameterType.BEHAVIOR_PARAMETER_ADD); GUI.enabled = enableChangeType; { index = EditorGUILayout.Popup(index, parameterNameArr); behaviorParameter.parameterType = (int)EnumNames.GetEnum <BehaviorParameterType>(index); GUILayout.Space(5); } GUI.enabled = true; if (drawParameterType == DrawParameterType.NODE_PARAMETER) { GUI.enabled = false; EditorGUILayout.BeginHorizontal(); { behaviorParameter.parameterName = EditorGUILayout.TextField(behaviorParameter.parameterName); } EditorGUILayout.EndHorizontal(); GUI.enabled = true; } if (drawParameterType == DrawParameterType.NODE_PARAMETER || drawParameterType == DrawParameterType.BEHAVIOR_PARAMETER) { if (GUILayout.Button("Del")) { if (null != DelCallBack) { DelCallBack(); } } } } EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); { if (drawParameterType == DrawParameterType.NODE_PARAMETER) { List <BehaviorParameter> parameterList = BehaviorManager.Instance.BehaviorTreeData.parameterList; string[] parameterArr = new string[parameterList.Count]; int index = -1; for (int i = 0; i < parameterList.Count; ++i) { BehaviorParameter p = parameterList[i]; parameterArr[i] = p.CNName; if (behaviorParameter.parameterName.CompareTo(p.parameterName) == 0) { index = i; } } int result = EditorGUILayout.Popup(index, parameterArr, GUILayout.ExpandWidth(true)); if (result != index) { behaviorParameter.parameterName = parameterList[result].parameterName; } } else if (drawParameterType == DrawParameterType.BEHAVIOR_PARAMETER || drawParameterType == DrawParameterType.RUNTIME_PARAMETER) { GUI.enabled = (drawParameterType == DrawParameterType.BEHAVIOR_PARAMETER_ADD); behaviorParameter.parameterName = EditorGUILayout.TextField(behaviorParameter.parameterName); behaviorParameter.CNName = EditorGUILayout.TextField(behaviorParameter.CNName); GUI.enabled = true; } else if (drawParameterType == DrawParameterType.BEHAVIOR_PARAMETER_ADD) { EditorGUILayout.BeginVertical(); { string oldName = behaviorParameter.parameterName; behaviorParameter.parameterName = EditorGUILayout.TextField("英文:", behaviorParameter.parameterName); if (oldName.CompareTo(behaviorParameter.parameterName) != 0) { bool isNumOrAlp = IsNumOrAlp(behaviorParameter.parameterName); if (!isNumOrAlp) { string msg = string.Format("参数名只能包含:数字、字母、下划线,且数字不能放在第一个字符位置"); TreeNodeWindow.window.ShowNotification(msg); behaviorParameter.parameterName = oldName; } } behaviorParameter.CNName = EditorGUILayout.TextField("中文", behaviorParameter.CNName); } EditorGUILayout.EndVertical(); } BehaviorCompare[] compareEnumArr = new BehaviorCompare[] { }; if (behaviorParameter.parameterType == (int)BehaviorParameterType.Int) { compareEnumArr = new BehaviorCompare[] { BehaviorCompare.GREATER, BehaviorCompare.GREATER_EQUALS, BehaviorCompare.LESS_EQUAL, BehaviorCompare.LESS, BehaviorCompare.EQUALS, BehaviorCompare.NOT_EQUAL }; } if (behaviorParameter.parameterType == (int)BehaviorParameterType.Float) { compareEnumArr = new BehaviorCompare[] { BehaviorCompare.GREATER, BehaviorCompare.LESS }; } if (behaviorParameter.parameterType == (int)BehaviorParameterType.Bool) { compareEnumArr = new BehaviorCompare[] { BehaviorCompare.EQUALS, BehaviorCompare.NOT_EQUAL }; } string[] compareArr = new string[compareEnumArr.Length]; int compare = behaviorParameter.compare; bool found = false; for (int i = 0; i < compareEnumArr.Length; ++i) { string name = System.Enum.GetName(typeof(BehaviorCompare), compareEnumArr[i]); compareArr[i] = name; if ((BehaviorCompare)behaviorParameter.compare == compareEnumArr[i]) { compare = i; found = true; } } if (!found) { compare = 0; } GUI.enabled = (drawParameterType != DrawParameterType.BEHAVIOR_PARAMETER) && (drawParameterType != DrawParameterType.RUNTIME_PARAMETER); bool value = (drawParameterType != DrawParameterType.BEHAVIOR_PARAMETER) && (drawParameterType != DrawParameterType.RUNTIME_PARAMETER) && (drawParameterType != DrawParameterType.BEHAVIOR_PARAMETER_ADD); bool boolType = (behaviorParameter.parameterType == (int)BehaviorParameterType.Bool); if (value && !boolType) { compare = EditorGUILayout.Popup(compare, compareArr, GUILayout.Width(65)); behaviorParameter.compare = (int)(compareEnumArr[compare]); } GUI.enabled = true; if (boolType) { behaviorParameter.compare = (int)BehaviorCompare.EQUALS; } GUI.enabled = true;// (drawParameterType != DrawParameterType.BEHAVIOR_PARAMETER); { if (behaviorParameter.parameterType == (int)BehaviorParameterType.Int) { behaviorParameter.intValue = EditorGUILayout.IntField(behaviorParameter.intValue, GUILayout.Width(60)); } if (behaviorParameter.parameterType == (int)BehaviorParameterType.Float) { behaviorParameter.floatValue = EditorGUILayout.FloatField(behaviorParameter.floatValue, GUILayout.Width(60)); } if (behaviorParameter.parameterType == (int)BehaviorParameterType.Bool) { behaviorParameter.boolValue = EditorGUILayout.Toggle(behaviorParameter.boolValue, GUILayout.Width(60)); } } GUI.enabled = true; } EditorGUILayout.EndHorizontal(); GUILayout.Space(5); return(behaviorParameter); }
private static BehaviorTreeData ImportParameter(BehaviorTreeData behaviorData, string fileName) { Debug.LogError(fileName); TableRead.Instance.Init(); string csvPath = string.Format("{0}/StreamingAssets/CSV/", Application.dataPath); // Extend.GameUtils.CombinePath(Application.dataPath, "StreamingAssets", "CSV"); //string.Format("{0}/StreamingAssets/CSV/", Application.dataPath); TableRead.Instance.ReadCustomPath(csvPath); // Debug.LogError(filePath + " " + fileName); List <int> keyList = TableRead.Instance.GetKeyList(fileName); Dictionary <string, BehaviorParameter> parameterDic = new Dictionary <string, BehaviorParameter>(); for (int i = 0; i < behaviorData.parameterList.Count; ++i) { BehaviorParameter parameter = behaviorData.parameterList[i]; parameterDic[parameter.parameterName] = parameter; } for (int i = 0; i < keyList.Count; ++i) { int key = keyList[i]; string EnName = TableRead.Instance.GetData(fileName, key, "EnName"); string cnName = TableRead.Instance.GetData(fileName, key, "CnName"); string typeName = TableRead.Instance.GetData(fileName, key, "Type"); int type = int.Parse(typeName); string floatContent = TableRead.Instance.GetData(fileName, key, "FloatValue"); float floatValue = float.Parse(floatContent); string intContent = TableRead.Instance.GetData(fileName, key, "IntValue"); int intValue = int.Parse(intContent); string boolContent = TableRead.Instance.GetData(fileName, key, "BoolValue"); bool boolValue = (int.Parse(boolContent) == 1); if (parameterDic.ContainsKey(EnName)) { if (parameterDic[EnName].parameterType != type) { Debug.LogError("已经存在参数:" + EnName + " type:" + (BehaviorParameterType)parameterDic[EnName].parameterType + " newType:" + (BehaviorParameterType)type); } else { Debug.LogError("已经存在参数:" + EnName); } parameterDic.Remove(EnName); for (int j = 0; j < behaviorData.parameterList.Count; ++j) { BehaviorParameter cacheParameter = behaviorData.parameterList[j]; if (cacheParameter.parameterName == EnName) { behaviorData.parameterList.RemoveAt(j); break; } } //continue; } //Debug.LogError(EnName + " " +cnName + " " + typeName); BehaviorParameter parameter = new BehaviorParameter(); parameter.parameterName = EnName; parameter.CNName = cnName; parameter.compare = (int)BehaviorCompare.EQUALS; parameter.parameterType = type; parameter.boolValue = false; if (type == (int)BehaviorParameterType.Float) { parameter.floatValue = floatValue; } if (type == (int)BehaviorParameterType.Int) { parameter.intValue = intValue; } if (type == (int)BehaviorParameterType.Float) { parameter.boolValue = boolValue; } behaviorData.parameterList.Add(parameter); } foreach (var kv in parameterDic) { Debug.LogError("==========缺失的参数:" + kv.Key); } return(behaviorData); }