public static void ShowActionInTrackMenu(NodeTrackCategory category, Action <ActionNode> callback) { if (sm_ActionInTrackTypeDic == null) { sm_ActionInTrackTypeDic = new Dictionary <NodeTrackCategory, Type[]>(); for (int i = (int)NodeTrackCategory.None + 1; i < (int)NodeTrackCategory.Max; ++i) { NodeTrackCategory ntCategory = (NodeTrackCategory)i; sm_ActionInTrackTypeDic.Add(ntCategory, GetActionInTrackTypes(ntCategory)); } } GenericMenu menu = new GenericMenu(); if (sm_ActionInTrackTypeDic.TryGetValue(category, out var types) && types.Length > 0) { foreach (var type in types) { var menuAttrs = type.GetCustomAttributes(typeof(NodeMenuAttribute), false); if (menuAttrs != null && menuAttrs.Length > 0) { var menuAttr = (NodeMenuAttribute)menuAttrs[0]; string itemName = string.IsNullOrEmpty(menuAttr.Prefix) ? menuAttr.Name : $"{menuAttr.Prefix}/{menuAttr.Name}"; menu.AddItem(new GUIContent(itemName), false, () => { callback?.Invoke((ActionNode)Activator.CreateInstance(type)); }); } } } menu.ShowAsContext(); }
private static Type[] GetActionInTrackTypes(NodeTrackCategory category) { return((from type in sm_NodeTypes where type.IsSubclassOf(typeof(ActionNode)) let attrs = type.GetCustomAttributes(typeof(NodeTrackAttribute), false) where attrs != null && attrs.Length > 0 let attr = (NodeTrackAttribute)attrs[0] where attr.Category == category select type).ToArray()); }
public NodeTrackAttribute(NodeTrackCategory category) { Category = category; }