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

Создать пользовательский игровой элемент

Этот пример показывает, как создать пользовательский воспроизводимый файл (PlayQueuePlayable) с указанием PlayableBehaviour открытый класс. Пример также показывает, как переопределить PrepareFrame() виртуальный метод, чтобы управлять узлами в PlayableGraph. С помощью пользовательского playable можно переопределить и другие виртуальные методы в PlayableBehaviour class.

В этом примере управляемые узлы представляют собой серию анимационных клипов (clipsToPlay). Метод SetInputWeight() изменяет плотность смешивания каждого клипа анимации, чтобы обеспечить воспроизведение только одного клипа одновременно. Метод SetTime() регулирует локальное время, так что воспроизведение начинается, когда активен клип анимации.

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

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

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

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

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

  1. Добавьте компонент скрипта в файл GameObject. Назовите файл скрипта CustomPlayableExample.cs и используйте следующий код:

    using UnityEngine;
    using UnityEngine.Animations;
    using UnityEngine.Playables;
    
    public class PlayQueuePlayable : PlayableBehaviour
    {
        private int m_CurrentClipIndex = -1;
        private float m_TimeToNextClip;
        private Playable mixer;
    
        public void Initialize(AnimationClip[] clipsToPlay, Playable owner, PlayableGraph graph)
        {
            owner.SetInputCount(1);
            mixer = AnimationMixerPlayable.Create(graph, clipsToPlay.Length);
            graph.Connect(mixer, 0, owner, 0);
            owner.SetInputWeight(0, 1);
    
            for (int clipIndex = 0 ; clipIndex < mixer.GetInputCount() ; ++clipIndex)
            {
                graph.Connect(AnimationClipPlayable.Create(graph, clipsToPlay[clipIndex]), 0, mixer, clipIndex);
                mixer.SetInputWeight(clipIndex, 1.0f);
            }
        }
    
        override public void PrepareFrame(Playable owner, FrameData info)
        {
            if (mixer.GetInputCount() == 0)
                return;
    
            // Advance to next clip if necessary.
            m_TimeToNextClip -= (float)info.deltaTime;
    
            if (m_TimeToNextClip <= 0.0f)
            {
                m_CurrentClipIndex++;
                if (m_CurrentClipIndex >= mixer.GetInputCount())
                    m_CurrentClipIndex = 0;
                var currentClip = (AnimationClipPlayable)mixer.GetInput(m_CurrentClipIndex);
    
                // Reset the time so that the next clip starts at the correct position.
                currentClip.SetTime(0);
    
                m_TimeToNextClip = currentClip.GetAnimationClip().length;
            }
    
            // Adjust the weight of the inputs.
            for (int clipIndex = 0 ; clipIndex < mixer.GetInputCount(); ++clipIndex)
            {
                if (clipIndex == m_CurrentClipIndex)
                    mixer.SetInputWeight(clipIndex, 1.0f);
                else
                    mixer.SetInputWeight(clipIndex, 0.0f);
            }
        }
    }
    
    [RequireComponent(typeof (Animator))]
    public class CustomPlayableExample : MonoBehaviour
    {
        public AnimationClip[] clipsToPlay;
        PlayableGraph graph;
    
        void Start()
        {
            graph = PlayableGraph.Create("CustomPlayableExample");
            var queuePlayable = ScriptPlayable<PlayQueuePlayable>.Create(graph);
            var playQueue = queuePlayable.GetBehaviour();
    
            playQueue.Initialize(clipsToPlay, queuePlayable, graph);
    
            var output = AnimationPlayableOutput.Create(graph, "Animation", GetComponent<Animator>());
            output.SetSourcePlayable(queuePlayable, 0);
                
            // Play the graph
            graph.Play();
        }
    
        void OnDisable()
        {
            // Destroy all Playables and Outputs created by the graph.
            graph.Destroy();
        }
    }
    
  2. В компоненте Скрипт добавьте по крайней мере два клипа анимации в список Клипы для воспроизведения.

  3. Выберите Играть, чтобы переключить редактор в режим воспроизведения. Скрипт CustomPlayableExample проходит через список анимационных клипов, регулируя длину и время воспроизведения каждого клипа анимации.

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

Список PlayableGraph, созданный скриптом CustomPlayableExample. Список clipsToPlay содержит четыре анимационных клипа.
PlayableGraph, созданный скриптом CustomPlayableExample. Список clipsToPlay содержит четыре анимационных клипа.

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