Пример #1
0
    protected override void OnDestroy()
    {
        if (_processDefaultAnimationGraphSystem == null)
        {
            return;
        }

        EntityQuery          graphsQuery   = GetEntityQuery(typeof(SimpleAnimationGraphData), typeof(SimpleAnimationClipData));
        NativeArray <Entity> graphEntities = graphsQuery.ToEntityArray(Allocator.Temp);

        for (int i = 0; i < graphEntities.Length; i++)
        {
            Entity graphEntity = graphEntities[i];
            SimpleAnimationGraphData simpleAnimationGraphData = EntityManager.GetComponentData <SimpleAnimationGraphData>(graphEntity);
            DynamicBuffer <SimpleAnimationClipData> clipDatas = EntityManager.GetBuffer <SimpleAnimationClipData>(graphEntity);
            DestroyGraph(_processDefaultAnimationGraphSystem, ref simpleAnimationGraphData, ref clipDatas);
        }
        graphEntities.Dispose();

        _processDefaultAnimationGraphSystem.RemoveRef();

        base.OnDestroy();
    }
Пример #2
0
    protected override void OnUpdate()
    {
        CompleteDependency();

        float deltaTime         = Time.DeltaTime;
        EntityCommandBuffer ecb = _endSimulationEntityCommandBufferSystem.CreateCommandBuffer();

        Entities
        .WithName("CreateGraph")
        .WithNone <SimpleAnimationGraphData>()
        .WithoutBurst()
        .WithStructuralChanges()
        .ForEach((Entity e, ref Rig rig, ref SimpleAnimation simpleAnimation) =>
        {
            SimpleAnimationGraphData graphData = CreateGraph(EntityManager, e, _processDefaultAnimationGraphSystem, in simpleAnimation, ref rig);
            ecb.AddComponent(e, graphData);
        }).Run();

        Entities
        .WithName("DestroyGraph")
        .WithNone <SimpleAnimation>()
        .WithoutBurst()
        .WithStructuralChanges()
        .ForEach((Entity e, ref SimpleAnimationGraphData graphData, ref DynamicBuffer <SimpleAnimationClipData> clipDatas) =>
        {
            DestroyGraph(_processDefaultAnimationGraphSystem, ref graphData, ref clipDatas);
            ecb.RemoveComponent <SimpleAnimationGraphData>(e);
        }).Run();

        Dependency = Entities
                     .ForEach((
                                  Entity entity,
                                  ref SimpleAnimation simpleAnimation,
                                  ref SimpleAnimationDeltaTime dt,
                                  ref DynamicBuffer <SimpleAnimationClipData> simpleAnimationClipDatas) =>
        {
            // Update time
            dt.Value = deltaTime;

            // Handle transitions
            if (simpleAnimation.IsTransitioning)
            {
                simpleAnimation.RemainingTransitionTime -= deltaTime;
                float normalizedTransitionTime           = math.clamp(1f - (simpleAnimation.RemainingTransitionTime / simpleAnimation.TotalTransitionTime), 0f, 1f);

                simpleAnimation.SetWeight(1f - normalizedTransitionTime, simpleAnimation.FromClipIndex, ref simpleAnimationClipDatas);
                simpleAnimation.SetWeight(normalizedTransitionTime, simpleAnimation.ToClipIndex, ref simpleAnimationClipDatas);

                if (simpleAnimation.RemainingTransitionTime <= 0f)
                {
                    simpleAnimation.IsTransitioning = false;
                }
            }
        }).Schedule(Dependency);
        Dependency.Complete();

        // Update graph values
        NodeSet set = _processDefaultAnimationGraphSystem.Set;

        Entities
        .WithoutBurst()
        .ForEach((
                     Entity entity,
                     ref SimpleAnimationGraphData simpleAnimationGraphData,
                     ref DynamicBuffer <SimpleAnimationClipData> simpleAnimationClipDatas) =>
        {
            // Handle setting and outputting values
            for (int i = 0; i < simpleAnimationClipDatas.Length; ++i)
            {
                SimpleAnimationClipData clipData = simpleAnimationClipDatas[i];

                // Set weights
                if (clipData.WeightDirty)
                {
                    set.SetData(simpleAnimationGraphData.NMixerNode, NMixerNode.KernelPorts.Weights, i, clipData.Weight);
                    clipData.WeightDirty = false;
                }

                // Set speeds
                if (clipData.SpeedDirty)
                {
                    set.SetData(clipData.ClipNode, ClipPlayerNode.KernelPorts.Speed, clipData.Speed);
                    clipData.SpeedDirty = false;
                }

                // Set Time
                if (clipData.TimeDirty)
                {
                    set.SendMessage(clipData.ClipNode, ClipPlayerNode.SimulationPorts.Time, clipData.Time);
                    clipData.TimeDirty = false;
                }

                // TODO: Get time
                clipData.Time += deltaTime * clipData.Speed;

                simpleAnimationClipDatas[i] = clipData;
            }
        }).Run();
    }