コード例 #1
0
        private static AnimationWindowEventData GetData(AnimationWindowEvent[] awEvents)
        {
            var data = new AnimationWindowEventData();
            if (awEvents.Length == 0)
                return data;

            AnimationWindowEvent firstAwEvent = awEvents[0];
            data.root = firstAwEvent.root;
            data.clip = firstAwEvent.clip;
            data.clipInfo = firstAwEvent.clipInfo;

            if (data.clip != null)
                data.events = AnimationUtility.GetAnimationEvents(data.clip);
            else if (data.clipInfo != null)
                data.events = data.clipInfo.GetEvents();

            if (data.events != null)
            {
                List<AnimationEvent> selectedEvents = new List<AnimationEvent>();
                foreach (var awEvent in awEvents)
                {
                    if (awEvent.eventIndex >= 0 && awEvent.eventIndex < data.events.Length)
                        selectedEvents.Add(data.events[awEvent.eventIndex]);
                }

                data.selectedEvents = selectedEvents.ToArray();
            }

            return data;
        }
コード例 #2
0
        private static void SetData(AnimationWindowEvent[] awEvents, AnimationWindowEventData data)
        {
            if (data.events == null)
                return;

            if (data.clip != null)
            {
                Undo.RegisterCompleteObjectUndo(data.clip, "Animation Event Change");
                AnimationUtility.SetAnimationEvents(data.clip, data.events);
            }
            else if (data.clipInfo != null)
            {
                foreach (var awEvent in awEvents)
                {
                    if (awEvent.eventIndex >= 0 && awEvent.eventIndex < data.events.Length)
                        data.clipInfo.SetEvent(awEvent.eventIndex, data.events[awEvent.eventIndex]);
                }
            }
        }
コード例 #3
0
        static void ResetValues(MenuCommand command)
        {
            AnimationWindowEvent awEvent = command.context as AnimationWindowEvent;
            AnimationWindowEvent[] awEvents = new AnimationWindowEvent[] {awEvent};

            AnimationWindowEventData data = GetData(awEvents);
            if (data.events == null || data.selectedEvents == null || data.selectedEvents.Length == 0)
                return;

            foreach (var evt in data.selectedEvents)
            {
                evt.functionName = "";
                evt.stringParameter = string.Empty;
                evt.floatParameter = 0f;
                evt.intParameter = 0;
                evt.objectReferenceParameter = null;
            }

            SetData(awEvents, data);
        }
コード例 #4
0
        public static void OnEditAnimationEvents(AnimationWindowEvent[] awEvents)
        {
            AnimationWindowEventData data = GetData(awEvents);

            if (data.events == null || data.selectedEvents == null || data.selectedEvents.Length == 0)
            {
                return;
            }

            AnimationEvent firstEvent = data.selectedEvents[0];

            bool singleFunctionName = Array.TrueForAll(data.selectedEvents, evt => evt.functionName == firstEvent.functionName);

            GUI.changed = false;

            if (data.root != null)
            {
                List <AnimationWindowEventMethod> methods = new List <AnimationWindowEventMethod>();
                HashSet <string> overloads = new HashSet <string>();
                CollectSupportedMethods(data.root, methods, overloads);

                var methodsFormatted = new List <string>(methods.Count);

                for (int i = 0; i < methods.Count; ++i)
                {
                    AnimationWindowEventMethod method = methods[i];

                    string postFix = " ( )";
                    if (method.parameterType != null)
                    {
                        if (method.parameterType == typeof(float))
                        {
                            postFix = " ( float )";
                        }
                        else if (method.parameterType == typeof(int))
                        {
                            postFix = " ( int )";
                        }
                        else
                        {
                            postFix = string.Format(" ( {0} )", method.parameterType.Name);
                        }
                    }

                    methodsFormatted.Add(method.name + postFix);
                }

                int notSupportedIndex = methods.Count;
                int selected          = methods.FindIndex(method => method.name == firstEvent.functionName);
                if (selected == -1)
                {
                    selected = methods.Count;

                    AnimationWindowEventMethod newMethod = new AnimationWindowEventMethod();
                    newMethod.name          = firstEvent.functionName;
                    newMethod.parameterType = null;

                    methods.Add(newMethod);

                    if (string.IsNullOrEmpty(firstEvent.functionName))
                    {
                        methodsFormatted.Add(kNoneSelected);
                    }
                    else
                    {
                        methodsFormatted.Add(firstEvent.functionName + kNotSupportedPostFix);
                    }
                }

                EditorGUIUtility.labelWidth = 130;

                EditorGUI.showMixedValue = !singleFunctionName;
                int wasSelected = singleFunctionName ? selected : -1;
                selected = EditorGUILayout.Popup("Function: ", selected, methodsFormatted.ToArray());
                if (wasSelected != selected && selected != -1 && selected != notSupportedIndex)
                {
                    foreach (var evt in data.selectedEvents)
                    {
                        evt.functionName    = methods[selected].name;
                        evt.stringParameter = string.Empty;
                    }
                }
                EditorGUI.showMixedValue = false;

                var selectedParameter = methods[selected].parameterType;

                if (singleFunctionName && selectedParameter != null)
                {
                    EditorGUILayout.Space();
                    if (selectedParameter == typeof(AnimationEvent))
                    {
                        EditorGUILayout.PrefixLabel("Event Data");
                    }
                    else
                    {
                        EditorGUILayout.PrefixLabel("Parameters");
                    }

                    DoEditRegularParameters(data.selectedEvents, selectedParameter);
                }

                if (overloads.Count > 0)
                {
                    EditorGUILayout.Space();
                    EditorGUILayout.HelpBox(s_OverloadWarning.text, MessageType.Warning, true);
                }
            }
            else
            {
                EditorGUI.showMixedValue = !singleFunctionName;
                string oldFunctionName = singleFunctionName ? firstEvent.functionName : "";
                string functionName    = EditorGUILayout.TextField(EditorGUIUtility.TrTextContent("Function"), oldFunctionName);
                if (functionName != oldFunctionName)
                {
                    foreach (var evt in data.selectedEvents)
                    {
                        evt.functionName    = functionName;
                        evt.stringParameter = string.Empty;
                    }
                }
                EditorGUI.showMixedValue = false;

                if (singleFunctionName)
                {
                    DoEditRegularParameters(data.selectedEvents, typeof(AnimationEvent));
                }
                else
                {
                    using (new EditorGUI.DisabledScope(true))
                    {
                        AnimationEvent dummyEvent = new AnimationEvent();
                        DoEditRegularParameters(new AnimationEvent[] { dummyEvent }, typeof(AnimationEvent));
                    }
                }
            }

            if (GUI.changed)
            {
                SetData(awEvents, data);
            }
        }