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();
}
}