/// <summary> /// 绘制数组 /// </summary> /// <param name="name"></param> /// <param name="data"></param> /// <param name="addCustomData">自定义添加新的Item</param> /// <param name="ItemChnageCallBack">当Item添加或删除时回调</param> /// <param name="customDrawItem">自定义绘制Item</param> /// <returns></returns> public static object DrawArray(GUIContent name, object data, CallBackR <object> addCustomData = null, CallBack <bool, object> ItemChnageCallBack = null, CallBackR <object, object> customDrawItem = null) { if (data == null) { DrawLableString(name, "Null"); return(null); } Type type = data.GetType(); string ts = type.FullName.Replace("[]", ""); type = ReflectionUtils.GetTypeByTypeFullName(ts); var typeList = typeof(List <>); Type typeDataList = typeList.MakeGenericType(type); object instance = Activator.CreateInstance(typeDataList); MethodInfo AddRange = typeDataList.GetMethod("AddRange"); AddRange.Invoke(instance, new object[] { data }); instance = DrawList(name, instance, addCustomData, ItemChnageCallBack, customDrawItem); MethodInfo ToArray = typeDataList.GetMethod("ToArray"); return(ToArray.Invoke(instance, null)); }
/// <summary> /// 绘制数组 /// </summary> /// <param name="name"></param> /// <param name="data"></param> /// <returns></returns> public static object DrawArray(string name, object data, CallBackR <object> addCustomData = null, CallBack <bool, object> ItemChnageCallBack = null, EditorUIOpenState openState = EditorUIOpenState.NoOpen, UIStateData uIStateData = null) { if (data == null) { Debug.LogError("data is null"); return(null); } if (uIStateData == null) { uIStateData = EditorUIStateData.GetRootUIState(data.GetHashCode(), openState); } Type type = data.GetType(); string ts = type.FullName.Replace("[]", ""); type = ReflectionUtils.GetTypeByTypeFullName(ts); var typeList = typeof(List <>); Type typeDataList = typeList.MakeGenericType(type); object instance = Activator.CreateInstance(typeDataList); MethodInfo AddRange = typeDataList.GetMethod("AddRange"); AddRange.Invoke(instance, new object[] { data }); instance = DrawList(name, instance, addCustomData, ItemChnageCallBack, openState, uIStateData); MethodInfo ToArray = typeDataList.GetMethod("ToArray"); return(ToArray.Invoke(instance, null)); }
void ShowInfoGUI <T>(T[] info, ref T selectT, CallBackR <string, T> detailNameButtonGUICallBack, CallBack <T> detailInfoGUICallBack, CallBack <T> followFuctionButonUIExtend = null) where T : MemberInfo { if (info == null) { return; } foreach (var f in info) { GUILayout.BeginHorizontal(); GUILayout.Space(8); bool select = f.Equals(selectT); string str = select ? "▼" : "►"; str += " " + detailNameButtonGUICallBack(f); GUIStyle style = "hostview"; style.richText = true; style.alignment = TextAnchor.MiddleLeft; style.fontSize = 14; if (GUILayout.Button(str, style)) { if (select) { selectT = null; } else { selectT = f; } } if (followFuctionButonUIExtend != null) { followFuctionButonUIExtend(f); } GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal("Label"); GUILayout.Space(5); if (select) { GUILayout.Space(5); GUILayout.BeginVertical("box"); ShowLabel("定义", detailNameButtonGUICallBack(f)); if (detailInfoGUICallBack != null) { detailInfoGUICallBack(f); } GUILayout.EndVertical(); } GUILayout.EndHorizontal(); GUILayout.Space(5); } }
public AssetsData LoadAssetsLogic(string path, CallBackR <bool> checkContainsAssets, CallBackR <AssetsData, string> loadMethod) { LoadAssetsDependencie(path); AssetsData assets = null; if (checkContainsAssets()) { assets = assetsCaches[path]; } else { assets = loadMethod(path); if (assets == null) { Debug.LogError("资源加载失败:" + path); return(assets); } else { if (assetsCaches.ContainsKey(path)) { List <Object> asList = new List <Object>(assetsCaches[path].Assets); foreach (var item in assets.Assets) { if (!asList.Contains(item)) { asList.Add(item); } } assetsCaches[path].Assets = asList.ToArray(); assets = assetsCaches[path]; } else { if (useCache) { assetsCaches.Add(path, assets); } } } } if (useCache) { assets.refCount++; AssetsUnloadHandler.MarkUseAssets(assets, loader.IsHaveDependencies(path)); } return(assets); }
public void ListForeachNode(CallBackR <bool, T> eachItemCallBack) { for (int i = 0; i < TreeDataList.Count; i++) { if (eachItemCallBack != null) { T t = TreeDataList[i]; if (t == rootNode) { continue; } if (!eachItemCallBack(t)) { break; } } } }
public void SearchChilds(T node, CallBackR <bool, T> eachItemCallBack) { if (node == null) { return; } List <int> idList = node.childs; for (int i = 0; i < idList.Count; i++) { T n = GetNode(idList[i]); if (eachItemCallBack(n)) { SearchChilds(n, eachItemCallBack); } } }
void LayerTagDataShowGUI(string name, List <string> data, CallBackR <bool, string> addNewDataCallBack, CallBackR <bool, string> deleteCallBack) { GUILayout.BeginHorizontal(); GUILayout.Label(name); GUILayout.FlexibleSpace(); if (GUILayout.Button("+", GUILayout.Width(20))) { string s = "new " + name + data.Count; bool res = addNewDataCallBack(s); if (!res) { s += "_1"; addNewDataCallBack(s); } } GUILayout.EndHorizontal(); for (int i = 0; i < data.Count; i++) { GUILayout.BeginHorizontal("box"); GUILayout.Label(" " + data[i]); bool isDefult = data[i] == "None" ? true : false; if (!isDefult) { if (GUILayout.Button("ReName")) { chooseRenameItem = data[i]; isRename = true; return; } if (GUILayout.Button("Delete")) { deleteCallBack(data[i]); return; } } GUILayout.EndHorizontal(); } }
/// <summary> /// 绘制List泛型 /// </summary> /// <param name="name"></param> /// <param name="data"></param> /// <returns></returns> public static object DrawList(string name, object data, CallBackR <object> addCustomData = null, CallBack <bool, object> ItemChnageCallBack = null, EditorUIOpenState openState = EditorUIOpenState.NoOpen, UIStateData uIStateData = null) { if (data == null) { Debug.LogError("data is null"); return(null); } if (uIStateData == null) { uIStateData = EditorUIStateData.GetRootUIState(data.GetHashCode(), openState); } Type type = data.GetType(); Type t = type.GetGenericArguments()[0]; int count = (int)type.GetProperty("Count").GetValue(data, null); if (!string.IsNullOrEmpty(name)) { name = name + "(List<" + t.Name + ">) Count : " + count; } else { name = ""; } bool isFold = true; bool useStateData = false; if (uIStateData != null) { useStateData = true; isFold = EditorGUILayout.Foldout(uIStateData.isFold, name); } else { GUILayout.Label(name); } MethodInfo methodInfo = type.GetMethod("get_Item", BindingFlags.Instance | BindingFlags.Public); MethodInfo methodInfo1 = type.GetMethod("set_Item", BindingFlags.Instance | BindingFlags.Public); MethodInfo methodInfo2 = type.GetMethod("RemoveAt", BindingFlags.Instance | BindingFlags.Public); MethodInfo methodInfo3 = type.GetMethod("Add", BindingFlags.Instance | BindingFlags.Public); if (isFold) { GUILayout.BeginVertical("box"); GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (CanEdit && GUILayout.Button("+", GUILayout.Width(50))) { object temp = null; if (addCustomData != null) { object tempVV = addCustomData(); if (tempVV == null || tempVV.GetType().FullName != t.FullName) { temp = ReflectionUtils.CreateDefultInstance(t); } else { temp = tempVV; } } else { temp = ReflectionUtils.CreateDefultInstance(t); } methodInfo3.Invoke(data, new object[] { temp }); if (ItemChnageCallBack != null) { ItemChnageCallBack(true, temp); } } GUILayout.EndHorizontal(); } if (count > 0) { if (isFold) { GUILayout.BeginVertical("box"); } for (int i = 0; i < count; i++) { UIStateData uIStateData0 = null; if (uIStateData != null) { uIStateData0 = uIStateData.editorUIStateData.GetNextStateData(); } if (isFold) { object da = methodInfo.Invoke(data, new object[] { i }); GUILayout.BeginHorizontal(); da = DrawBaseValue("" + i, da, openState, uIStateData0); methodInfo1.Invoke(data, new object[] { i, da }); if (CanEdit && GUILayout.Button("-", GUILayout.Width(50))) { methodInfo2.Invoke(data, new object[] { i }); if (ItemChnageCallBack != null) { ItemChnageCallBack(false, da); } break; } GUILayout.EndHorizontal(); } } if (isFold) { GUILayout.EndVertical(); } } if (isFold) { GUILayout.EndVertical(); } if (useStateData) { uIStateData.isFold = isFold; } return(data); }
public static object DrawArray(string name, object data, CallBackR <object> addCustomData = null, CallBack <bool, object> ItemChnageCallBack = null, CallBackR <object, object> customDrawItem = null) { return(DrawArray(new GUIContent(name), data, addCustomData, ItemChnageCallBack, customDrawItem)); }
/// <summary> /// 绘制多页显示List数据 /// </summary> /// <param name="name"></param> /// <param name="data"></param> /// <param name="addCustomData">自定义添加新的Item</param> /// <param name="ItemChnageCallBack">当Item添加或删除时回调</param> /// <param name="customDrawItem">自定义绘制Item</param> /// <returns></returns> public static int DrawPage(GUIContent name, int index, object data, CallBackR <object> addCustomData = null, CallBack <bool, object> ItemChnageCallBack = null, CallBackR <object, object> customDrawItem = null) { if (data == null) { DrawLableString(name, "Null"); return(-1); } Type type = data.GetType(); Type t = type.GetGenericArguments()[0]; int count = (int)type.GetProperty("Count").GetValue(data, null); //Debug.Log(name + " count :" + count); MethodInfo methodInfo = type.GetMethod("get_Item", BindingFlags.Instance | BindingFlags.Public); MethodInfo methodInfo1 = type.GetMethod("set_Item", BindingFlags.Instance | BindingFlags.Public); MethodInfo methodInfo2 = type.GetMethod("RemoveAt", BindingFlags.Instance | BindingFlags.Public); MethodInfo methodInfo3 = type.GetMethod("Add", BindingFlags.Instance | BindingFlags.Public); MethodInfo methodInfo4 = type.GetMethod("Reverse", new Type[] { typeof(int), typeof(int) }); GUILayout.BeginVertical("box"); GUILayout.BeginHorizontal(); GUILayout.Label(name); GUILayout.FlexibleSpace(); if (GUILayout.Button("<", GUILayout.Width(60))) { index--; } index = EditorGUILayout.IntField(index, GUILayout.Width(40)); GUILayout.Label(index + "/" + (count - 1)); if (GUILayout.Button(">", GUILayout.Width(60))) { index++; } GUILayout.FlexibleSpace(); if (index <= 0) { index = 0; } if (index >= count) { index = count - 1; } if (CanEdit && GUILayout.Button("+", GUILayout.Width(50))) { object temp = null; if (addCustomData != null) { object tempVV = addCustomData(); if (tempVV == null || tempVV.GetType().FullName != t.FullName) { temp = ReflectionUtils.CreateDefultInstance(t); } else { temp = tempVV; } } else { temp = ReflectionUtils.CreateDefultInstance(t); } methodInfo3.Invoke(data, new object[] { temp }); if (ItemChnageCallBack != null) { ItemChnageCallBack(true, temp); } } GUILayout.EndHorizontal(); if (count > 0) { GUILayout.BeginVertical("box"); int i = index; object da = methodInfo.Invoke(data, new object[] { i }); GUILayout.BeginHorizontal(); GUILayout.BeginVertical(); if (customDrawItem != null) { da = customDrawItem(da); } else { da = DrawBaseValue("" + i, da); } GUILayout.EndVertical(); methodInfo1.Invoke(data, new object[] { i, da }); if (CanEdit && GUILayout.Button("↑", GUILayout.Width(15))) { if (i != 0) { methodInfo4.Invoke(data, new object[] { i - 1, 2 }); } } if (CanEdit && GUILayout.Button("↓", GUILayout.Width(15))) { if (i != (count - 1)) { methodInfo4.Invoke(data, new object[] { i, 2 }); } } if (CanEdit && GUILayout.Button("-", GUILayout.Width(30))) { methodInfo2.Invoke(data, new object[] { i }); if (ItemChnageCallBack != null) { ItemChnageCallBack(false, da); } } GUILayout.EndHorizontal(); GUILayout.EndVertical(); } GUILayout.EndVertical(); return(index); }
public static object DrawList(string name, object data, CallBackR <object> addCustomData = null, CallBack <bool, object> ItemChnageCallBack = null, CallBackR <object, object> customDrawItem = null, CallBackR <string, object> itemTitleName = null) { return(DrawList(new GUIContent(name), data, addCustomData, ItemChnageCallBack, customDrawItem, itemTitleName)); }
/// <summary> /// 绘制弹出菜单 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="name"></param> /// <param name="selectedStr"></param> /// <param name="displayedOptions"></param> /// <param name="selectChangeCallBack"></param> /// <param name="customShowItemTextCallBack">自定义显示的Item的选项内容</param> /// <returns></returns> public static T DrawPopup <T>(string name, T selectedStr, List <T> displayedOptions, CallBack <T> selectChangeCallBack = null, CallBackR <string, T> customShowItemTextCallBack = null) { if (displayedOptions == null || (displayedOptions.Count == 0)) { return(default(T)); } int selectedIndex = -1; if (displayedOptions.Contains(selectedStr)) { selectedIndex = displayedOptions.IndexOf(selectedStr); } int recode = selectedIndex; if (selectedIndex == -1) { selectedIndex = 0; } GUIStyle style = new GUIStyle("Popup"); style.richText = true; List <string> tempListStr = new List <string>(); foreach (var item in displayedOptions) { if (customShowItemTextCallBack != null) { tempListStr.Add(customShowItemTextCallBack(item)); } else { tempListStr.Add(item.ToString()); } } selectedIndex = EditorGUILayout.Popup(name, selectedIndex, tempListStr.ToArray(), style); selectedStr = displayedOptions[selectedIndex]; if (selectedIndex != recode) { if (selectChangeCallBack != null) { selectChangeCallBack(selectedStr); } } return(selectedStr); }
/// <summary> /// 打开窗口 /// </summary> /// <param name="title">标题</param> /// <param name="value">希望修改的数据</param> /// <param name="customDrawGUI">自定义GUI绘制</param> /// <param name="checkCanOkButtonCallBack">检查是否能使用"OK"按钮</param> /// <param name="modificationCompleteCallBack">完成修改回调</param> public static void OpenWindow(EditorWindow otherWindow, string title, object value, CallBackR <object, object> customDrawGUI, CallBackR <bool, object> checkCanOkButtonCallBack, CallBack <object> modificationCompleteCallBack) { win = GetWindow <GeneralDataModificationWindow>(); win.wantsMouseMove = true; win.autoRepaintOnSceneChange = true; win.otherWindow = otherWindow; FocusWindowIfItsOpen <GeneralDataModificationWindow>(); win.m_Title = title; //win.value = value; win.modifi_Value = value;//.DeepCopySelf(); win.customDrawGUI = customDrawGUI; win.modificationCompleteCallBack = modificationCompleteCallBack; win.checkCanOkButtonCallBack = checkCanOkButtonCallBack; }
public void TreeForeachNode(CallBackR <bool, T> eachItemCallBack) { SearchChilds(rootNode, eachItemCallBack); }
/// <summary> /// 获取储存的实例 /// </summary> /// <param name="getInstanceCallBackR">自定义实例生成,用于GameObject组件赋值</param> /// <returns></returns> public object GetValue(CallBackR <object, Type> getInstanceCallBackR = null) { if (string.IsNullOrEmpty(ScriptName)) { return(null); } Type type = ReflectionUtils.GetTypeByTypeFullName(ScriptName); object classObj = null; if (getInstanceCallBackR != null) { classObj = getInstanceCallBackR(type); } else { classObj = ReflectionUtils.CreateDefultInstance(type); } BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; for (int i = 0; i < fieldValues.Count; i++) { BaseValue fInfo = fieldValues[i]; FieldInfo f = type.GetField(fInfo.name, flags); if (f != null && f.Name == fInfo.name) { try { f.SetValue(classObj, fInfo.GetValue()); } catch { continue; } } } PropertyInfo[] propertyInfos = type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); for (int i = 0; i < propertyInfos.Length; i++) { PropertyInfo property = propertyInfos[i]; if (property.CanRead && property.CanWrite) { try { for (int j = 0; j < propertyValues.Count; j++) { BaseValue pinfo = propertyValues[i]; if (property != null && property.Name == pinfo.name) { property.SetValue(classObj, pinfo.GetValue(), null); } } } catch { continue; } } } return(classObj); }