Version: 2022.3
public static void AddJobDependency (Animator animator, Unity.Jobs.JobHandle jobHandle);

参数

animator 调用此方法的 Animator 实例。
jobHandle 需要在动画器作业之前运行的作业的 JobHandle

描述

在动画器作业和提供的作业句柄代表的作业之间创建依赖关系。要添加多个作业依赖关系,请为每个需要在动画器作业之前运行的作业调用此方法。

每次更新后,都会刷新 Animator 依赖关系。

using UnityEngine;
using UnityEngine.Animations;
using UnityEngine.Playables;

using Unity.Collections; using Unity.Jobs;

public class MyMonoBehaviour : MonoBehaviour { NativeArray<int> input0; NativeArray<int> input1; NativeArray<int> output;

PlayableGraph graph; Animator animator;

public struct SumDataForJob : IJob { [ReadOnly] public NativeArray<int> input0;

[ReadOnly] public NativeArray<int> input1;

public NativeArray<int> output;

public void Execute() { for (var i = 0; i < output.Length; ++i) output[i] = input0[i] + input1[i]; } }

public struct MyAnimationJob : IAnimationJob { [ReadOnly] public NativeArray<int> input;

public float sum;

public void ProcessRootMotion(AnimationStream stream) { sum = 0; for (var i = 0; i < input.Length; ++i) sum += input[i]; }

public void ProcessAnimation(AnimationStream stream) {} }

public void Start() { input0 = new NativeArray<int>(10, Allocator.Persistent); input1 = new NativeArray<int>(10, Allocator.Persistent); output = new NativeArray<int>(10, Allocator.Persistent);

for (var i = 0; i < output.Length; i++) { input0[i] = i; input1[i] = 10 * i; output[i] = 0; }

animator = gameObject.AddComponent<Animator>();

graph = PlayableGraph.Create(); var myAnimationJob = new MyAnimationJob(); myAnimationJob.input = output;

var scriptPlayable = AnimationScriptPlayable.Create(graph, myAnimationJob); var playableOutput = AnimationPlayableOutput.Create(graph, "output", animator);

playableOutput.SetSourcePlayable(scriptPlayable); graph.Play(); }

public void Update() { SumDataForJob sumJob; sumJob.input0 = input0; sumJob.input1 = input1; sumJob.output = output;

var jobHandle = sumJob.Schedule(); animator.AddJobDependency(jobHandle); }

public void OnDestroy() { graph.Destroy(); input0.Dispose(); input1.Dispose(); output.Dispose(); } }