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

Смешивание анимационного клипа с контроллером

В этом примере показано, как использовать AnimationMixerPlayable для слияния AnimationClip с AnimatorController. Для этого необходимо сначала обернуть каждый элемент в соответствующий воспроизводимый:

  • Завернуть AnimationClip (clip) в AnimationClipPlayable (clipPlayable).
  • Завернуть RuntimeAnimatorController (controller) в AnimatorControllerPlayable (controllerPlayable).

Метод SetInputWeight() динамически регулирует вес смешивания каждого воспроизводимого файла.

Предварительные условия

Чтобы использовать скрипт BlendClipWithController в вашем проекте, в нем должно быть следующее:

  • GameObject, например, куб или капсула. Вам не нужно вручную добавлять компонент Animator к этому GameObject. Атрибут RequireComponent добавляет этот компонент, если он не присутствует.
  • Клип анимации, который анимирует свойства GameObject. Например, анимация, которая изменяет положение и вращение GameObject.
  • Animator Controller хотя бы с одним состоянием, использующим не тот клип анимации, который анимирует GameObject. Если использовать один и тот же клип анимации, при смешивании PlayableGraph между клипом и контроллером разницы не будет.

Добавление и запуск скрипта

Чтобы использовать скрипт BlendClipWithController в вашем проекте, выполните следующие действия:

  1. Добавьте компонент скрипта в файл 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();
        }
    }
    
  2. В компоненте Скрипт выберите клип анимации для входного узла 0 и Контроллер Animator для входного узла 1.

  3. Укажите вес для Контроллера Animator относительно клипа анимации.
    Скрипт настраивает вес входного узла 0 относительно входного узла 1 так, чтобы совокупные веса равнялись 1.0. Например, вес 0.4 устанавливает для Контроллера Animator вес 40%, а для клипа анимации — вес 60%.

  4. Выберите Играть, чтобы переключить редактор в режим воспроизведения.

  5. В компоненте Скрипт поэкспериментируйте с различными весами.

  6. Если установлен пакет визуализатора PlayableGraph, выберите BlendClipWithController для отображения PlayableGraph.

PlayableGraph, созданный скриптом BlendClipWithController
PlayableGraph, генерируемый скриптом BlendClipWithController

Дополнительные ресурсы