void OnAddClicked(Blackboard t) { GenericMenu menu = new GenericMenu(); foreach (var dataType in CZTypeFactory.TypeCreator.Keys) { Type valueType = Utility_Reflection.GetFieldInfo(dataType, "value").FieldType; if (!typeof(UnityEngine.Object).IsAssignableFrom(valueType) && !UIElementsFactory.FieldDrawerCreatorMap.ContainsKey(valueType)) { continue; } menu.AddItem(new GUIContent(dataType.Name), false, () => { string name = dataType.Name; int i = 0; while (GraphView.Model.ContainsName_BB(name)) { name = dataType.Name + " " + i++; } GraphView.Model.AddData_BB(name, CZTypeFactory.TypeCreator[dataType]()); }); } menu.ShowAsContext(); }
static CZTypeFactory() { foreach (var type in Utility_Reflection.GetChildrenTypes <ICZType>()) { if (!type.IsGenericType && !type.IsAbstract) { TypeCreator[type] = () => { return(Activator.CreateInstance(type) as ICZType); } } ; } }
protected virtual IEnumerable <Type> GetNodeTypes() { foreach (var type in Utility_Reflection.GetChildrenTypes <BaseNode>()) { if (type.IsAbstract) { continue; } Debug.Log(type.Name); yield return(type); } }
static GraphProcessorCache() { portCache = new Dictionary <Type, List <NodePort> >(); foreach (var nodeType in Utility_Reflection.GetChildrenTypes <BaseNode>()) { if (nodeType.IsAbstract) { continue; } CachePorts(nodeType); } }
static TimelineLiteObject() { ActionDataDict = new Dictionary <Type, Type>(); foreach (var actionType in Utility_Reflection.GetChildrenTypes <ITLAction>()) { if (actionType.IsGenericType || actionType.IsAbstract) { continue; } Type actionDataType = actionType.GetProperty("TActionData", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public).PropertyType; ActionDataDict[actionDataType] = actionType; } }
public ConversationManager() { if (CommandResolverTypeCache == null) { CommandResolverTypeCache = new Dictionary <string, Type>(); foreach (var type in Utility_Reflection.GetChildrenTypes <IConversationCommand>()) { if (Utility_Attribute.TryGetTypeAttribute(type, out CommandNameAttribute attribute)) { CommandResolverTypeCache[attribute.commandText] = type; } } } }
protected override IEnumerable <Type> GetNodeTypes() { foreach (var type in Utility_Reflection.GetChildrenTypes <GOAPAction>()) { if (type.IsAbstract) { continue; } yield return(type); } foreach (var type in Utility_Reflection.GetChildrenTypes <GOAPActionEvtNode>()) { if (type.IsAbstract) { continue; } yield return(type); } }
static void CachePorts(Type _nodeType) { List <FieldInfo> fieldInfos = Utility_Reflection.GetFieldInfos(_nodeType); foreach (var fieldInfo in fieldInfos) { // 获取接口特性 if (!Utility_Attribute.TryGetFieldAttribute(_nodeType, fieldInfo.Name, out PortAttribute portAttribute)) { continue; } if (!portCache.ContainsKey(_nodeType)) { portCache.Add(_nodeType, new List <NodePort>()); } portCache[_nodeType].Add(new NodePort(fieldInfo, portAttribute)); } }
public static IEnumerable <SharedVariable> CollectionObjectSharedVariables(object _object) { List <FieldInfo> fieldInfos = Utility_Reflection.GetFieldInfos(_object.GetType()); Type sharedType = typeof(SharedVariable); foreach (var fieldInfo in fieldInfos) { if (sharedType.IsAssignableFrom(fieldInfo.FieldType)) { SharedVariable variable = fieldInfo.GetValue(_object) as SharedVariable; if (variable == null) { variable = Activator.CreateInstance(fieldInfo.FieldType) as SharedVariable; fieldInfo.SetValue(_object, variable); } yield return(variable); continue; } } }
/// <summary> 绘制内部所有字段 </summary> public static object DrawFields(object _object) { if (_object == null) { return(null); } List <FieldInfo> fields = Utility_Reflection.GetFieldInfos(_object.GetType()); for (int j = 0; j < fields.Count; j++) { if (CanDraw(fields[j])) { EditorGUI.BeginChangeCheck(); object value = EditorGUILayoutExtension.DrawField(fields[j], fields[j].GetValue(_object)); if (EditorGUI.EndChangeCheck()) { fields[j].SetValue(_object, value); GUI.changed = true; } } } return(_object); }
public void Initialize(object _target) { Target = _target; Script = EditorUtilityExtension.FindScriptFromType(Target.GetType()); Fields = Utility_Reflection.GetFieldInfos(Target.GetType()).FindAll(field => EditorGUILayoutExtension.CanDraw(field)); }
public List <FieldInfo> GetNodeFieldInfos() { return(Utility_Reflection.GetFieldInfos(GetType())); }
protected virtual void BuildToolboxTreeView(ToolboxTreeView _treeView) { _treeView.AddItem(ToolboxTreeViewItem.GetSeparator(2)); // 打开脚本,ping和选中保存按钮 ToolboxTreeViewItem helpControl = ToolboxTreeViewItem.GetItem((rect, item) => { #if UNITY_2018_1_OR_NEWER TimelineLiteAsset timelineLiteAsset = TimelineEditor.inspectedAsset as TimelineLiteAsset; #else TimelineLiteAsset timelineLiteAsset = TimelineEditor.timelineAsset as TimelineLiteAsset; #endif EditorGUI.BeginDisabledGroup(timelineLiteAsset == null); rect.width = 30; if (GUI.Button(rect, csIcon)) { AssetDatabase.OpenAsset(MonoScript.FromScriptableObject(timelineLiteAsset)); } rect.x += rect.width; if (GUI.Button(rect, pingIcon)) { Type type = Utility_Reflection.GetType("UnityEditor.ProjectBrowser", "UnityEditor"); EditorWindow window = GetWindow(type); EditorGUIUtility.PingObject(timelineLiteAsset); } rect.x += rect.width; if (GUI.Button(rect, selectIcon)) { Selection.activeObject = timelineLiteAsset; } rect.x += rect.width; rect.width = 50; if (GUI.Button(rect, "Save")) { GenericMenu genericMenu = new GenericMenu(); BuildSingleAssetItemMenu(timelineLiteAsset, genericMenu); genericMenu.ShowAsContext(); } EditorGUI.EndDisabledGroup(); }); helpControl.Height = 30; _treeView.AddItem(helpControl); _treeView.AddItem(ToolboxTreeViewItem.GetSeparator(2)); // 创建轨道按钮 ToolboxTreeViewItem editorControl = ToolboxTreeViewItem.GetItem((rect, item) => { #if UNITY_2018_1_OR_NEWER TimelineLiteAsset timelineLiteAsset = TimelineEditor.inspectedAsset as TimelineLiteAsset; #else TimelineLiteAsset timelineLiteAsset = TimelineEditor.timelineAsset as TimelineLiteAsset; #endif rect.width = 30; EditorGUI.BeginDisabledGroup(timelineLiteAsset == null); if (GUI.Button(rect, createTrackIcon)) { trackTypeMenu.ShowAsContext(); } EditorGUI.EndDisabledGroup(); }); editorControl.Height = 30; _treeView.AddItem(editorControl); // 播放进度控制条和播放按钮 ToolboxTreeViewItem progressControl = ToolboxTreeViewItem.GetItem((rect, item) => { #if UNITY_2018_1_OR_NEWER TimelineLiteAsset timelineLiteAsset = TimelineEditor.inspectedAsset as TimelineLiteAsset; #else TimelineLiteAsset timelineLiteAsset = TimelineEditor.timelineAsset as TimelineLiteAsset; #endif GUI.Box(rect, ""); rect.height = 25; bool hasPlayable = Playable != null; bool hasTimeline = hasPlayable && Playable.Timeline != null; bool disable = !hasPlayable || !hasTimeline; bool inspectorTimelineLite = timelineLiteAsset != null; if (!EditorApplication.isPlaying) { // 非播放状态下只用来调整指针 EditorGUI.BeginDisabledGroup(!inspectorTimelineLite); int frameCount = inspectorTimelineLite ? (int)timelineLiteAsset.GetFrameCount() : 0; int currentFrame = Mathf.Clamp(inspectorTimelineLite ? indicatorFrame : 0, 0, frameCount); IndicatorFrame = TimelineLiteUtility.ConvertToFrameIndex(EditorGUIExtension.ProgressBar(rect, currentFrame, 0, frameCount, currentFrame + "/" + frameCount, true)); EditorGUI.EndDisabledGroup(); } else { // 播放状态下可用来调整动画进度 EditorGUI.BeginDisabledGroup(!hasPlayable || playable.PlayStatus == PlayStatus.Stopped); int frameCount = hasTimeline ? Playable.Timeline.FrameCount : 0; int currentFrame = hasTimeline ? Playable.CurrentFrame : 0; IndicatorFrame = TimelineLiteUtility.ConvertToFrameIndex(EditorGUIExtension.ProgressBar(rect, currentFrame, 0, frameCount, currentFrame + "/" + frameCount, true)); if (indicatorFrame != currentFrame) { Playable.Pause(); Playable.SetFrame(indicatorFrame); } EditorGUI.EndDisabledGroup(); } rect.y += 30; rect.height = 15; rect.x = 0; rect.width = rect.width / 4; if (EditorApplication.isPlaying) { // 上一帧按钮 EditorGUI.BeginDisabledGroup(!hasPlayable || playable.PlayStatus != PlayStatus.Pausing); if (GUI.Button(rect, EditorGUIUtility.IconContent("Animation.PrevKey"), (GUIStyle)"MiniToolbarButton")) { playable.SetFrame(playable.CurrentFrame - 1); } EditorGUI.EndDisabledGroup(); } else { // 非播放状态下 EditorGUI.BeginDisabledGroup(!inspectorTimelineLite); if (GUI.Button(rect, EditorGUIUtility.IconContent("Animation.PrevKey"), (GUIStyle)"MiniToolbarButton")) { int frameCount = inspectorTimelineLite ? (int)timelineLiteAsset.GetFrameCount() : 0; indicatorFrame = Mathf.Clamp(--indicatorFrame, 0, frameCount); } EditorGUI.EndDisabledGroup(); } EditorGUI.BeginDisabledGroup(!EditorApplication.isPlaying); rect.x += rect.width; if (hasPlayable) { switch (playable.PlayStatus) { case PlayStatus.Playing: if (GUI.Button(rect, EditorGUIUtility.IconContent("PauseButton"), (GUIStyle)"MiniToolbarButton")) { playable.Pause(); } break; case PlayStatus.Pausing: if (GUI.Button(rect, EditorGUIUtility.IconContent("PlayButton"), (GUIStyle)"MiniToolbarButton")) { playable.Resume(); } break; case PlayStatus.Stopped: if (playable.Timeline != null) { if (GUI.Button(rect, EditorGUIUtility.IconContent("PlayButton"), (GUIStyle)"MiniToolbarButton")) { playable.Play(); } } else { EditorGUI.BeginDisabledGroup(!inspectorTimelineLite); if (GUI.Button(rect, EditorGUIUtility.IconContent("PlayButton"), (GUIStyle)"MiniToolbarButton")) { TimelineLiteObjectData data = timelineLiteAsset.Extract(); ITimelineLiteObject timelineLiteObject = Activator.CreateInstance(timelineLiteAsset.TargetObjectType, data) as ITimelineLiteObject; Playable.Play(timelineLiteObject); } EditorGUI.EndDisabledGroup(); } break; } } else { GUI.Button(rect, EditorGUIUtility.IconContent("PlayButton"), (GUIStyle)"MiniToolbarButton"); } EditorGUI.EndDisabledGroup(); // 下一帧按钮 rect.x += rect.width; if (EditorApplication.isPlaying) { EditorGUI.BeginDisabledGroup(!hasPlayable || playable.PlayStatus != PlayStatus.Pausing); if (GUI.Button(rect, EditorGUIUtility.IconContent("Animation.NextKey"), (GUIStyle)"MiniToolbarButton")) { playable.SetFrame(playable.CurrentFrame + 1); } EditorGUI.EndDisabledGroup(); } else { EditorGUI.BeginDisabledGroup(!inspectorTimelineLite); if (GUI.Button(rect, EditorGUIUtility.IconContent("Animation.NextKey"), (GUIStyle)"MiniToolbarButton")) { int currentFrame = inspectorTimelineLite ? indicatorFrame : 0; int frameCount = inspectorTimelineLite ? (int)timelineLiteAsset.GetFrameCount() : 0; indicatorFrame = Mathf.Clamp(++indicatorFrame, currentFrame, frameCount); } EditorGUI.EndDisabledGroup(); } rect.x += rect.width; EditorGUI.BeginDisabledGroup(!hasPlayable || (playable.PlayStatus == PlayStatus.Stopped && playable.Timeline == null)); if (GUI.Button(rect, EditorGUIUtility.IconContent("PreMatQuad"), (GUIStyle)"MiniToolbarButton")) { playable.Play <ITimelineLiteObject>(null); } EditorGUI.EndDisabledGroup(); }); progressControl.Height = 50; _treeView.AddItem(progressControl); }