Beispiel #1
0
        private static IEnumerator AsyncStartRecording(Transform transform, AnimationClip clip)
        {
            clip.EnableLegacy().ClearCurves();
            var currentTime            = 0f;
            var animationLocalPosition = new AnimationCurve3D();
            var animationLocalRotation = new AnimationCurve3D();

            void UpdateAnimation(AnimationCurve animationCurve, string propertyName, float value)
            {
                animationCurve.AddKey(currentTime, value);
                clip.SetCurve("", typeof(Transform), propertyName, animationCurve);
            }

            while (true)
            {
                var localPosition = transform.localPosition;
                UpdateAnimation(animationLocalPosition.X, "localPosition.x", localPosition.x);
                UpdateAnimation(animationLocalPosition.Y, "localPosition.y", localPosition.y);
                UpdateAnimation(animationLocalPosition.Z, "localPosition.z", localPosition.z);
                var localRotation = transform.localRotation;
                UpdateAnimation(animationLocalRotation.X, "localRotation.x", localRotation.x);
                UpdateAnimation(animationLocalRotation.Y, "localRotation.y", localRotation.y);
                UpdateAnimation(animationLocalRotation.Z, "localRotation.z", localRotation.z);
                UpdateAnimation(animationLocalRotation.W, "localRotation.w", localRotation.w);
                yield return(null);

                currentTime += Time.deltaTime;
            }
        }
Beispiel #2
0
        private void SetTimeByDistance()
        {
            if (_Path != null)
            {
                float totalTime = -1;
                foreach (var k in _Path.Keys)
                {
                    k.Time = ++totalTime;
                }

                float   maxDistance = 0;
                float[] distances   = new float[_Path.Keys.Length];
                distances[0] = 0;

                _Curve3D = new AnimationCurve3D(_Path.Keys);
                for (int i = 1; i < _Path.Keys.Length; i++)
                {
                    maxDistance += CalcDistance(_Curve3D, i - 1, i);
                    distances[i] = maxDistance;
                }

                for (int i = 0; i < _Path.Length; i++)
                {
                    _Path.Keys[i].Time = (distances[i] / maxDistance) * _Path.PathTime;
                    EditorUtility.SetDirty(_Path);
                }
            }
        }
Beispiel #3
0
        private float CalcDistance(AnimationCurve3D curve, float startTime, float endTime, int resolution = 60)
        {
            float timeStep = (endTime - startTime) / resolution;
            float distance = 0;
            float time     = startTime;

            for (int i = 0; i < resolution; i++)
            {
                distance += Vector3.Distance(curve.Evaluate(time), curve.Evaluate(time + timeStep));
                time     += timeStep;
            }

            return(distance);
        }
Beispiel #4
0
 private void RebuildPath()
 {
     _Curve3D = new AnimationCurve3D(_Path.Keys);
     RebuildPoints();
     _Path.transform.hasChanged = false;
 }