Animator
Описание
Управляет, контролирует и оценивает анимацию GameObject.
Animator является главным Component в системе анимации Mecanim. Animator оценивает Animation Клипы и управляет Animator Состояниями в Animator Машинах Состояний.
Управление Animator с помощью AnimatorController
Как правило, вы настраиваете Animator с ассетом AnimatorController. Этот ассет определяет, какая анимация будет воспроизводиться. Чтобы узнать, как создать AnimatorController, ознакомьтесь с Animator Контроллер. После настройки с помощью AnimatorController, вы можете влиять на поток машины состояний следующими методами:
- Используйте Animator.SetFloat, Animator.SetInteger, Animator.SetBool, или Animator.SetTrigger, через AnimatorControllerProperty, чтобы запустить переход AnimatorController.
- Используйте Animator.Play, Animator.PlayInFixedTime, Animator.Crossfade или Animator.CrossFadeInFixedTime для принуждения AnimatorController к конкретному состоянию.
- Используйте Animator.SetLayerWeight для изменения веса AnimatorControllerLayer.
Для более сложных случаев использования, вы можете управлять 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 сохраняет ссылку на каждую привязку, так что она может быть записана в последующих кадрах.
Эта операция называется Перепривязка и может быть вызвана различными событиями:
- Первая инициализация Компонента Animator при загрузке ,Scene, или инстанционировании Префаб.
- Изменение AnimatorController или AnimatorOverrideController в Animator.runtimeAnimatorController.
- Внесение изменений в набор AnimatorOverrideController в Animator.runtimeAnimatorController.
- Внесение изменений в PlayableGraph, подключенных к Animator.
- Вручную вызвать Animator.Rebind.
- Включение 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 | Получить вес поворота. |
| playableGraph | PlayableGraph создан 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
Свойства
| Свойство | Описание |
|---|---|
| enabled | True, если это Поведение включено, в противном случае false. |
| isActiveAndEnabled | Проверяет, включён ли компонент, прикреплен ли он к GameObject, который активен в иерархии, и вызван ли OnEnable компонента. |
| gameObject | GameObject, к которому прикреплен данный компонент. Компонент всегда прикрепляется к игровому объекту. |
| tag | Тег этого игрового объекта. |
| transform | Transform прикреплен к этому GameObject. |
| transformHandle | TransformHandle этого 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 | Существует ли объект? |
| оператор!= | Сравнивает, если два объекта ссылаются на разные объекты. |
| оператор == | Сравнение двух ссылок на объекты для определения того, относятся ли они к одному и тому же объекту. |