Предоставляет ассет, назначающий кривые анимации анимируемым свойствам.
The Animation компонент и Animator компонент использует AnimationClip ассет для анимации GameObject and Component properties.
Supported Animatable Types
Когда вы создаёте AnimationClip ассет с Animation компонент, вам необходимо задать legacy в true. Используйте Animation компонент, чтобы анимировать следующие открытые или сериализуемые свойства GameObject or Component:
- значения float
- логические значения (приведённые к float)
- целочисленные значения (приведённые к float)
- дискретные целочисленные значения (с помощью атрибута DiscreteEvaluationAttribute и переинтерпретируется как float)
For legacy клипов используйте метод SetCurve, чтобы назначать новые кривые и в редакторе, и во время выполнения.
Когда вы создаёте AnimationClip ассет для Animator компонент, вы можете анимировать следующие открытые или сериализуемые свойства:
- значения float
- логические значения (приведённые к float)
- целочисленные значения (приведённые к float)
- дискретные целочисленные значения (используйте DiscreteEvaluationAttribute атрибут, интерпретированный как float)
- Значения ссылок на объекты (сохраняются как ObjectReferenceKeyframe)
Создание кривой
В редакторе рекомендуется использовать AnimationUtility.SetEditorCurve and AnimationUtility.SetEditorCurves методы, чтобы назначить один или несколько AnimationCurve объекты для каждого свойства типа float и для каждого логического, целочисленного или дискретного целочисленного значения, представленного как float.
И в редакторе, и во время выполнения метод SetCurve позволяет назначить AnimationCurve к клипу анимации. Клип анимации можно изменять и во время выполнения, но такое изменение распознаёт только Animation component. The Animator компоненту требуется, чтобы клипы были скомпилированы в оптимизированное представление, а такая компиляция во время выполнения недоступна.
Use the AnimationUtility.SetObjectReferenceCurve and AnimationUtility.SetObjectReferenceCurves методы, чтобы создать и назначить новые ObjectReferenceKeyframe массивы свойств-ссылок на объекты. Note: Это поддерживается только Animator component.
Запрос к кривой
Use the AnimationUtility.GetEditorCurve метод, чтобы получить AnimationCurve для свойства типа float.
Use the AnimationUtility.GetObjectReferenceCurve метод, чтобы получить ObjectReferenceKeyframe массив для свойства-ссылки на объект. Note: Это поддерживается только Animator component.
Управление событиями анимации
В редакторе используйте AnimationUtility.SetAnimationEvents метод, чтобы задать или заменить AnimationEvent массив для AnimationClip.
Use the AnimationUtility.GetAnimationEvents метод, чтобы получить AnimationEvent массив из AnimationClip.
Дополнительные ресурсы: Animation Animator AnimationCurve ObjectReferenceKeyframe AnimationEvent
// Create a new MonoBehaviour in your project and paste in the following code.
using UnityEngine;
// The example creates a new MonoBehaviour that is used alongside a Camera component.
// At runtime, the component will create a procedural clip to animate the Camera field of view
// property and automatically play that clip on an Animation component.
[RequireComponent(typeof(Camera))]
public class ProceduralFieldOfViewAnimation : MonoBehaviour
{
void OnEnable()
{
AnimationClip clip = new AnimationClip();
AnimationCurve curve = AnimationCurve.Linear(0.0f, 60.0f, 10.0f, 90.0f);
clip.SetCurve("", typeof(Camera), "field of view", curve);
clip.legacy = true;
if (!TryGetComponent<Animation>(out var animation))
animation = gameObject.AddComponent<Animation>();
animation.AddClip(clip, "animfov");
animation.Play("animfov");
}
}
using UnityEditor;
using UnityEngine;
static class AnimationClipWithAnimationCurvesExample
{
// This example creates an AnimationClip with a single frame that captures the pose of a GameObject hierarchy.
// The clip is saved as an asset in the project.
[MenuItem("Example/Create Animation Clip Pose From GameObject")]
static void CreateAnimationClipPoseFromGameObject()
{
var selectedGameObject = Selection.activeGameObject;
if (selectedGameObject == null)
{
Debug.LogError("Please select a GameObject to create a clip for.");
return;
}
AnimationClip clip = new AnimationClip();
var transforms = selectedGameObject.GetComponentsInChildren<Transform>();
var numberOfCurves = transforms.Length * 10; // 3 for position, 4 for rotation, 3 for scale
var bindings = new EditorCurveBinding[numberOfCurves];
var curves = new AnimationCurve[numberOfCurves];
for (int i = 0; i < transforms.Length; ++i)
{
var startIndex = i * 10;
var transform = transforms[i];
var path = AnimationUtility.CalculateTransformPath(transform, selectedGameObject.transform);
var index = startIndex;
bindings[index++] = EditorCurveBinding.FloatCurve(path, typeof(Transform), "m_LocalPosition.x");
bindings[index++] = EditorCurveBinding.FloatCurve(path, typeof(Transform), "m_LocalPosition.y");
bindings[index++] = EditorCurveBinding.FloatCurve(path, typeof(Transform), "m_LocalPosition.z");
bindings[index++] = EditorCurveBinding.FloatCurve(path, typeof(Transform), "m_LocalRotation.x");
bindings[index++] = EditorCurveBinding.FloatCurve(path, typeof(Transform), "m_LocalRotation.y");
bindings[index++] = EditorCurveBinding.FloatCurve(path, typeof(Transform), "m_LocalRotation.z");
bindings[index++] = EditorCurveBinding.FloatCurve(path, typeof(Transform), "m_LocalRotation.w");
bindings[index++] = EditorCurveBinding.FloatCurve(path, typeof(Transform), "m_LocalScale.x");
bindings[index++] = EditorCurveBinding.FloatCurve(path, typeof(Transform), "m_LocalScale.y");
bindings[index] = EditorCurveBinding.FloatCurve(path, typeof(Transform), "m_LocalScale.z");
transform.GetLocalPositionAndRotation(out var localPosition, out var localRotation);
var localScale = transform.localScale;
index = startIndex;
curves[index++] = AnimationCurve.Constant(0f, 1f, localPosition.x);
curves[index++] = AnimationCurve.Constant(0f, 1f, localPosition.y);
curves[index++] = AnimationCurve.Constant(0f, 1f, localPosition.z);
curves[index++] = AnimationCurve.Constant(0f, 1f, localRotation.x);
curves[index++] = AnimationCurve.Constant(0f, 1f, localRotation.y);
curves[index++] = AnimationCurve.Constant(0f, 1f, localRotation.z);
curves[index++] = AnimationCurve.Constant(0f, 1f, localRotation.w);
curves[index++] = AnimationCurve.Constant(0f, 1f, localScale.x);
curves[index++] = AnimationCurve.Constant(0f, 1f, localScale.y);
curves[index] = AnimationCurve.Constant(0f, 1f, localScale.z);
}
AnimationUtility.SetEditorCurves(clip, bindings, curves);
AssetDatabase.CreateAsset(clip, AssetDatabase.GenerateUniqueAssetPath($"Assets/{selectedGameObject.name}-Pose.anim"));
}
}
using UnityEditor;
using UnityEngine;
static class AnimationClipWithObjectReferenceKeyframesExample
{
// This example creates an AnimationClip of a sequence of sprites selected
// in the project view. The clip is saved as an asset in the project.
[MenuItem("Example/Create Flip Book Animation Clip From Sprites")]
static void CreateFlipBookAnimationClipFromSprites()
{
var selectedSprites = Selection.GetFiltered<Sprite>(SelectionMode.Unfiltered);
if (selectedSprites == null || selectedSprites.Length == 0)
{
Debug.LogError("Please select sprites in the project view to create a clip for.");
return;
}
AnimationClip clip = new AnimationClip();
var spriteCurve = new ObjectReferenceKeyframe[selectedSprites.Length];
for (int i = 0; i < selectedSprites.Length; ++i)
{
var sprite = selectedSprites[i];
spriteCurve[i] = new ObjectReferenceKeyframe
{
time = i/clip.frameRate,
value = sprite
};
}
var spriteBinding = EditorCurveBinding.PPtrCurve("", typeof(SpriteRenderer), "m_Sprite");
AnimationUtility.SetObjectReferenceCurve(clip, spriteBinding, spriteCurve);
AssetDatabase.CreateAsset(clip, AssetDatabase.GenerateUniqueAssetPath($"Assets/FlipBookClip.anim"));
}
}