public static Vector3 Eval(this AnimationCurve a, Vector3 p) { Vector3 v = Vector3.zero; v.x = a.Eval(p.x); v.y = a.Eval(p.y); v.z = a.Eval(p.z); return(v); }
void Second() { // Must have an owner to do animations if (owner == null) { return; } Quaternion lastRotation = transform.rotation; // Clamp bob value bob = Mathf.Clamp01(bob); // Update position spring positionSpring.target = info.offset; offset = positionSpring.Animate(offset); // Update shake spring shakeSpring.target = Vector3.zero; shakeOffset = shakeSpring.Animate(shakeOffset); // Update recoil spring recoil = recoilSpring.Animate(recoil); // Update offset rotation towards identity rotation = Quaternion.Lerp(rotation, Quaternion.identity, deltaTime * settings.rotationDampening); // Take owners rotation as basis Quaternion targetRotation = owner.rotation; // Apply all animation rotations based on current states. targetRotation *= rotation; targetRotation *= Quaternion.Euler(settings.airRotation * air); targetRotation *= Quaternion.Euler(settings.reloadRotation * reload); targetRotation *= Quaternion.Euler(settings.sprintRotation * sprint); targetRotation *= Quaternion.Euler(settings.disabledRotation * disabled); transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, deltaTime * settings.lookDampening); // Move to owner position + offsets transform.position = owner.position + transform.rotation * offset; transform.position += owner.rotation * (settings.sprintOffset * sprint); transform.position += owner.rotation * (settings.disabledOffset * disabled); // Evaluate weapon bobbing curves Vector3 bobOffset = Vector3.Scale(info.bobPositionOffset, curve.Eval(info.bobPositionSpeed * bobTime)); Vector3 bobRotation = Vector3.Scale(info.bobRotationOffset, curve.Eval(info.bobRotationSpeed * bobTime)); // Apply weapon bob on top of previous animations transform.Translate(bobOffset * info.bobScale * bob); transform.Rotate(bobRotation * info.bobScale * bob); // Apply recoil on top of previous animations transform.Rotate(info.recoilRotation * info.recoilScale * recoil); transform.Translate(info.recoilOffset * info.recoilScale * recoil); // Apply shake on top of previous animations transform.Translate(shakeOffset); // Record our current actual offset offsetPosition = transform.position - owner.position; }