コード例 #1
0
        public override void StartKinetic(VisualPayload payload, Func <float, float> translateTime)
        {
            var transitionTimeInverse = 1f / TransitionDuration.GetFirstValue(payload.Data);
            var startTime             = StartTime.GetFirstValue(payload.Data);

            var startParent = payload.VisualData.Bound.transform.parent;

            var localStart = payload.VisualData.Bound.transform.localPosition;

            var targetBound = TargetBound.GetFirstValue(payload.Data);

            var bound = payload.VisualData.Bound.CreateDependingBound("Lerp to Target");

            bound.transform.parent = targetBound.transform;

            bound.transform.position = StartPosition.GetFirstValue(payload.Data);

            payload.VisualData.Bound.transform.parent = bound.transform;

            payload.VisualData.Bound.transform.localPosition = Vector3.zero;


            var movementSatellite = bound.gameObject.AddComponent <BoundMovementSatellite>();

            var newPayload = new VisualPayload(payload.Data, new VisualDescription(bound));

            movementSatellite.MovementFunc = (trans) =>
            {
                float proportion = (Time.time - startTime) * transitionTimeInverse;

                if (proportion >= 1)
                {
                    trans.position = targetBound.transform.position;

                    movementSatellite.Cleanup();
                    return;
                }

                proportion = translateTime(proportion);

                var startPos = startParent.PiecewiseMultiply(localStart);
                var endPos   = targetBound.transform.position;

                trans.position = Vector3.Lerp(startPos, endPos, proportion);
            };

            movementSatellite.CleanupFunc = (trans) =>
            {
                JobManager.Instance.StartJob(
                    Finished.Transmit(newPayload), jobName: "Kinetic Finished", startImmediately: true, maxExecutionsPerFrame: 1);
            };


            // execute first step immediately to set initial position
            movementSatellite.MovementFunc(movementSatellite.transform);
        }
コード例 #2
0
        public override void StartKinetic(VisualPayload payload, Func <float, float> translateTime)
        {
            var startRotation         = StartRotation.GetFirstValue(payload.Data);
            var endRotation           = EndRotation.GetFirstValue(payload.Data);
            var transitionTimeInverse = 1f / TransitionDuration.GetFirstValue(payload.Data);
            var startTime             = StartTime.GetFirstValue(payload.Data);

            var bound = payload.VisualData.Bound.CreateDependingBound("Lerp Rotation");

            bound.transform.parent = payload.VisualData.Bound.transform.parent;

            payload.VisualData.Bound.transform.parent = bound.transform;

            var rotationSatellite =
                bound.gameObject.AddComponent <BoundMovementSatellite>();

            var newPayload = new VisualPayload(payload.Data, new VisualDescription(bound));

            rotationSatellite.MovementFunc = (trans) =>
            {
                float proportion = (Time.time - startTime) * transitionTimeInverse;

                if (proportion >= 1)
                {
                    trans.rotation = endRotation;

                    rotationSatellite.Cleanup();
                    return;
                }

                proportion = translateTime(proportion);

                trans.rotation = Quaternion.Lerp(startRotation, endRotation, proportion);
            };

            rotationSatellite.CleanupFunc = (trans) =>
            {
                JobManager.Instance.StartJob(
                    Finished.Transmit(newPayload), jobName: "Kinetic Finished", startImmediately: true, maxExecutionsPerFrame: 1);
            };

            // execute first step immediately to set initial position
            rotationSatellite.MovementFunc(rotationSatellite.transform);

            //throw new System.NotImplementedException();
        }