public static WrapMode GetWrapMode(AnimationClip clip)
        {
            if (!clip.legacy)
            {
                var clipSettings = TinyAnimationConversionState.GetAnimationClipSettings(clip);
                return(clipSettings.loopTime ? WrapMode.Loop : WrapMode.ClampForever);
            }

            switch (clip.wrapMode)
            {
            case UnityEngine.WrapMode.Once:     // Shares value with UnityEngine.WrapMode.Clamp
            {
                return(WrapMode.Once);
            }

            case UnityEngine.WrapMode.Loop:
            {
                return(WrapMode.Loop);
            }

            case UnityEngine.WrapMode.PingPong:
            {
                return(WrapMode.PingPong);
            }

            case UnityEngine.WrapMode.ClampForever:
            case UnityEngine.WrapMode.Default:
            default:
            {
                return(WrapMode.ClampForever);
            }
            }
        }
        protected override void OnUpdate()
        {
            Entities.ForEach((UnityEngine.Animation animationComponent) =>
            {
                if (!TinyAnimationConversionState.ValidateGameObjectAndWarn(animationComponent.gameObject))
                {
                    return;
                }

                var animationClips = TinyAnimationConversionState.GetAllAnimationClips(animationComponent);
                if (animationClips.Length == 0)
                {
                    return;
                }

                ConversionUtils.WarnAboutUnsupportedFeatures(animationComponent);

                foreach (var clip in animationClips)
                {
                    Convert(clip);
                }
            });

            Entities.ForEach((TinyAnimationAuthoring animationComponent) =>
            {
                if (!TinyAnimationConversionState.ValidateGameObjectAndWarn(animationComponent.gameObject))
                {
                    return;
                }

                var animationClips = TinyAnimationConversionState.GetAllAnimationClips(animationComponent);
                if (animationClips.Length == 0)
                {
                    return;
                }

                ConversionUtils.WarnAboutUnsupportedFeatures(animationComponent.GetComponent <Animator>());

                foreach (var clip in animationClips)
                {
                    Convert(clip);
                }
            });
        }
예제 #3
0
        protected override void OnUpdate()
        {
            Entities.ForEach((UnityEngine.Animation animationComponent) =>
            {
                if (!TinyAnimationConversionState.ValidateGameObjectAndWarn(animationComponent.gameObject))
                {
                    return;
                }

                var animationClips = TinyAnimationConversionState.GetAllAnimationClips(animationComponent);
                if (animationClips.Length == 0)
                {
                    return;
                }

                foreach (var clip in animationClips)
                {
                    DeclareAnimationClipReferencedAssets(clip);
                }
            });

            Entities.ForEach((TinyAnimationAuthoring animationComponent) =>
            {
                if (!TinyAnimationConversionState.ValidateGameObjectAndWarn(animationComponent.gameObject))
                {
                    return;
                }

                var animationClips = TinyAnimationConversionState.GetAllAnimationClips(animationComponent);
                if (animationClips.Length == 0)
                {
                    return;
                }

                foreach (var clip in animationClips)
                {
                    DeclareAnimationClipReferencedAssets(clip);
                }
            });

            UserBindingsRemapper.FillMap();
        }
        protected override void OnUpdate()
        {
            Entities.ForEach((UnityEngine.Animation animationComponent) =>
            {
                if (!TinyAnimationConversionState.ValidateGameObjectAndWarn(animationComponent.gameObject))
                {
                    return;
                }

                Convert(animationComponent);
            });

            Entities.ForEach((TinyAnimationAuthoring animationComponent) =>
            {
                if (!TinyAnimationConversionState.ValidateGameObjectAndWarn(animationComponent.gameObject))
                {
                    return;
                }

                Convert(animationComponent);
            });
        }
예제 #5
0
        void DeclareAnimationClipReferencedAssets(AnimationClip clip)
        {
            DeclareReferencedAsset(clip);

            // Animation clip may have references to other assets through pPtr curves (like Sprites, Materials, etc.)
            var bindings = AnimationUtility.GetObjectReferenceCurveBindings(clip);

            if (bindings.Length == 0)
            {
                return;
            }

            foreach (var binding in bindings)
            {
                var references = AnimationUtility.GetObjectReferenceCurve(clip, binding);
                foreach (var reference in references)
                {
                    DeclareReferencedAsset(reference.value);
                    TinyAnimationConversionState.RegisterDeclaredAsset(reference.value);
                }
            }
        }
        public static void WarnAboutUnsupportedFeatures(AnimationClip clip)
        {
            if (clip.events.Length > 0)
            {
                Debug.LogWarning($"The animation clip {clip.name} contains some animation events, but they are not supported by TinyAnimation.");
            }

            if (clip.legacy)
            {
                return;
            }

            var clipSettings = TinyAnimationConversionState.GetAnimationClipSettings(clip);

            if (clipSettings.loopBlend)
            {
                Debug.LogWarning($"The animation clip {clip.name} has enabled Loop Pose, but it is not supported by TinyAnimation.");
            }

            if (clipSettings.hasAdditiveReferencePose)
            {
                Debug.LogWarning($"The animation clip {clip.name} has an additive reference pose, but it is not supported by TinyAnimation.");
            }

            if (TinyAnimationEngineBridge.HasRootMotion(clip))
            {
                Debug.LogWarning($"The animation clip {clip.name} has root motion data, but it is not supported by TinyAnimation.");
            }

            if (clip.isHumanMotion)
            {
                Debug.LogWarning($"{clip.name} is a humanoid animation clip, but it is not supported by TinyAnimation.");
            }

            if (clip.hasMotionCurves)
            {
                Debug.LogWarning($"The animation clip {clip.name} has motion curves, but it is not supported by TinyAnimation.");
            }
        }
        void Convert(Component animationComponent)
        {
            var animationClips = TinyAnimationConversionState.GetAllAnimationClips(animationComponent);

            if (animationClips.Length == 0)
            {
                return;
            }

            var rootGameObject   = animationComponent.gameObject;
            var gameObjectEntity = TryGetPrimaryEntity(rootGameObject);

            if (gameObjectEntity == Entity.Null)
            {
                throw new Exception($"Could not get a conversion entity for {animationComponent.GetType().Name} on {rootGameObject}.");
            }

            DstEntityManager.AddBuffer <TinyAnimationClipRef>(gameObjectEntity);

            foreach (var clip in animationClips)
            {
                Convert(rootGameObject, clip, gameObjectEntity);
            }

            var clipReferences    = DstEntityManager.GetBuffer <TinyAnimationClipRef>(gameObjectEntity);
            var currentClipEntity = clipReferences[0].Value;

            DstEntityManager.AddComponentData(gameObjectEntity, new TinyAnimationPlayer {
                CurrentClip = currentClipEntity, CurrentIndex = 0
            });

            if (PlaysAutomatically(animationComponent))
            {
                DstEntityManager.AddComponent <UpdateAnimationTimeTag>(currentClipEntity);
                DstEntityManager.AddComponent <ApplyAnimationResultTag>(currentClipEntity);
            }
        }
예제 #8
0
        protected override void OnUpdate()
        {
            var bakedAnimationsQuery = DstEntityManager.CreateEntityQuery(new EntityQueryDesc
            {
                All = new[]
                {
                    ComponentType.ReadOnly <BakedAnimationClip>()
                },
                Options = EntityQueryOptions.IncludeDisabled | EntityQueryOptions.IncludePrefab
            });

            var commandBuffer          = new EntityCommandBuffer(Allocator.TempJob);
            var bakedAnimationEntities = bakedAnimationsQuery.ToEntityArray(Allocator.TempJob);

            for (int entityIndex = 0; entityIndex < bakedAnimationEntities.Length; ++entityIndex)
            {
                commandBuffer.DestroyEntity(bakedAnimationEntities[entityIndex]);
            }

            var animationBindingNameQuery = DstEntityManager.CreateEntityQuery(new EntityQueryDesc
            {
                All = new[]
                {
                    ComponentType.ReadOnly <AnimationBindingName>()
                },
                Options = EntityQueryOptions.IncludeDisabled | EntityQueryOptions.IncludePrefab
            });

            commandBuffer.RemoveComponent <AnimationBindingName>(animationBindingNameQuery);

            commandBuffer.Playback(DstEntityManager);
            commandBuffer.Dispose();

            bakedAnimationEntities.Dispose();

            TinyAnimationConversionState.Clear();
        }
 public static float GetCycleOffset(AnimationClip clip)
 {
     return(clip.legacy ? 0.0f : TinyAnimationConversionState.GetAnimationClipSettings(clip).cycleOffset);
 }