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:
Unduh Playable Login Visualizer yang sesuai dengan versi Unity Anda dari Repositori GitHub
Buka alat dengan memilih Window > PlayableGraph Visualizer
Daftarkan grafik Anda menggunakan GraphVisualizerClient. Tampilkan(Bermain Grafik, nama string).
Playables dalam grafik diwakili oleh node berwarna. intensitas warna kawat menunjukkan berat campuran. Lihat GitHub untuk informasi lebih lanjut tentang alat ini.
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();
}
}
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();
}
}
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();
}
}
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();
}
}
Contoh ini menunjukkan cara membuat PlayableGraph
dengan dua jenis output yang dapat dimainkan berbeda: AudioPlayableOutpu
t 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();
}
}
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();
}
}
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();
}
}
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();
}
}
2017–07–01 Sitemap
Unity 2017.1 NewIn20171