ScriptPlayable dan PlayableBehaviour
Syarat animasi

Contoh Playables

PlayableGraph Visualizer

Semua contoh dalam dokumen ini menggunakan PlayableGraph Visualizer (Di bawah ini) untuk menggambarkan pohon dan node yang dibuat oleh API PlayablesAPI yang menyediakan cara untuk membuat alat, efek atau mekanisme gameplay lainnya dengan mengatur dan mengevaluasi sumber data dalam struktur seperti pohon yang dikenal sebagai PlayableGraph. More info
Lihat di Glossary
. The Playable graphAPI untuk mengendalikan Playables. Grafik yang dapat dimainkan memungkinkan Anda untuk membuat, menghubungkan dan menghancurkan playables. More info
Lihat di Glossary
Visualizer adalah alat yang tersedia melalui GitHub.

Untuk menggunakan PlayableGraph Visualizer:

  1. Unduh Playable Login Visualizer yang sesuai dengan versi Unity Anda dari Repositori GitHub

  2. Buka alat dengan memilih Window > PlayableGraph Visualizer

  3. Daftarkan grafik Anda menggunakan GraphVisualizerClient. Tampilkan(Bermain Grafik, nama string).

The GraphVisualizer window
The GraphVisualizer window

Playables dalam grafik diwakili oleh node berwarna. intensitas warna kawat menunjukkan berat campuran. Lihat GitHub untuk informasi lebih lanjut tentang alat ini.

Bermain satu klip animasi pada GameObject

Contoh ini menunjukkan PlayableGraph sederhana dengan output yang dapat dimainkan tunggal yang terkait dengan satu simpul yang dapat dimainkan. Node yang dapat dimainkan memainkan satu animation clipAnimasi data yang dapat digunakan untuk karakter animasi atau animasi sederhana. Ini adalah bagian "unit" sederhana dari gerakan, seperti (salah satu contoh spesifik) "Idle", "Walk" atau "Run". More info
Lihat di Glossary
(clip). Sebuah AnimationClipPlayable harus membungkus klip animasi untuk membuatnya kompatibel dengan API Playables.


using UnityEngine;

using UnityEngine.Playables;

using UnityEngine.Animations;

[RequireComponent(typeof(Animator))]

public class PlayAnimationSample : MonoBehaviour

{

    public AnimationClip clip;

    PlayableGraph playableGraph;

    void Start()

    {

        playableGraph = PlayableGraph.Create();

        playableGraph.SetTimeUpdateMode(DirectorUpdateMode.GameTime);

        var playableOutput = AnimationPlayableOutput.Create(playableGraph, "Animation", GetComponent<Animator>());

        // Wrap the clip in a playable

        var clipPlayable = AnimationClipPlayable.Create(playableGraph, clip);

        // Connect the Playable to an output

        playableOutput.SetSourcePlayable(clipPlayable);

        // Plays the Graph.

        playableGraph.Play();

    }

    void OnDisable()

    {

        // Destroys all Playables and PlayableOutputs created by the graph.

        playableGraph.Destroy();

    }

}

The PlayableGraph generated by PlayAnimationSample
PlayableGraph yang dihasilkan oleh PlayAnimation Sitemap

Gunakan AnimationPlayableUtilities untuk menyederhanakan penciptaan dan pemutaran animasi yang dapat dimainkan, seperti yang ditunjukkan dalam contoh berikut:__ __


using UnityEngine;

using UnityEngine.Playables;

using UnityEngine.Animations;

[RequireComponent(typeof(Animator))]

public class PlayAnimationUtilitiesSample : MonoBehaviour

{

    public AnimationClip clip;

    PlayableGraph playableGraph;

    void Start()

    {

        AnimationPlayableUtilities.PlayClip(GetComponent<Animator>(), clip, out playableGraph);

    }

    void OnDisable()

    {

        // Destroys all Playables and Outputs created by the graph.

        playableGraph.Destroy();

    }

}

Membuat pohon campuran animasi

Contoh ini menunjukkan cara menggunakan AnimationMixerPlayable untuk mencampur dua klip animasi. Sebelum memadukan klip animasi, mereka harus dibungkus dengan playables. Untuk melakukan ini, AnimationClipPlayable (clipPlayable0 dan clipPlayable1) membungkus setiap AnimationClip (clip0 dan clip1). Metode SetInputWeight() secara dinamis menyesuaikan berat campuran masing-masing dapat dimainkan.

Meskipun tidak ditampilkan dalam contoh ini, Anda juga dapat menggunakan AnimationMixerPlayable untuk mencampur mixer yang dapat dimainkan dan playable lainnya.


using UnityEngine;

using UnityEngine.Playables;

using UnityEngine.Animations;

[RequireComponent(typeof(Animator))]

public class MixAnimationSample : MonoBehaviour

{

    public AnimationClip clip0;

    public AnimationClip clip1;

    public float weight;

    PlayableGraph playableGraph;

    AnimationMixerPlayable mixerPlayable;

    void Start()

    {

        // Creates the graph, the mixer and binds them to the Animator.

        playableGraph = PlayableGraph.Create();

        var playableOutput = AnimationPlayableOutput.Create(playableGraph, "Animation", GetComponent<Animator>());

        mixerPlayable = AnimationMixerPlayable.Create(playableGraph, 2);

        playableOutput.SetSourcePlayable(mixerPlayable);

        // Creates AnimationClipPlayable and connects them to the mixer.

        var clipPlayable0 = AnimationClipPlayable.Create(playableGraph, clip0);

        var clipPlayable1 = AnimationClipPlayable.Create(playableGraph, clip1);

        playableGraph.Connect(clipPlayable0, 0, mixerPlayable, 0);

        playableGraph.Connect(clipPlayable1, 0, mixerPlayable, 1);

        

        // Plays the Graph.

        playableGraph.Play();

    }

    void Update()

    {

        weight = Mathf.Clamp01(weight);

        mixerPlayable.SetInputWeight(0, 1.0f-weight);

        mixerPlayable.SetInputWeight(1, weight);

    }

    void OnDisable()

    {

        // Destroys all Playables and Outputs created by the graph.

        playableGraph.Destroy();

    }

}

The PlayableGraph generated by `MixAnimationSample
PlayableGraph yang dihasilkan oleh `MixAnimationSample

Mencampur AnimasiClip dan AnimatorController

Contoh ini menunjukkan cara menggunakan AnimationMixerPlayable untuk memadukan AnimationClip dengan AnimatorController.

Sebelum memadukan AnimationClip dan AnimatorController, mereka harus dibungkus dengan playables. Untuk melakukan ini, AnimationClipPlayable (clipPlayable) membungkus AnimationClip (clip) dan AnimatorControllerPlayable (ctrlPlayable) membungkus RuntimeAnimatorController (controller). Metode SetInputWeight() secara dinamis menyesuaikan bobot campuran masing-masing dapat dimainkan.


using UnityEngine;

using UnityEngine.Playables;

using UnityEngine.Animations;

[RequireComponent(typeof(Animator))]

public class RuntimeControllerSample : MonoBehaviour

{

    public AnimationClip clip;

    public RuntimeAnimatorController controller;

    public float weight;

    PlayableGraph playableGraph;

    AnimationMixerPlayable mixerPlayable;

    void Start()

    {

        // Creates the graph, the mixer and binds them to the Animator.

        playableGraph = PlayableGraph.Create();

        var playableOutput = AnimationPlayableOutput.Create(playableGraph, "Animation", GetComponent<Animator>());

        mixerPlayable = AnimationMixerPlayable.Create(playableGraph, 2);

        playableOutput.SetSourcePlayable(mixerPlayable);

        // Creates AnimationClipPlayable and connects them to the mixer.

        var clipPlayable = AnimationClipPlayable.Create(playableGraph, clip);

        var ctrlPlayable = AnimatorControllerPlayable.Create(playableGraph, controller);

        playableGraph.Connect(clipPlayable, 0, mixerPlayable, 0);

        playableGraph.Connect(ctrlPlayable, 0, mixerPlayable, 1);

        

        // Plays the Graph.

        playableGraph.Play();

    }

    void Update()

    {

        weight = Mathf.Clamp01(weight);

        mixerPlayable.SetInputWeight(0, 1.0f-weight);

        mixerPlayable.SetInputWeight(1, weight);

    }

    void OnDisable()

    {

        // Destroys all Playables and Outputs created by the graph.

        playableGraph.Destroy();

    }

}

Membuat Playable Grafik dengan beberapa output

Contoh ini menunjukkan cara membuat PlayableGraph dengan dua jenis output yang dapat dimainkan berbeda: AudioPlayableOutput dan AnimationPlayableOutput. Sebuah PlayableGraph dapat memiliki banyak output yang dapat dimainkan dari berbagai jenis.

Contoh ini juga menunjukkan cara bermain AudioClip melalui AudioClipPlayable yang terhubung ke AudioPlayableOutput.


using UnityEngine;

using UnityEngine.Animations;

using UnityEngine.Audio;

using UnityEngine.Playables;

[RequireComponent(typeof(Animator))]

[RequireComponent(typeof(AudioSource))]

public class MultiOutputSample : MonoBehaviour

{

    public AnimationClip animationClip;

    public AudioClip audioClip;

    PlayableGraph playableGraph;

    void Start()

    {

        playableGraph = PlayableGraph.Create();

        // Create the outputs.

        var animationOutput = AnimationPlayableOutput.Create(playableGraph, "Animation", GetComponent<Animator>());

        var audioOutput = AudioPlayableOutput.Create(playableGraph, "Audio", GetComponent<AudioSource>());

        

        // Create the playables.

        var animationClipPlayable = AnimationClipPlayable.Create(playableGraph, animationClip);

        var audioClipPlayable = AudioClipPlayable.Create(playableGraph, audioClip, true);

        // Connect the playables to an output

        animationOutput.SetSourcePlayable(animationClipPlayable);

        audioOutput.SetSourcePlayable(audioClipPlayable);

        // Plays the Graph.

        playableGraph.Play();

    }

    void OnDisable()

    {

        // Destroys all Playables and Outputs created by the graph.

        playableGraph.Destroy();

    }

}

The PlayableGraph generated by `MultiOutputSample
PlayableGraph yang dihasilkan oleh `MultiOutputSample

Mengontrol keadaan bermain pohon

Contoh ini menunjukkan cara menggunakan metode Playable.SetPlayState() untuk mengontrol keadaan bermain node pada pohon PlayableGraph. Metode SetPlayState mengontrol keadaan bermain seluruh pohon, salah satu cabangnya, atau satu node.

Ketika mengatur keadaan bermain dari suatu node, negara itu menyebar ke semua anak-anaknya, terlepas dari keadaan bermain mereka. Sebagai contoh, jika node anak dihentikan secara eksplisit, mengatur node induk untuk “pemainan” juga menetapkan semua node anaknya untuk “pemainan. Sitemap

Dalam contoh ini, PlayableGraph mengandung mixer yang memadukan dua klip animasi. Sebuah AnimationClipPlayable membungkus setiap klip animasi dan metode SetPlayState() secara eksplisit menghentikan kedua playable. AnimationClipPlayable kedua dihentikan secara eksplisit, sehingga waktu internalnya tidak maju dan output nilai yang sama. Nilai yang tepat tergantung pada waktu tertentu ketika AnimationClipPlayable dihentikan.


using UnityEngine;

using UnityEngine.Playables;

using UnityEngine.Animations;

[RequireComponent(typeof(Animator))]

public class PauseSubGraphAnimationSample : MonoBehaviour

{

    public AnimationClip clip0;

    public AnimationClip clip1;

    PlayableGraph playableGraph;

    AnimationMixerPlayable mixerPlayable;

    void Start()

    {

        // Creates the graph, the mixer and binds them to the Animator.

        playableGraph = PlayableGraph.Create();

        var playableOutput = AnimationPlayableOutput.Create(playableGraph, "Animation", GetComponent<Animator>());

        mixerPlayable = AnimationMixerPlayable.Create(playableGraph, 2);

        playableOutput.SetSourcePlayable(mixerPlayable);

        // Creates AnimationClipPlayable and connects them to the mixer.

        var clipPlayable0 = AnimationClipPlayable.Create(playableGraph, clip0);

        var clipPlayable1 = AnimationClipPlayable.Create(playableGraph, clip1);

        playableGraph.Connect(clipPlayable0, 0, mixerPlayable, 0);

        playableGraph.Connect(clipPlayable1, 0, mixerPlayable, 1);

        mixerPlayable.SetInputWeight(0, 1.0f);

        mixerPlayable.SetInputWeight(1, 1.0f);

        clipPlayable1.SetPlayState(PlayState.Paused);

        // Plays the Graph.

        playableGraph.Play();

    }

    void OnDisable()

    {

        // Destroys all Playables and Outputs created by the graph.

        playableGraph.Destroy();

    }

}

The PlayableGraph generated by PauseSubGraphAnimationSample. Notice that the second clip is paused (red edge).
PlayableGraph yang dihasilkan oleh PauseSubGraphAnimation Sitemap Perhatikan bahwa klip kedua dihentikan (sisi merah).

Mengontrol waktu pohon

Contoh ini menunjukkan cara menggunakan metode Play() untuk memainkan PlayableGraph, cara menggunakan metode SetPlayState() untuk menghentikan metode yang dapat dimainkan, dan cara menggunakan metode SetTime() secara manual mengatur waktu lokal yang dapat dimainkan dengan variabel.


using UnityEngine;

using UnityEngine.Playables;

using UnityEngine.Animations;

[RequireComponent(typeof(Animator))]

public class PlayWithTimeControlSample : MonoBehaviour

{

    public AnimationClip clip;

    public float time;

    PlayableGraph playableGraph;

    AnimationClipPlayable playableClip;

    void Start()

    {

        playableGraph = PlayableGraph.Create();

        var playableOutput = AnimationPlayableOutput.Create(playableGraph, "Animation", GetComponent<Animator>());

        // Wrap the clip in a playable

        playableClip = AnimationClipPlayable.Create(playableGraph, clip);

        // Connect the Playable to an output

        playableOutput.SetSourcePlayable(playableClip);

        // Plays the Graph.

        playableGraph.Play();

        // Stops time from progressing automatically.

        playableClip.SetPlayState(PlayState.Paused);

    }

    void Update () 

    {

        // Control the time manually

        playableClip.SetTime(time);

    }

    

    void OnDisable()

    {

        // Destroys all Playables and Outputs created by the graph.

        playableGraph.Destroy();

    }

}

Membuat PlayableBehaviour

Contoh ini menunjukkan cara membuat playable kustom dengan kelas publik PlayableBehaviour. Contoh ini juga menunjukkan bagaimana untuk menimpa metode virtual PrepareFrame() untuk mengontrol node pada PlayableGraph. Playable kustom dapat menimpa salah satu metode virtual lainnya dari kelas PlayableBehaviour.

Dalam contoh ini, node yang dikendalikan adalah serangkaian klip animasi (clipsToPlay). SetInputMethod() mengubah berat campuran setiap klip animasi, memastikan bahwa hanya satu klip bermain pada waktu, dan metode SetTime() menyesuaikan waktu lokal sehingga pemutaran dimulai pada saat klip animasi diaktifkan.


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 PlayQueueSample : MonoBehaviour

{

    public AnimationClip[] clipsToPlay;

    PlayableGraph playableGraph;

    void Start()

    {

        playableGraph = PlayableGraph.Create();

        var playQueuePlayable = ScriptPlayable<PlayQueuePlayable>.Create(playableGraph);

        var playQueue = playQueuePlayable.GetBehaviour();

        playQueue.Initialize(clipsToPlay, playQueuePlayable, playableGraph);

        var playableOutput = AnimationPlayableOutput.Create(playableGraph, "Animation", GetComponent<Animator>());

        playableOutput.SetSourcePlayable(playQueuePlayable);
        playableOutput.SetSourceInputPort(0);

        playableGraph.Play();

    }

    void OnDisable()

    {

        // Destroys all Playables and Outputs created by the graph.

        playableGraph.Destroy();

    }

}

The PlayableGraph generated by PlayQueueSample
PlayQueueSample

  • 2017–07–01 Sitemap

  • Unity 2017.1 NewIn20171

ScriptPlayable dan PlayableBehaviour
Syarat animasi