void initResources() { subwindowNames = new string[] { "Profile", "Cluster View", "Cluster Command", "Command Executor", "CommandGraph" }; hintTexture = FduEditorGUI.getHintIcon(); warningTexture = FduEditorGUI.getWarningIcon(); }
//绘制动画控制器所有的参数 void DrawAnimatorParameters() { EditorGUILayout.LabelField("Animator Parameters", FduEditorGUI.getTextCenter()); EditorGUILayout.BeginHorizontal(); var list = m_target.getParameterList(); for (int i = 0; i < list.Count; ++i) { EditorGUILayout.LabelField(list[i].name + "(" + list[i].type + ")"); if (i % 2 == 1) { EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); } } EditorGUILayout.EndHorizontal(); }
void OnGUI() { #if !CLUSTER_ENABLE GUI.Label(windowRect, new GUIContent("Cluster Is Disable", warningTexture), FduEditorGUI.getTitleStyle_LevelOne()); return; #endif //该控制台是主节点还是从节点的提示label string nodeText = ""; if (ClusterHelper.Instance != null && ClusterHelper.Instance.Server != null) { nodeText = "-MasterNode"; } if (ClusterHelper.Instance != null && ClusterHelper.Instance.Client != null) { nodeText = "-SlaveNode"; } GUILayout.Label("Console" + nodeText, FduEditorGUI.getTitleStyle_LevelOne(), GUILayout.Width(windowRect.width - 6)); curSubWindowIndex = GUILayout.Toolbar(curSubWindowIndex, subwindowNames, GUILayout.Width(windowRect.width - 6)); GUI.Box(new Rect(subWindowRect.x - 3, subWindowRect.y - 3, subWindowRect.width + 6, subWindowRect.height + 6), ""); if (subwindows != null) { //窗口发生切换 触发OnExit和OnEnter函数 if (oldSubWindowIndex != curSubWindowIndex) { if (oldSubWindowIndex >= 0) { subwindows[oldSubWindowIndex].OnExit(); } subwindows[curSubWindowIndex].OnEnter(); oldSubWindowIndex = curSubWindowIndex; } try { subwindows[curSubWindowIndex].DrawSubWindow(); } catch (System.ArgumentException) { } //由于非运行和运行状态切换时 某几帧会报错 错误原因上不明了 但不影响运行 } else { initSubwindowInstance(); } }
//绘制自定义监控属性功能面板 protected void DrawAttributeField() { GUIStyle style = new GUIStyle(); style.alignment = TextAnchor.MiddleCenter; EditorGUILayout.LabelField(new GUIContent("Observed Attributes", FduEditorGUI.getAttributeIcon()), style); EditorGUILayout.BeginHorizontal(); if (Application.isPlaying) { states = new System.Collections.Specialized.BitVector32(((FduMultiAttributeObserverBase)target).getObservedIntData()); } string [] attrList = getAttributeList(); if (attrList == null) { return; } for (int i = 1; i < attrList.Length; ++i) { if (!Application.isPlaying) { states[FduGlobalConfig.BIT_MASK[i]] = EditorGUILayout.Toggle(attrList[i], states[FduGlobalConfig.BIT_MASK[i]]); } else { EditorGUILayout.Toggle(attrList[i], states[FduGlobalConfig.BIT_MASK[i]]); } if (i % 2 == 0) { EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); } } EditorGUILayout.EndHorizontal(); }
//绘制子窗口 public override void DrawSubWindow() { var leftOffset = new GUIStyle(); leftOffset.margin.left = 10; if (!Application.isPlaying) { GUI.Label(subWindowRect, new GUIContent("You can get the information of cluster views at run time", parentWindow.hintTexture), FduEditorGUI.getTitleStyle_LevelOne()); return; } //画两个Box 上面用于列表 下面用于详细内容 GUI.Box(viewScroll, ""); GUI.Box(detailScroll, ""); views = FduClusterViewManager.getClusterViews(); FduClusterView view = null; //==========================================搜索与总数部分Start=================================== EditorGUILayout.Space(); EditorGUILayout.BeginHorizontal(leftOffset, GUILayout.Width(subWindowRect.width)); EditorGUILayout.LabelField("Total views ", FduClusterViewManager.getViewCount().ToString(), leftOffset); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(leftOffset, GUILayout.Width(subWindowRect.width)); searchText_view = EditorGUILayout.TextField("Search", searchText_view, GUILayout.Width(subWindowRect.width * 0.5f), GUILayout.Height(20)); EditorGUILayout.Space(); if (GUILayout.Button("Clear", GUILayout.Height(21))) { Debug.Log("click clear"); searchText_view = ""; searchingFlag = false; EditorGUI.FocusTextInControl(""); } if (GUILayout.Button("Search", GUILayout.Height(21))) { searchingFlag = true; EditorGUI.FocusTextInControl(""); } EditorGUILayout.EndHorizontal(); //==========================================搜索与总数部分End=================================== //==========================================View列表部分Start=================================== leftOffset.margin.left += 15; //var center = new GUIStyle(); //center.alignment = TextAnchor.MiddleCenter; var labelStyle = new GUIStyle(); labelStyle.fontStyle = FontStyle.Bold; EditorGUILayout.Space(); EditorGUILayout.BeginHorizontal(leftOffset, GUILayout.Width(subWindowRect.width)); EditorGUILayout.LabelField("ViewId", labelStyle, GUILayout.Width(viewScroll.width * 0.07f)); EditorGUILayout.LabelField("Name", labelStyle, GUILayout.Width(viewScroll.width * 0.25f)); EditorGUILayout.LabelField("Path", labelStyle, GUILayout.Width(viewScroll.width * 0.5f)); EditorGUILayout.EndHorizontal(); EditorGUILayout.Space(); var Nonestyle = new GUIStyle(); Nonestyle.name = "a"; viewScrollPos = EditorGUILayout.BeginScrollView(viewScrollPos, leftOffset, GUILayout.Width(viewScroll.width - 10), GUILayout.Height(viewScroll.height - 10)); string id, name, path; float len1, len2, len3, len4; len1 = viewScroll.width * 0.07f; len2 = viewScroll.width * 0.25f; len3 = viewScroll.width * 0.5f; len4 = viewScroll.width * 0.1f; int listCount = 0; while (views.MoveNext()) { view = views.Current.Value; if (view == null) { //EditorGUILayout.HelpBox("One view is disappeared but reference still exist in cluster manager!", MessageType.Warning); } else { id = view.ViewId.ToString(); name = view.name; path = FduSupportClass.getGameObjectPath(view.gameObject); if (!searchingFlag || checkSearchText(id, name, path)) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField(id, GUILayout.Width(len1)); EditorGUILayout.LabelField(name, GUILayout.Width(len2)); EditorGUILayout.LabelField(path, GUILayout.Width(len3)); if (GUILayout.Button("Detail", GUILayout.Width(len4))) { selectedViewId = views.Current.Value.ViewId; } EditorGUILayout.EndHorizontal(); listCount++; } } } bool noViewFlag = false; if (listCount == 0) { noViewFlag = true; } //为了强制显示scroll view 的进度条 BeginScrollView里面的alwaysShowVertical参数没用 for (int i = listCount; i < 22; ++i) { EditorGUILayout.LabelField(""); } EditorGUILayout.EndScrollView(); if (noViewFlag) { GUI.Label(viewScroll, new GUIContent("No Registed View", parentWindow.hintTexture), FduEditorGUI.getTitleStyle_LevelOne()); } //for (int i = 0; i < 500; ++i) //{ // EditorGUILayout.BeginHorizontal(); // EditorGUILayout.LabelField(i.ToString(), GUILayout.Width(len1)); // EditorGUILayout.LabelField("tentententententenssssssssssssssssssssss", GUILayout.Width(len2)); // EditorGUILayout.LabelField("miao/ssss/wwww/qqqq/aaaa/zzzz/xxxx/ccccddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", GUILayout.Width(len3)); // GUILayout.Button("Yes" + i, GUILayout.Width(len4)); // EditorGUILayout.EndHorizontal(); //} //==========================================View列表部分End=================================== var selectedView = FduClusterViewManager.getClusterView(selectedViewId); if (selectedView == null) { GUI.Label(detailScroll, new GUIContent("No Selected View", parentWindow.hintTexture), FduEditorGUI.getTitleStyle_LevelOne()); selectedViewId = -1; return; } //==========================================View detail 部分=================================== leftOffset.margin.top = 25; detailScrollPos = EditorGUILayout.BeginScrollView(detailScrollPos, leftOffset, GUILayout.Width(detailScroll.width - 10), GUILayout.Height(detailScroll.height - 10)); var pstyle = new GUIStyle(); pstyle.wordWrap = true; pstyle.margin.left = 5; EditorGUILayout.LabelField("ViewId: " + selectedView.ViewId + " GameObject Name: " + selectedView.name + " Observer Count: " + selectedView.getObserverCount(), GUILayout.Width(detailScroll.width - 50.0f)); EditorGUILayout.LabelField("Path: " + FduSupportClass.getGameObjectPath(selectedView.gameObject), pstyle, GUILayout.Width(detailScroll.width - 50.0f)); if (selectedView.getObserverCount() <= 0) { EditorGUILayout.EndScrollView(); return; } EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("GameObject Name", GUILayout.Width(detailScroll.width * 0.3f)); EditorGUILayout.LabelField("Observer Type", GUILayout.Width(detailScroll.width * 0.3f)); EditorGUILayout.LabelField("DTS Type", GUILayout.Width(detailScroll.width * 0.2f)); EditorGUILayout.LabelField("DTS Parameter", GUILayout.Width(detailScroll.width * 0.3f)); EditorGUILayout.EndHorizontal(); List <FduObserverBase> .Enumerator observers = selectedView.getObservers(); string dtsName = "NULL"; string dtsPara = "NULL"; while (observers.MoveNext()) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField(observers.Current.name, GUILayout.Width(detailScroll.width * 0.3f)); EditorGUILayout.LabelField(observers.Current.GetType().FullName, GUILayout.Width(detailScroll.width * 0.3f)); if (observers.Current.getDataTransmitStrategy() != null) { dtsName = observers.Current.getDataTransmitStrategy().GetType().FullName; dtsPara = getDTSParaInfo(observers.Current.getDataTransmitStrategy()); //dtsPara = observers.Current.getDataTransmitStrategy().getCustomData().ToString(); } EditorGUILayout.LabelField(dtsName, GUILayout.Width(detailScroll.width * 0.2f)); EditorGUILayout.LabelField(dtsPara, GUILayout.Width(detailScroll.width * 0.3f)); EditorGUILayout.EndHorizontal(); } //for (int i = 0; i < 10; ++i) //{ // EditorGUILayout.BeginHorizontal(); // EditorGUILayout.LabelField("Observer GameObject name",GUILayout.Width(detailScroll.width*0.3f)); // EditorGUILayout.LabelField("FduTransformObserver", GUILayout.Width(detailScroll.width * 0.3f)); // EditorGUILayout.LabelField("FduDTS_Direct", GUILayout.Width(detailScroll.width * 0.2f)); // EditorGUILayout.LabelField("OnGetPlayerSetIKEvent", GUILayout.Width(detailScroll.width * 0.3f)); // EditorGUILayout.EndHorizontal(); //} EditorGUILayout.EndScrollView(); //==========================================View detail 部分=================================== }
public override void DrawSubWindow() { if (!Application.isPlaying) { GUI.Label(subWindowRect, new GUIContent("You can get the information of Command graph at run time", parentWindow.hintTexture), FduEditorGUI.getTitleStyle_LevelOne()); return; } DrawRects(); if (GUI.Button(refreshButtonPos, "Refresh")) { RefreshData(); } }
//通过显示数据 画所有内容 void DrawRects() { if (displayNodeList.Count < 1) { GUI.Label(subWindowRect, new GUIContent("No Command Data", parentWindow.hintTexture), FduEditorGUI.getTitleStyle_LevelOne()); } //根据生成的显示数据 画每一个节点 foreach (displayNode dis in displayNodeList) { GUI.DrawTexture(new Rect(dis.position.x + dis.position.width * 0.5f * (1 - scale), dis.position.y + dis.position.height * 0.5f * (1 - scale), dis.position.width * scale, dis.position.height * scale), rectTexture[(int)dis.color]); if (scale >= 1.0f) //缩放完成后显示Label { if (dis.state == displayNodeState.normal) //可以正常显示的节点显示信息 { GUI.Label(dis.position, getShowMessage(dis.nodeData), labelStyle); } else { GUI.Label(dis.position, dis.hideIndex.ToString(), labelStyle);//显示不了的节点显示index 可以由用户通过index查找到对应信息 } } } //画左侧的颜色标识标签 GUI.DrawTexture(colorHintLabelPos, colorHintLabelTexture); GUI.Label(new Rect(colorHintLabelPos.x, colorHintLabelPos.y - 20, 100, 20), "Rasied Times"); float interval = colorHintLabelPos.height / (int)colorLevel.Others; float x = colorHintLabelPos.x + colorHintLabelPos.width + 5; float y = colorHintLabelPos.y + colorHintLabelPos.height - interval * 0.5f; GUI.Label(new Rect(x, y, 100, 20), "0~" + (int)colorStep[0]); //为每一个颜色添加标签 for (int i = 1; i < (int)colorLevel.Others; ++i) { x = colorHintLabelPos.x + colorHintLabelPos.width + 5; y = colorHintLabelPos.y + colorHintLabelPos.height - interval * 0.5f - i * interval; if (((int)colorStep[i - 1]) < ((int)colorStep[i])) { GUI.Label(new Rect(x, y, 100, 20), ((int)colorStep[i - 1]) + 1 + "~" + ((int)colorStep[i])); } else { GUI.Label(new Rect(x, y, 100, 20), "None"); } } var detailStyle = FduEditorGUI.getWordWarp(); //画下方的Detail部分 if (hideIndexCount > 0 && scale >= 1.0f) { GUI.Box(detailScrollPos, ""); scrollPos = GUI.BeginScrollView(detailScrollPos, scrollPos, new Rect(0, 0, detailScrollPos.width, detailHeight)); var content = new GUIContent(""); detailHeight = 0.0f; foreach (displayNode dis in displayNodeList) { if (dis.state != displayNodeState.normal) { content.text = dis.getHideInfoString(); GUI.Label(new Rect(10, detailHeight, detailScrollPos.width - 10, 15), content, detailStyle); //启动换行了 那么Rect的height形同虚设 detailHeight += detailStyle.CalcHeight(content, detailScrollPos.width - 10); } } if (noExecutorCommandList.Count > 0) { string noExecutorInfo = "No Executor Commands: " + noExecutorCommandList[0]; for (int i = 1; i < noExecutorCommandList.Count; ++i) { noExecutorInfo += ", " + noExecutorCommandList[i]; } content.text = noExecutorInfo; GUI.Label(new Rect(10, detailHeight, detailScrollPos.width - 10, 15), content, detailStyle); detailHeight += detailStyle.CalcHeight(content, detailScrollPos.width - 10); } GUI.EndScrollView(); } }
//绘制窗口 public override void DrawSubWindow() { var leftOffset = new GUIStyle(); leftOffset.margin.left = 10; if (!Application.isPlaying) { GUI.Label(subWindowRect, new GUIContent("You can get the information of cluster Commands at run time", parentWindow.hintTexture), FduEditorGUI.getTitleStyle_LevelOne()); return; } //==========================================搜索与总数部分Start=================================== EditorGUILayout.Space(); EditorGUILayout.BeginHorizontal(leftOffset, GUILayout.Width(subWindowRect.width)); EditorGUILayout.LabelField("Cached Command Count ", ClusterCommandStatisticClass.instance.getCommandCount().ToString(), leftOffset); EditorGUILayout.EndHorizontal(); //画两个Box 上面用于列表 下面用于详细内容 GUI.Box(CommandScroll, ""); GUI.Box(detailScroll, ""); EditorGUILayout.BeginHorizontal(leftOffset, GUILayout.Width(subWindowRect.width)); searchText_Command = (string)EditorGUILayout.TextField("Search", searchText_Command, GUILayout.Width(subWindowRect.width * 0.5f), GUILayout.Height(20)).Clone(); EditorGUILayout.Space(); if (GUILayout.Button("Clear", GUILayout.Height(21))) { Debug.Log("click clear"); searchText_Command = ""; searchingFlag = false; EditorGUI.FocusTextInControl(""); } if (GUILayout.Button("Search", GUILayout.Height(21))) { searchingFlag = true; EditorGUI.FocusTextInControl(""); } EditorGUILayout.EndHorizontal(); //==========================================搜索与总数部分End=================================== if (ClusterCommandStatisticClass.instance.getCommandCount() <= 0) { GUI.Label(CommandScroll, new GUIContent("No Cached Command", parentWindow.hintTexture), FduEditorGUI.getTitleStyle_LevelOne()); } //==========================================Command列表部分Start=================================== leftOffset.margin.left += 15; float len1, len2, len3, len4, len5; len1 = CommandScroll.width * 0.25f; len2 = CommandScroll.width * 0.07f; len3 = CommandScroll.width * 0.07f; len4 = CommandScroll.width * 0.43f; len5 = CommandScroll.width * 0.1f; var labelStyle = new GUIStyle(); labelStyle.fontStyle = FontStyle.Bold; EditorGUILayout.Space(); EditorGUILayout.BeginHorizontal(leftOffset, GUILayout.Width(subWindowRect.width)); EditorGUILayout.LabelField("Command Name", labelStyle, GUILayout.Width(len1)); EditorGUILayout.LabelField("Frame", labelStyle, GUILayout.Width(len2)); EditorGUILayout.LabelField("Parameter Count And Names", labelStyle, GUILayout.Width(len3 * 5)); EditorGUILayout.EndHorizontal(); EditorGUILayout.Space(); int listCount = 0; CommandScrollPos = EditorGUILayout.BeginScrollView(CommandScrollPos, leftOffset, GUILayout.Width(CommandScroll.width - 10), GUILayout.Height(CommandScroll.height - 10)); var enu = ClusterCommandStatisticClass.instance.getStatisticCommandData(); string CommandName; while (enu.MoveNext()) { CommandName = enu.Current.e.getCommandName(); if (!searchingFlag || checkSearchText(CommandName)) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField(CommandName, GUILayout.Width(len1)); EditorGUILayout.LabelField(enu.Current.frameCount.ToString(), GUILayout.Width(len2)); EditorGUILayout.LabelField(enu.Current.e.getParameterCount().ToString(), GUILayout.Width(len3)); EditorGUILayout.LabelField(getCommandParameters(enu.Current.e), GUILayout.Width(len4)); if (GUILayout.Button("Check", GUILayout.Width(len5))) { detailData = new ClusterCommandShowData(enu.Current.e, enu.Current.frameCount); } EditorGUILayout.EndHorizontal(); listCount++; } } //为了强制显示scroll view 的进度条 BeginScrollView里面的alwaysShowVertical参数没用 for (int i = listCount; i < 22; ++i) { EditorGUILayout.LabelField(""); } EditorGUILayout.EndScrollView(); //==========================================Command列表部分End=================================== //==========================================Command detail 部分=================================== if (detailData == null) { GUI.Label(detailScroll, new GUIContent("No Selected Command", parentWindow.hintTexture), FduEditorGUI.getTitleStyle_LevelOne()); return; } leftOffset.margin.top = 25; detailScrollPos = EditorGUILayout.BeginScrollView(detailScrollPos, leftOffset, GUILayout.Width(detailScroll.width - 10), GUILayout.Height(detailScroll.height - 10)); EditorGUILayout.LabelField("CommandName: " + detailData.e.getCommandName() + " Raised Frame: " + detailData.frameCount + " Parameter Count: " + detailData.e.getParameterCount(), GUILayout.Width(detailScroll.width - 50.0f)); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Parameter Name", GUILayout.Width(detailScroll.width * 0.3f)); EditorGUILayout.LabelField("Parameter Value", GUILayout.Width(detailScroll.width * 0.3f)); EditorGUILayout.EndHorizontal(); var paraMap = detailData.e.getMapEnumerator(); while (paraMap.MoveNext()) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField(paraMap.Current.Key, GUILayout.Width(detailScroll.width * 0.3f)); EditorGUILayout.LabelField(paraMap.Current.Value.ToString(), GUILayout.Width(detailScroll.width * 0.3f)); EditorGUILayout.EndHorizontal(); } var collMap = detailData.e.getCollectionsMapEnumerator(); while (collMap.MoveNext()) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField(collMap.Current.Key, GUILayout.Width(detailScroll.width * 0.3f)); string collectorInfo = getCollectionInfo(collMap.Current.Value); EditorGUILayout.LabelField(collectorInfo, FduEditorGUI.getWordWarp(), GUILayout.Width(detailScroll.width * 0.6f)); EditorGUILayout.EndHorizontal(); } //for (int i = 0; i < 10; ++i) //{ // EditorGUILayout.BeginHorizontal(); // EditorGUILayout.LabelField("Observer GameObject name", GUILayout.Width(detailScroll.width * 0.3f)); // EditorGUILayout.LabelField("FduTransformObserver", GUILayout.Width(detailScroll.width * 0.3f)); // EditorGUILayout.EndHorizontal(); //} EditorGUILayout.EndScrollView(); //==========================================Command detail 部分=================================== }
public override void OnInspectorGUI() { serializedObject.Update(); m_target = (FduClusterView)target; if (Application.isPlaying) { EditorGUILayout.LabelField("ViewID", m_target.ViewId.ToString()); } else { EditorGUILayout.LabelField("ViewID", "Set at run time"); } if (EditorUtility.IsPersistent(m_target.gameObject) && m_target.gameObject.transform.parent == null) { EditorGUILayout.LabelField("SubviewCount", m_subViewList.arraySize.ToString()); for (int i = 0; i < m_subViewList.arraySize; ++i) { EditorGUILayout.LabelField("sub view name", m_subViewList.GetArrayElementAtIndex(i).objectReferenceValue.name); } EditorGUILayout.BeginHorizontal(); m_target.IsObservingCreation = EditorGUILayout.Toggle("Observe Creation", m_target.IsObservingCreation); if (m_target.IsObservingCreation) { EditorGUILayout.LabelField("Asset Id", m_assetId.intValue.ToString()); if (m_assetId.intValue < 0) { EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.HelpBox("This Prefab is not added to AssetManager. Please find FduClutserAssetManager and press refresh.", MessageType.Error); } } EditorGUILayout.EndHorizontal(); } EditorGUILayout.BeginHorizontal(); m_target.IsObservingDestruction = EditorGUILayout.Toggle("Observe Destruction", m_target.IsObservingDestruction); m_target.IsObservingActiveState = EditorGUILayout.Toggle("Observe Active State*", m_target.IsObservingActiveState); EditorGUILayout.EndHorizontal(); var bold = new GUIStyle(); bold.fontStyle = FontStyle.Bold; _advaceSettingFold = EditorGUILayout.Foldout(_advaceSettingFold, "Advance Setting"); if (_advaceSettingFold) { EditorGUILayout.BeginHorizontal(); m_target.IsImmediatelyDeserialize = EditorGUILayout.Toggle("Is ImmediatelyDeserialize", m_target.IsImmediatelyDeserialize); m_target.IsAutomaticllySend = EditorGUILayout.Toggle("Is Automaticlly Send", m_target.IsAutomaticllySend); EditorGUILayout.EndHorizontal(); m_target.resendPriority = (FDUObjectSync.Message.ResendPriority)EditorGUILayout.EnumPopup("Data Resend Priority", m_target.resendPriority); } if (m_parentView.objectReferenceValue != null) { EditorGUILayout.LabelField("ParentView", m_parentView.objectReferenceValue.name); } if (m_target.IsObservingActiveState) { EditorGUILayout.HelpBox("When you are using observing active state,please review considerations in the document.", MessageType.Info); } GUIStyle style = new GUIStyle(); style.alignment = TextAnchor.MiddleCenter; EditorGUILayout.LabelField(new GUIContent("Observer List", FduEditorGUI.getObserverIcon()), style); if (Application.isPlaying) //程序运行时不允许额外操作 { List <FduObserverBase> .Enumerator enumerator = m_target.getObservers(); int i = 0; while (enumerator.MoveNext()) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField(i + " " + enumerator.Current.gameObject.name + "(" + enumerator.Current.GetType().Name + ")"); EditorGUILayout.EndHorizontal(); i++; } } else { SerializedProperty property; bool hintFlag = false; for (int i = 0; i < m_observerList.arraySize; ++i) { property = m_observerList.GetArrayElementAtIndex(i); if (property.objectReferenceValue == null || !m_target.Equals(((FduObserverBase)(property.objectReferenceValue)).GetClusterView())) //如果obsever列表中的值为空 或者对应observer所属的view不是本view 则需要重新刷新 { hintFlag = true; } else { EditorGUILayout.LabelField(((FduObserverBase)property.objectReferenceValue).gameObject.name + "(" + ((FduObserverBase)property.objectReferenceValue).GetType().FullName + ")"); } } for (int i = 0; i < m_subViewList.arraySize; ++i) { property = m_subViewList.GetArrayElementAtIndex(i); if (property.objectReferenceValue == null) { hintFlag = true; } } if (hintFlag) { Refresh(); } if (GUILayout.Button("Refresh")) { Refresh(); } } if (GUI.changed) { serializedObject.ApplyModifiedProperties(); EditorUtility.SetDirty(target); } }
//绘制子窗口 public override void DrawSubWindow() { var leftOffset = new GUIStyle(); leftOffset.margin.left = 10; if (!Application.isPlaying) { GUI.Label(subWindowRect, new GUIContent("You can get the information of Command Executor at run time", parentWindow.hintTexture), FduEditorGUI.getTitleStyle_LevelOne()); return; } //画Box背景 GUI.Box(ExecutorScroll, ""); //views = FduClusterViewManager.getClusterViews(); //==========================================搜索与总数部分Start=================================== if (ClusterHelper.Instance != null && ClusterHelper.Instance.Server != null) { hintText = "Master Node Command Executors"; } if (ClusterHelper.Instance != null && ClusterHelper.Instance.Client != null) { hintText = "Slave Node Command Executors"; } EditorGUILayout.Space(); EditorGUILayout.BeginHorizontal(leftOffset, GUILayout.Width(subWindowRect.width)); EditorGUILayout.LabelField("Command Executor Count ", FduClusterCommandDispatcher.getExecutorCount().ToString(), leftOffset); EditorGUILayout.LabelField(hintText); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(leftOffset, GUILayout.Width(subWindowRect.width)); searchText_CommandExecutor = EditorGUILayout.TextField("Search", searchText_CommandExecutor, GUILayout.Width(subWindowRect.width * 0.5f), GUILayout.Height(20)); EditorGUILayout.Space(); if (GUILayout.Button("Clear", GUILayout.Height(21))) { searchText_CommandExecutor = ""; searchingFlag = false; EditorGUI.FocusTextInControl(""); } if (GUILayout.Button("Search", GUILayout.Height(21))) { searchingFlag = true; EditorGUI.FocusTextInControl(""); } EditorGUILayout.EndHorizontal(); //==========================================搜索与总数部分End=================================== //==========================================Executor列表部分Start=================================== leftOffset.margin.left += 15; var center = new GUIStyle(); center.alignment = TextAnchor.MiddleCenter; float len1, len2, len3, len4, len5; len1 = ExecutorScroll.width * 0.3f; len2 = ExecutorScroll.width * 0.3f; len3 = ExecutorScroll.width * 0.3f; len4 = ExecutorScroll.width * 0.43f; len5 = ExecutorScroll.width * 0.1f; var labelStyle = new GUIStyle(); labelStyle.fontStyle = FontStyle.Bold; EditorGUILayout.Space(); EditorGUILayout.BeginHorizontal(leftOffset, GUILayout.Width(subWindowRect.width)); EditorGUILayout.LabelField("Executor Info", labelStyle, GUILayout.Width(len1)); EditorGUILayout.LabelField("Observed Command", labelStyle, GUILayout.Width(len2)); EditorGUILayout.LabelField("Executor Target", labelStyle, GUILayout.Width(len3)); EditorGUILayout.EndHorizontal(); if (FduClusterCommandDispatcher.getExecutorCount() <= 0) { GUI.Label(ExecutorScroll, new GUIContent("No Registed Command Executor", parentWindow.hintTexture), FduEditorGUI.getTitleStyle_LevelOne()); return; } EditorGUILayout.Space(); CommandScrollPos = EditorGUILayout.BeginScrollView(CommandScrollPos, leftOffset, GUILayout.Width(ExecutorScroll.width - 10), GUILayout.Height(ExecutorScroll.height - 10)); var Executors = FduClusterCommandDispatcher.getExecutors(); int listCount = 0; while (Executors.MoveNext()) { var subExecutors = Executors.Current.Value.ActionMap.GetEnumerator(); while (subExecutors.MoveNext()) { EditorGUILayout.BeginHorizontal(); string exeInfo = string.Format("ID:{0} Name:{1}", subExecutors.Current.Key, subExecutors.Current.Value.Method.Name); EditorGUILayout.LabelField(exeInfo, GUILayout.Width(len1)); EditorGUILayout.LabelField(Executors.Current.Key, GUILayout.Width(len2)); if (subExecutors.Current.Value.Target != null) { EditorGUILayout.LabelField(subExecutors.Current.Value.Target.ToString(), GUILayout.Width(len3)); } else { EditorGUILayout.LabelField("NULL", GUILayout.Width(len3)); } EditorGUILayout.EndHorizontal(); listCount++; } } //为了强制显示scroll view 的进度条 BeginScrollView里面的alwaysShowVertical参数没用 for (int i = listCount; i < 35; ++i) { EditorGUILayout.LabelField(""); } EditorGUILayout.EndScrollView(); //==========================================Executor列表部分End=================================== }