AnimationMode 由 AnimationWindow 用于存储 AnimationClip 播放修改的属性。
退出 AnimationMode 时,所有属性将恢复到其默认状态。动画属性也会在检查器中突出显示。使用 StartAnimationMode 进入动画模式。在动画模式下,编辑器会呈现淡色调以显示它正在进行动画处理。可以通过 SampleAnimationClip 对属性进行动画处理。
以下脚本示例演示了如何对游戏对象进行动画处理。 AnimationMode 提供了支持此功能的函数。演示可以从“示例/AnimationMode 演示”菜单启动。此演示启动后,需要在场景窗口中选择一个游戏对象。(此示例要求游戏不在游戏视图中运行。)选择游戏对象后,示例窗口将发生变化。为所选游戏对象选择一个创建的动画剪辑。加载动画剪辑后,可以将动画应用于游戏对象。单击“动画”按钮会在窗口中添加一个滑块。使用滑块会将动画应用于所选游戏对象。“锁定”按钮可防止将动画应用于其他游戏对象。
using UnityEngine; using UnityEditor;
public class ExampleClass : EditorWindow { protected GameObject go; protected AnimationClip animationClip; protected float time = 0.0f; protected bool lockSelection = false; protected bool animationMode = false;
[MenuItem("Examples/AnimationMode demo", false, 2000)] public static void DoWindow() { var window = GetWindowWithRect<ExampleClass>(new Rect(0, 0, 300, 80)); window.Show(); }
// Has a GameObject been selection? public void OnSelectionChange() { if (!lockSelection) { go = Selection.activeGameObject; Repaint(); } }
// Main editor window public void OnGUI() { // Wait for user to select a GameObject if (go == null) { EditorGUILayout.HelpBox("Please select a GameObject", MessageType.Info); return; }
// Animate and Lock buttons. Check if Animate has changed GUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); GUILayout.Toggle(AnimationMode.InAnimationMode(), "Animate"); if (EditorGUI.EndChangeCheck()) ToggleAnimationMode();
GUILayout.FlexibleSpace(); lockSelection = GUILayout.Toggle(lockSelection, "Lock"); GUILayout.EndHorizontal();
// Slider to use when Animate has been ticked EditorGUILayout.BeginVertical(); animationClip = EditorGUILayout.ObjectField(animationClip, typeof(AnimationClip), false) as AnimationClip; if (animationClip != null) { float startTime = 0.0f; float stopTime = animationClip.length; time = EditorGUILayout.Slider(time, startTime, stopTime); } else if (AnimationMode.InAnimationMode()) AnimationMode.StopAnimationMode(); EditorGUILayout.EndVertical(); }
void Update() { if (go == null) return;
if (animationClip == null) return;
// Animate the GameObject if (!EditorApplication.isPlaying && AnimationMode.InAnimationMode()) { AnimationMode.BeginSampling(); AnimationMode.SampleAnimationClip(go, animationClip, time); AnimationMode.EndSampling();
SceneView.RepaintAll(); } }
void ToggleAnimationMode() { if (AnimationMode.InAnimationMode()) AnimationMode.StopAnimationMode(); else AnimationMode.StartAnimationMode(); } }
animatedPropertyColor | 用于显示属性当前正在进行动画处理的颜色。 |
candidatePropertyColor | 用于显示已修改的动画属性的颜色。 |
recordedPropertyColor | 用于显示动画属性自动记录动画剪辑中更改的颜色。 |
AddEditorCurveBinding | 将由 EditorCurveBinding 定义的属性标记为当前正在进行动画处理。 |
AddPropertyModification | 将属性标记为当前正在进行动画处理。 |
BeginSampling | 初始化动画剪辑采样的开始。 |
EndSampling | 完成动画剪辑的采样。 |
InAnimationMode | 检查编辑器是否处于动画模式。 |
IsPropertyAnimated | 检查指定的属性是否处于动画模式并正在进行动画处理。 |
SampleAnimationClip | 为游戏对象采样 AnimationClip,并在动画模式下记录修改的属性。 |
SamplePlayableGraph | 采样 PlayableGraph 的指定输出索引,并在动画模式下记录修改的属性。 |
StartAnimationMode | 启动动画模式。 |
StopAnimationMode | 停止动画模式并恢复在动画模式下进行动画处理的任何属性。 |