Unity 6.3
0 онлайн 63 гостей 3 в системе
Вход

Animator

класс в UnityEngine

Наследуется от:Behaviour

Выполнено в:UnityEngine.AnimationModule

Описание

Управляет, контролирует и оценивает анимацию GameObject.

Animator является главным Component в системе анимации Mecanim. Animator оценивает Animation Клипы и управляет Animator Состояниями в Animator Машинах Состояний.

Управление Animator с помощью AnimatorController

Как правило, вы настраиваете Animator с ассетом AnimatorController. Этот ассет определяет, какая анимация будет воспроизводиться. Чтобы узнать, как создать AnimatorController, ознакомьтесь с Animator Контроллер. После настройки с помощью AnimatorController, вы можете влиять на поток машины состояний следующими методами:

Для более сложных случаев использования, вы можете управлять Animator с помощью Игровые API.

Animator исполнение

По умолчанию, Animator оценивает каждый кадр, следуя за Time.deltaTime. На кадре, где ни один из парных Renderers не видим, Animator только обновляет позицию корня GameObject. Никакие другие преобразования или свойства компонентов не обновляются. Чтобы изменить это поведение по умолчанию, используйте один из следующих методов:

  • Используйте Animator.updateMode для выбора способа обновления Animator.
  • Используйте Animator.cullingMode для выбора того, что Animator обновляет, когда ни один из соответствующих Рендереров не виден.
  • Используйте Animator.Update для немедленной оценки Animator. Это независимо от режима обновления.

Root Motion

Root Motion относится к кумулятивному смещению иерархии GameObject. Дополнительные сведения см. Как работает Root Motion.

Когда Animator.applyRootMotion если true, то Animator выполняет следующие действия на каждом кадре:

— Автоматически вычисляет смещение корневого сустава для кадра. — Добавляет это смещение к позиции и повороту GameObject с компонентом Animator. О том, как переопределить это поведение, см. Скрипт Root Motion.

Генерическая и гуманоидная анимация

Animator оценивает два типа Animation Clips: Генерический и Гуманитарный.

Общий клип анимации содержит несколько кривых анимации, где каждая кривая анимирует свойство либо Transform или а MonoBehaviour. Общий клип создан для и анимации конкретного GameObject иерархии. Если вы попытаетесь использовать общий клип на другом GameObject иерархии, он может не воспроизводиться, как ожидалось.

Гуманоидный анимационный клип предназначен для человека или человеческого бипеда GameObject Использовать Гуманоидный зажим на двухногих животных, GameObject иерархии, вы должны настроить Animator с Гуманоидный Аватар.

Вы можете повторно использовать один и тот же клип Гуманоида на любом Animator, настроенном с Гуманоидом Avatar Однако, это увеличивает использование CPU. Ожидайте увеличения времени, затрачиваемого на анимацию иерархии GameObject на 15-20 процентов при оценке Гуманоида AnimationClips.

Чтобы определить, стоит ли преимущества использования Humanoid клипы стоимость в CPU peformance, выполните свои собственные эксперименты на ваших целевых платформах.

Рекомендуется использовать исключительно Humanoid клипы или Generic клипы.

Обратная кинематика

В классе Animator есть методы обратной кинематики, с помощью которых можно настроить динамическое взаимодействие гуманоида с объектами сцены. См. Обратная кинематика для шагов и примера.

SetTarget

Когда вы хотите, чтобы персонаж взаимодействовал с объектом, который слишком далеко, чтобы достичь с обратной кинематической, используйте Animator.SetTarget для корректировки положения и вращения персонажа со временем для обеспечения того, чтобы его рука или нога достигали объекта.

Обязательства и исполнение

Чтобы отслеживать свойства, в которые должен писать Animator, компонент Animator строит внутренний набор привязок. Каждая привязка строится из EditorCurveBinding каждого AnimationClip связанные с Animator через ассеты и пользовательские графики.

Из этого набора привязок Animator строит внутренний AnimationStream определяет размер буферных зон, которые должны выделяться для AnimationClip оценка.

После того, как Animator выделит свои буферы, он итерирует каждую привязку и ищет соответствующую Component в соответствующих GameObject Animator сохраняет ссылку на каждую привязку, так что она может быть записана в последующих кадрах.

Эта операция называется Перепривязка и может быть вызвана различными событиями:

Избегайте и минимизируйте операцию перегруппировки

Используйте следующие стратегии, чтобы избежать и минимизировать операцию перегруппировки:

  • Ассет AnimatorController уже оптимизирован для создания известного набора привязок во время редактирования. Операция Rebind, вызванная изменениями в Animator.runtimeAnimatorController, должна только связать свойства AnimationStream с объектами сцены. Если вам нужно изменить AnimationClips, которые Animator оценивает во время выполнения, то переключение на новый ассет AnimatorController — стратегия, при которой Rebind обойдётся дешевле всего. Учтите, что при этом состояние машины состояний сбрасывается к состояниям по умолчанию нового AnimatorController.
  • Приоритет предварительно построенных AnimatorOverrideControllers построенных динамически. Чтобы менять клипы во время выполнения, не сбрасывая состояние машины состояний, используйте ассет Animator Override Controller. Если вы применяете Animator Override Controller, созданный на этапе редактирования, операция Rebind обходится так же дорого, как изменение AnimatorController. Если вы динамически строите AnimatorController во время выполнения, операция Rebind повторяется над каждым клипом в AnimatorOverrideController потому что связи неизвестны.
  • PlayableGraphs выполняют операцию Rebind после каждого изменения графа, и большие графы имеют значительную стоимость Rebind. Существует две стратегии оптимизации, которые вы можете применить: либо поддерживать небольшой граф и обновлять его по мере необходимости, либо построить большой граф и избегать изменений, насколько это возможно. Производительность зависит от сложности как ваших клипов, так и вашего графа; экспериментируйте, чтобы определить, какая стратегия лучше подходит для вашего случая использования.
  • Если вы отключите GameObject для целей пулирования, Animator выполняет операцию Rebind, когда GameObject активируется снова. Это может отменить производительность, полученную путем пулирования. Рекомендуется отключить компоненты на GameObject вместо того, чтобы отключить GameObject сам. Когда вы отключаете Animator, вычисления приостанавливаются, но внутреннее состояние сохраняется.
  • Когда вы добавляете новый GameObject в иерархию, связанную с Компонент Animator, вы должны вручную вызвать Animator.Rebind, чтобы Animator распознал и мог записать в новый GameObject. Если вы добавляете много новых GameObjects, рекомендуется добавить GameObjects сначала и вызвать Animator.Rebind один раз, вместо многократного вызова этого метода.

Значения по умолчанию

Можно настроить состояния для записи значений по умолчанию в AnimatorController. Когда включён AnimatorState.writeDefaultValues и вычисляется AnimatorState, Animator записывает значения по умолчанию для свойств, которые не анимируются Animation Clip данного состояния.

Эти значения по умолчанию собираются из сцены при первой инициализации Animator и после каждого завершения операции Rebind. Если Rebind выполняется во время вычисления, Animator сохраняет текущее состояние свойств сцены как новые значения по умолчанию. Это может привести к ошибочным результатам, поскольку новые значения могут оказаться произвольными.

Если требуется выполнить Rebind, а некоторые состояния в AnimatorController зависят от значений по умолчанию, используйте Animator.writeDefaultValuesOnDisable, чтобы Animator восстановил исходные значения всех анимируемых свойств. Так значения по умолчанию остаются согласованными на протяжении всего времени существования компонента Animator.

Однако запись значений по умолчанию обратно в сцену также снижает производительность. При проблемах с производительностью постарайтесь не зависеть от значений по умолчанию или избегайте операции Rebind.

Значения по умолчанию анимируемых свойств также можно восстановить вручную с помощью Animator.WriteDefaultValues.

Система записи

Animator содержит систему записи, с помощью которой можно записывать и воспроизводить до десяти тысяч кадров анимируемых свойств. Подробнее см. Animator.StartRecording и Animator.StartPlayback.

Другие аспекты производительности

Система анимации Mecanim сложна, и принимаемые решения могут повлиять на производительность игры. Ниже перечислены аспекты, которые следует учитывать при проектировании игры:

  • Операция Rebind ресурсоемка и может привести к пикам CPU. Используйте одну операцию AnimatorController и избегайте операций Rebind, насколько это возможно. Это обычно приводит к более стабильной производительности.
  • Когда вы используете AnimatorController, Unity вычисляет каждую несинхронизированную машину состояний в каждом кадре. Это касается и слоёв с нулевым весом. Ради производительности избегайте неиспользуемых слоёв AnimatorController.
  • Система Mecanim Animation оценивает и обновляет Компоненты Animator с помощью параллельного выполнения, которое разделяет рабочую нагрузку между несколькими ядрами CPU. Когда вы используете Animator.Update для ручной оценки Компонента Animator, Mecanim не использует параллельное выполнение. Чтобы вручную контролировать выполнение и воспользоваться преимуществами параллельной оценки, объедините несколько Аниматоров в PlayableGraph и вручную обновите PlayableGraph. Это использует преимущества параллельного выполнения, сохраняя при этом ручной контроль.
  • Система Transform Unity позволяет только одному потоку записывать в иерархию Transform (Корень GameObject и его дочерние). Если вы группируете несколько Аниматоров под одним корнем GameObject, это не позволяет Mecanim использовать преимущества многопоточности при параллельном обновлении Transforms и может привести к снижению производительности. Рекомендуется избегать группировки Аниматоров в иерархии GameObjects, если только это не необходимо для родительских целей.
  • StateMachineBehaviour вносят несколько точек синхронизации с основным потоком. В некоторых случаях обратные вызовы могут помешать параллельному вычислению нескольких машин состояний. Чтобы этого избежать, используйте StateMachineBehaviour осторожно.
  • Чтобы сохранить детерминизм, Animator записывает каждое анимированное свойство в каждом кадре независимо от того, изменилось ли значение свойства. Это может вызвать известные проблемы производительности при анимации компонентов RectTransform. Чтобы избежать этих проблем, используйте Компонент Animation для анимации RectTransform.
  • Поскольку AnimatorController — это машина состояний, она непрерывно оценивает необходимость переходов. Такая оценка происходит даже тогда, когда AnimatorController доходит до конца текущего состояния. Это значит, что простаивающий Animator потребляет ресурсы CPU. Для однокадровых анимаций и для GameObject, которые анимируются редко, используйте компонент Animation или Компонент Игровые API.
  • Гуманоидная система имеет накладные расходы на производительность. Чтобы избежать этих накладных расходов, используйте общие анимации, когда это возможно.```

Свойства

Свойство Описание
angularVelocityПолучает угловую скорость аватара для последнего оцениваемого кадра.
animatePhysicsПри включении, система физики использует анимационные преобразования из GameObjects с кинематическими Rigidbody компонентами для воздействия на другие GameObjects.
applyRootMotionСледует ли применять движение корня?
avatarПолучить/Установить текущий Аватар.
avatarRootВозвращает корень Аватара Transform.
bodyPositionПоложение центра масс тела.
bodyRotationВращение центра масс тела.
cullingModeКонтролирует удаление этого компонента Animator.
deltaPositionПолучает дельта-позицию аватара для последнего оцениваемого кадра.
deltaRotationПолучает дельту вращения аватара для последнего оцененного кадра.
feetPivotActiveСмешивает поворотную точку между центром массы тела и поворотом ног.
fireEventsЗадает, отправляет ли Animator события типа AnimationEvent.
gravityWeightТекущий вес гравитации, основанный на текущих анимациях, которые воспроизводятся.
hasBoundPlayablesВозвращает true, если Animator имеет какие-либо назначенные playables.
hasRootMotionВозвращает true, если текущая платформа имеет движение корня.
hasTransformHierarchyВозвращает true, если объект имеет иерархию преобразований.
humanScaleВозвращает масштаб текущего Аватара для гуманоидной установки (1 по умолчанию, если установка является общей).
isHumanВозвращает true, если текущая установка гуманоидна, false, если она общая.
isInitializedВозвращает информацию об успешной инициализации аниматора.
isMatchingTargetЕсли активировано автоматическое соответствие.
isOptimizableВозвращает true, если текущая платформа оптимизируется с помощью AnimatorUtility.OptimizeTransformHierarchy.
keepAnimatorStateOnDisableКонтролирует поведение компонента Animator, когда GameObject неактивен.
layerCountВозвращает количество слоев в контроллере.
layersAffectMassCenterДополнительные слои влияют на центр массы.
leftFeetBottomHeightПолучить левую ногу нижней высоты.
parameterCountВозвращает число параметров в контроллере.
parametersСписок AnimatorControllerParameter, используемый аниматором. (только для чтения)
pivotPositionПолучить текущее положение pivot.
pivotWeightПолучить вес поворота.
playableGraphPlayableGraph создан Animator.
playbackTimeЗадает позицию воспроизведения в буфере записи.
recorderModeПолучает режим записывающего устройства Animator.
recorderStartTimeВремя начала первого кадра буфера относительно кадра, на котором был вызван StartRecording.
recorderStopTimeВремя окончания записанного клипа относительно времени, когда был вызван StartRecording.
rightFeetBottomHeightПолучите правую высоту нижней ноги.
rootPositionПоложение корня, положение игрового объекта.
rootRotationВращение корня, вращение игрового объекта.
runtimeAnimatorControllerПредставление AnimatorController во время выполнения, которое управляет Animator.
speedСкорость воспроизведения Animator. 1 является обычной скоростью воспроизведения.
stabilizeFeetАвтоматическая стабилизация ног во время перехода и смешивания.
targetPositionВозвращает позицию объекта, указанного в SetTarget.
targetRotationВозвращает вращение объекта, указанного в SetTarget.
updateModeУказывает режим обновления Animator.
velocityПолучает скорость аватара для последнего оцениваемого кадра.
writeDefaultValuesOnDisableУказывает, будут ли воспроизводимые значения графа сброшены или сохранены при отключении Animator.

Открытые методы

Метод Описание
ApplyBuiltinRootMotionПрименить по умолчанию Root Motion.
CrossFadeСоздаёт переход из текущего состояния в любое другое состояние с использованием нормализованного времени.
CrossFadeInFixedTimeСоздаёт переход из текущего состояния в любое другое состояние с использованием времени в секундах.
GetAnimatorTransitionInfoВозвращает AnimatorTransitionInfo с информацией о текущем переходе.
GetBehaviourВозвращает первый StateMachineBehaviour, который соответствует типу T или производится из T. Возвращает null, если не найдено.
GetBehavioursВозвращает все StateMachineBehaviour, которые соответствуют типу T или являются производными от T. Возвращает null, если не найдено.
GetBoneTransformПолучает Transform, сопоставленный человеческой кости на основе ее id.
GetBoolВозвращает значение заданного логического параметра.
GetCurrentAnimatorClipInfoВозвращает массив всех AnimatorClipInfo в текущем состоянии заданного слоя.
GetCurrentAnimatorClipInfoCountВозвращает количество AnimatorClipInfo в текущем состоянии.
GetCurrentAnimatorStateInfoВозвращает AnimatorStateInfo со сведениями о текущем состоянии.
GetFloatВозвращает значение заданного параметра float.
GetIKHintPositionПолучает позицию подсказки IK.
GetIKHintPositionWeightПолучает вес перевода IK Hint (0 = в оригинальной анимации до IK, 1 = в подсказке).
GetIKPositionПолучает позицию цели IK.
GetIKPositionWeightПолучает трансляционный вес цели IK (0 = в первоначальной анимации до IK, 1 = в цели).
GetIKRotationПолучает вращение цели IK.
GetIKRotationWeightПолучает вес вращения цели IK (0 = вращение до IK, 1 = вращение на цели IK).
GetIntegerВозвращает значение заданного целочисленного параметра.
GetLayerIndexВозвращает индекс слоя анимации с указанным именем.
GetLayerNameВозвращает имя слоя.
GetLayerWeightВозвращает вес слоя при указанном индексе.
GetNextAnimatorClipInfoВозвращает массив всех AnimatorClipInfo в следующем состоянии заданного слоя.
GetNextAnimatorClipInfoCountВозвращает количество AnimatorClipInfo в следующем состоянии.
GetNextAnimatorStateInfoВозвращает AnimatorStateInfo со сведениями о следующем состоянии.
GetParameterПолучает ссылку на AnimatorControllerParameter в заданном индексе.
HasStateВозвращает true, если состояние существует в этом слое, и false в противном случае.
InterruptMatchTargetПрерывает автоматическое соответствие целей.
IsInTransitionВозвращает true, если на заданном слое имеется переход, false в противном случае.
IsParameterControlledByCurveВозвращает true, если параметр управляется кривой, false в противном случае.
MatchTargetАвтоматически регулируется положение и вращение GameObject.
PlayВоспроизводит состояние.
PlayInFixedTimeВоспроизводит состояние.
RebindПересвязать все анимированные свойства и данные сетки с Animator.
ResetControllerStateСброс параметра AnimatorController к значению по умолчанию.
ResetTriggerСброс значения заданного параметра триггера.
SetBoneLocalRotationУстанавливает локальное вращение человеческой кости во время прохождения IK.
SetBoolУстанавливает значение заданного логического параметра.
SetFloatПосылать значения с плавающей запятой в Animator для влияния на переходы.
SetIKHintPositionУстанавливает позицию подсказки IK.
SetIKHintPositionWeightЗадает вес перевода подсказки IK (0 = в оригинальной анимации до IK, 1 = в подсказке).
SetIKPositionЗадает позицию цели IK.
SetIKPositionWeightЗадает вес трансляции цели IK (0 = в первоначальной анимации до IK, 1 = в цели).
SetIKRotationЗадает вращение цели IK.
SetIKRotationWeightУстанавливает вес вращения цели IK (0 = вращение до IK, 1 = вращение на цели IK).
SetIntegerУстанавливает значение заданного параметра.
SetLayerWeightИзменяет толщину слоя при определенном индексе.
SetLookAtPositionУстанавливает вид персонажа во время анимации.
SetLookAtWeightУстановить взгляд на весы.
SetTargetЗадаёт AvatarTarget и targetNormalizedTime для текущего состояния.
SetTriggerУстанавливает значение заданного параметра триггера.
StartPlaybackУстанавливает аниматор в режим воспроизведения.
StartRecordingУстанавливает аниматор в режим записи и выделяет круговой буфер размером frameCount.
StopPlaybackОстановка режима воспроизведения аниматора. Когда воспроизведение останавливается, аватар возобновляет получение управления от игровой логики.
StopRecordingОстановка режима записи аниматора.
UpdateОценка аниматора на основе deltaTime.
WriteDefaultValuesПринуждает к записи значений по умолчанию, хранящихся в аниматоре.

Статические методы

Метод Описание
StringToHashСоздает параметр id из строки.
Унаследованные члены 4

Свойства

СвойствоОписание
enabledTrue, если это Поведение включено, в противном случае false.
isActiveAndEnabledПроверяет, включён ли компонент, прикреплен ли он к GameObject, который активен в иерархии, и вызван ли OnEnable компонента.
gameObjectGameObject, к которому прикреплен данный компонент. Компонент всегда прикрепляется к игровому объекту.
tagТег этого игрового объекта.
transformTransform прикреплен к этому GameObject.
transformHandleTransformHandle этого GameObject.
hideFlagsДолжен ли объект быть скрытым, сохраняться с Scene или изменяться пользователем?
nameИмя объекта.

Открытые методы

МетодОписание
BroadcastMessageВызывает метод с именем methodName на каждом MonoBehaviour в этом игровом объекте или любом из его дочерей.
CompareTagПроверяет тег GameObject на соответствие определенному тегу.
GetComponentПолучает ссылку на компонент типа T на том же GameObject, что и указанный компонент.
GetComponentInChildrenПолучает ссылку на компонент типа T на том же GameObject, что и указанный компонент, или на любого ребенка GameObject.
GetComponentIndexПолучает индекс компонента на его родительском GameObject.
GetComponentInParentПолучает ссылку на компонент типа T на том же GameObject, что и указанный компонент, или на любой родитель GameObject.
GetComponentsПолучает ссылки на все компоненты типа T на том же GameObject, что и указанный компонент.
GetComponentsInChildrenПолучает ссылки на все компоненты типа T на том же GameObject, что и указанный компонент, и на любого ребенка GameObject.
GetComponentsInParentПолучает ссылки на все компоненты типа T на том же GameObject, что и указанный компонент, и любой родитель GameObject.
SendMessageВызывает метод с именем methodName на каждом MonoBehaviour в этом игровом объекте.
SendMessageUpwardsВызывает метод с именем methodName на каждом MonoBehaviour в этом игровом объекте и на каждом предшественнике поведения.
TryGetComponentПолучает компонент указанного типа, если он существует.
GetInstanceIDПолучает экземпляр ID объекта.
ToStringВозвращает имя объекта.

Статические методы

МетодОписание
DestroyУдаляет GameObject, компонент или ресурс.
DestroyImmediateНемедленно уничтожает указанный объект. Используйте с осторожностью и только в режиме редактирования.
DontDestroyOnLoadНе уничтожать целевой Объект при загрузке нового Scene.
FindAnyObjectByTypeПолучает любой активный загруженный объект типа Type.
FindFirstObjectByTypeПолучает первый активный загруженный объект типа Type.
FindObjectsByTypeПолучает список всех загруженных объектов типа Type.
InstantiateКлонирует исходный объект и возвращает клон.
InstantiateAsyncЗахватывает моментальный снимок первоначального объекта (который должен быть связан с каким-либо GameObject) и возвращает AsyncInstantiateOperation.

Операторы

ОператорОписание
boolСуществует ли объект?
оператор!=Сравнивает, если два объекта ссылаются на разные объекты.
оператор ==Сравнение двух ссылок на объекты для определения того, относятся ли они к одному и тому же объекту.