baobao
10/27/2018 - 6:53 PM

TransformSceneHandleExample.cs

using Unity.Burst;
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Animations;
using UnityEngine.Experimental.Animations;

[BurstCompile]
public struct TransformSceneHandleJob : IAnimationJob
{
    public TransformSceneHandle handle;
    public Vector3 position;
    public Vector3 rotation;
    public Vector3 scale;

    public void ProcessRootMotion(AnimationStream stream)
    {
        // Set the new local position.
        handle.SetLocalPosition(stream, position);

        // Set the new local rotation (converted from euler).
        handle.SetLocalRotation(stream, Quaternion.Euler(rotation));

        // Set the new local scale.
        handle.SetLocalScale(stream, scale);
    }

    public void ProcessAnimation(AnimationStream stream)
    {
    }
}

[RequireComponent(typeof(Animator))]
public class TransformSceneHandleExample : MonoBehaviour
{
    public Transform sceneTransform;
    public Vector3 position;
    public Vector3 rotation;
    public Vector3 scale = Vector3.one;

    PlayableGraph m_Graph;
    AnimationScriptPlayable m_AnimationScriptPlayable;

    void Start()
    {
        if (sceneTransform == null)
            return;

        var animator = GetComponent<Animator>();

        m_Graph = PlayableGraph.Create("TransformSceneHandleExample");
        var output = AnimationPlayableOutput.Create(m_Graph, "output", animator);

        var animationJob = new TransformSceneHandleJob();
        animationJob.handle = animator.BindSceneTransform(sceneTransform);
        m_AnimationScriptPlayable = AnimationScriptPlayable.Create(m_Graph, animationJob);

        output.SetSourcePlayable(m_AnimationScriptPlayable);
        m_Graph.Play();
    }

    void Update()
    {
        if (sceneTransform == null)
            return;

        var animationJob = m_AnimationScriptPlayable.GetJobData<TransformSceneHandleJob>();
        animationJob.position = position;
        animationJob.rotation = rotation;
        animationJob.scale = scale;
        m_AnimationScriptPlayable.SetJobData(animationJob);
    }

    void OnDisable()
    {
        if (sceneTransform == null)
            return;

        m_Graph.Destroy();
    }
}