/// <summary> /// Initiates the interpolation for KinematicCharacterMotors and PhysicsMovers /// </summary> public static void PostSimulationInterpolationUpdate(float deltaTime) { _lastCustomInterpolationStartTime = Time.time; _lastCustomInterpolationDeltaTime = deltaTime; // Return interpolated roots to their initial poses for (int i = 0; i < CharacterMotors.Count; i++) { KinematicCharacterMotor motor = CharacterMotors[i]; motor.Transform.SetPositionAndRotation(motor.InitialTickPosition, motor.InitialTickRotation); } for (int i = 0; i < PhysicsMovers.Count; i++) { PhysicsMover mover = PhysicsMovers[i]; if (mover.MoveWithPhysics) { mover.Rigidbody.position = mover.InitialTickPosition; mover.Rigidbody.rotation = mover.InitialTickRotation; mover.Rigidbody.MovePosition(mover.TransientPosition); mover.Rigidbody.MoveRotation(mover.TransientRotation); } else { mover.Rigidbody.position = (mover.TransientPosition); mover.Rigidbody.rotation = (mover.TransientRotation); } } }
/// <summary> /// Remembers the point to interpolate from for KinematicCharacterMotors and PhysicsMovers /// </summary> public static void PreSimulationInterpolationUpdate(float deltaTime) { // Save pre-simulation poses and place transform at transient pose for (int i = 0; i < CharacterMotors.Count; i++) { KinematicCharacterMotor motor = CharacterMotors[i]; motor.InitialTickPosition = motor.TransientPosition; motor.InitialTickRotation = motor.TransientRotation; motor.Transform.SetPositionAndRotation(motor.TransientPosition, motor.TransientRotation); } for (int i = 0; i < PhysicsMovers.Count; i++) { PhysicsMover mover = PhysicsMovers[i]; mover.InitialTickPosition = mover.TransientPosition; mover.InitialTickRotation = mover.TransientRotation; mover.Transform.SetPositionAndRotation(mover.TransientPosition, mover.TransientRotation); mover.Rigidbody.position = mover.TransientPosition; mover.Rigidbody.rotation = mover.TransientRotation; } }
/// <summary> /// Handles per-frame interpolation /// </summary> private static void CustomInterpolationUpdate() { float interpolationFactor = Mathf.Clamp01((Time.time - _lastCustomInterpolationStartTime) / _lastCustomInterpolationDeltaTime); // Handle characters interpolation for (int i = 0; i < CharacterMotors.Count; i++) { KinematicCharacterMotor motor = CharacterMotors[i]; motor.Transform.SetPositionAndRotation( Vector3.Lerp(motor.InitialTickPosition, motor.TransientPosition, interpolationFactor), Quaternion.Slerp(motor.InitialTickRotation, motor.TransientRotation, interpolationFactor)); } // Handle PhysicsMovers interpolation for (int i = 0; i < PhysicsMovers.Count; i++) { PhysicsMover mover = PhysicsMovers[i]; mover.Transform.SetPositionAndRotation( Vector3.Lerp(mover.InitialTickPosition, mover.TransientPosition, interpolationFactor), Quaternion.Slerp(mover.InitialTickRotation, mover.TransientRotation, interpolationFactor)); Vector3 newPos = mover.Transform.position; Quaternion newRot = mover.Transform.rotation; mover.PositionDeltaFromInterpolation = newPos - mover.LatestInterpolationPosition; mover.RotationDeltaFromInterpolation = Quaternion.Inverse(mover.LatestInterpolationRotation) * newRot; mover.LatestInterpolationPosition = newPos; mover.LatestInterpolationRotation = newRot; } }
// Token: 0x060026FC RID: 9980 RVA: 0x000B4770 File Offset: 0x000B2970 public static void RegisterPhysicsMover(PhysicsMover mover) { KinematicCharacterSystem.PhysicsMovers.Add(mover); RigidbodyInterpolation interpolation = (KinematicCharacterSystem._internalInterpolationMethod == CharacterSystemInterpolationMethod.Unity) ? RigidbodyInterpolation.Interpolate : RigidbodyInterpolation.None; mover.Rigidbody.interpolation = interpolation; }
/// <summary> /// Ticks characters and/or movers /// </summary> public static void Simulate(float deltaTime, List <KinematicCharacterMotor> motors, List <PhysicsMover> movers) { int characterMotorsCount = motors.Count; int physicsMoversCount = movers.Count; #pragma warning disable 0162 // Update PhysicsMover velocities for (int i = 0; i < physicsMoversCount; i++) { movers[i].VelocityUpdate(deltaTime); } // Character controller update phase 1 for (int i = 0; i < characterMotorsCount; i++) { motors[i].UpdatePhase1(deltaTime); } // Simulate PhysicsMover displacement for (int i = 0; i < physicsMoversCount; i++) { PhysicsMover mover = movers[i]; mover.Transform.SetPositionAndRotation(mover.TransientPosition, mover.TransientRotation); mover.Rigidbody.position = mover.TransientPosition; mover.Rigidbody.rotation = mover.TransientRotation; } // Character controller update phase 2 and move for (int i = 0; i < characterMotorsCount; i++) { KinematicCharacterMotor motor = motors[i]; motor.UpdatePhase2(deltaTime); motor.Transform.SetPositionAndRotation(motor.TransientPosition, motor.TransientRotation); } Physics.SyncTransforms(); #pragma warning restore 0162 }
/// <summary> /// Registers a PhysicsMover into the system /// </summary> public static void RegisterPhysicsMover(PhysicsMover mover) { PhysicsMovers.Add(mover); mover.Rigidbody.interpolation = RigidbodyInterpolation.None; }
/// <summary> /// Unregisters a PhysicsMover from the system /// </summary> public static void UnregisterPhysicsMover(PhysicsMover mover) { PhysicsMovers.Remove(mover); }
// Token: 0x06002689 RID: 9865 RVA: 0x000B1897 File Offset: 0x000AFA97 public void SetupMover(PhysicsMover mover) { this.Mover = mover; }
// Token: 0x060026FD RID: 9981 RVA: 0x000B47A1 File Offset: 0x000B29A1 public static void UnregisterPhysicsMover(PhysicsMover mover) { KinematicCharacterSystem.PhysicsMovers.Remove(mover); }