static private IEnumerator SimulateAnchorPos(RectTransform inTransform, Runtime inRuntime) { Vector3 currentPos; Vector3 deltaPos; float dt, dt2, damp; while (inRuntime.Duration > 0) { dt = Routine.DeltaTime; dt2 = dt * dt; damp = inRuntime.Damping == 0 ? 1 : TweenUtil.LerpDecay(inRuntime.Damping, 1, dt); deltaPos.x = deltaPos.y = deltaPos.z = 0; VectorUtil.Add(ref deltaPos, inRuntime.Velocity, dt); VectorUtil.Add(ref deltaPos, inRuntime.Acceleration, 0.5f * dt2); VectorUtil.Add(ref deltaPos, inRuntime.Gravity, 0.5f * dt2); currentPos = inTransform.anchoredPosition3D; VectorUtil.Add(ref currentPos, deltaPos); inTransform.anchoredPosition3D = currentPos; VectorUtil.Add(ref inRuntime.Velocity, inRuntime.Acceleration, dt); VectorUtil.Add(ref inRuntime.Velocity, inRuntime.Gravity, dt); VectorUtil.Multiply(ref inRuntime.Velocity, damp); inRuntime.Duration -= dt; if (inRuntime.Callback != null) { inRuntime.Callback(inTransform, currentPos, inRuntime.Velocity); } yield return(null); } }
static private IEnumerator Simulate(Transform inTransform, Runtime inRuntime) { Vector3 currentEuler = inTransform.GetRotation(Axis.XYZ, inRuntime.Space); Vector3 deltaEuler; float dt, dt2, damp; while (inRuntime.Duration > 0) { dt = Routine.DeltaTime; dt2 = dt * dt; damp = inRuntime.Damping == 0 ? 1 : TweenUtil.LerpDecay(inRuntime.Damping, 1, dt); deltaEuler.x = deltaEuler.y = deltaEuler.z = 0; VectorUtil.Add(ref deltaEuler, inRuntime.Velocity, dt); VectorUtil.Add(ref deltaEuler, inRuntime.Acceleration, 0.5f * dt2); VectorUtil.Add(ref currentEuler, deltaEuler); inTransform.SetRotation(currentEuler, Axis.XYZ, inRuntime.Space); VectorUtil.Add(ref inRuntime.Velocity, inRuntime.Acceleration, dt); VectorUtil.Multiply(ref inRuntime.Velocity, damp); inRuntime.Duration -= dt; if (inRuntime.Callback != null) { inRuntime.Callback(inTransform, currentEuler, inRuntime.Velocity); } yield return(null); } }