Смешивание анимационного клипа с контроллером
В этом примере показано, как использовать AnimationMixerPlayable для слияния AnimationClip с AnimatorController. Для этого необходимо сначала обернуть каждый элемент в соответствующий воспроизводимый:
- Завернуть
AnimationClip(clip) вAnimationClipPlayable(clipPlayable). - Завернуть
RuntimeAnimatorController(controller) вAnimatorControllerPlayable(controllerPlayable).
Метод SetInputWeight() динамически регулирует вес смешивания каждого воспроизводимого файла.
Предварительные условия
Чтобы использовать скрипт BlendClipWithController в вашем проекте, в нем должно быть следующее:
- GameObject, например, куб или капсула. Вам не нужно вручную добавлять компонент Animator к этому GameObject. Атрибут
RequireComponentдобавляет этот компонент, если он не присутствует. - Клип анимации, который анимирует свойства GameObject. Например, анимация, которая изменяет положение и вращение GameObject.
- Animator Controller хотя бы с одним состоянием, использующим не тот клип анимации, который анимирует GameObject. Если использовать один и тот же клип анимации, при смешивании PlayableGraph между клипом и контроллером разницы не будет.
Добавление и запуск скрипта
Чтобы использовать скрипт BlendClipWithController в вашем проекте, выполните следующие действия:
-
Добавьте компонент скрипта в файл GameObject. Назовите файл скрипта
BlendClipWithController.csи используйте следующий код:using UnityEngine; using UnityEngine.Playables; using UnityEngine.Animations; [RequireComponent(typeof(Animator))] public class BlendClipWithController : MonoBehaviour { public AnimationClip clip; public RuntimeAnimatorController controller; public float weight; PlayableGraph graph; AnimationMixerPlayable mixer; void Start() { // Create the graph, the mixer, and bind them to the Animator. graph = PlayableGraph.Create("BlendClipWithController"); mixer = AnimationMixerPlayable.Create(graph, 2); var output = AnimationPlayableOutput.Create(graph, "Animation", GetComponent<Animator>()); output.SetSourcePlayable(mixer); // Create playables and connect them to the mixer. var clipPlayable = AnimationClipPlayable.Create(graph, clip); var controllerPlayable = AnimatorControllerPlayable.Create(graph, controller); graph.Connect(clipPlayable, 0, mixer, 0); graph.Connect(controllerPlayable, 0, mixer, 1); // Play the Graph. graph.Play(); } void Update() { // Clamp the weight between 0 and 1. weight = Mathf.Clamp01(weight); // Adjust the weight of each mixer input. mixer.SetInputWeight(0, 1.0f-weight); mixer.SetInputWeight(1, weight); } void OnDisable() { // Destroy all Playables and Outputs created by the graph. graph.Destroy(); } } В компоненте Скрипт выберите клип анимации для входного узла 0 и Контроллер Animator для входного узла 1.
Укажите вес для Контроллера Animator относительно клипа анимации.
Скрипт настраивает вес входного узла 0 относительно входного узла 1 так, чтобы совокупные веса равнялись 1.0. Например, вес 0.4 устанавливает для Контроллера Animator вес 40%, а для клипа анимации — вес 60%.Выберите Играть, чтобы переключить редактор в режим воспроизведения.
В компоненте Скрипт поэкспериментируйте с различными весами.
Если установлен пакет визуализатора PlayableGraph, выберите
BlendClipWithControllerдля отображения PlayableGraph.
BlendClipWithController