void ProcessSyncvars() { if (NetStatus.IsServer) { m_net_acceleration = m_vehicle.Accelerator; m_net_steering = m_vehicle.Steering; m_net_braking = m_vehicle.Braking; m_net_position = m_vehicle.RigidBody.position; m_net_rotation = m_vehicle.RigidBody.rotation; m_net_linearVelocity = m_vehicle.RigidBody.velocity; m_net_angularVelocity = m_vehicle.RigidBody.angularVelocity; m_net_health = m_vehicle.Health; // wheels m_net_wheelsData.Flush(); // remove current list of changes - this ensures that only the current wheel state is sent, and prevents memory leak bug in Mirror m_net_wheelsData.Clear(); foreach (var wheel in m_vehicle.Wheels) { m_net_wheelsData.Add(new WheelSyncData() { brakeTorque = wheel.Collider.brakeTorque, motorTorque = wheel.Collider.motorTorque, steerAngle = wheel.Collider.steerAngle, //travel = wheel.Travel, localPosY = wheel.Child.localPosition.y, rpm = wheel.Collider.rpm, }); } } else { // apply input if (!this.IsControlledByLocalPlayer || (this.IsControlledByLocalPlayer && !VehicleManager.Instance.controlInputOnLocalPlayer)) { m_vehicle.Accelerator = m_net_acceleration; m_vehicle.Steering = m_net_steering; m_vehicle.Braking = m_net_braking; } // update wheels if (!this.IsControlledByLocalPlayer || (this.IsControlledByLocalPlayer && !VehicleManager.Instance.controlWheelsOnLocalPlayer)) { for (int i = 0; i < m_vehicle.Wheels.Count && i < m_net_wheelsData.Count; i++) { var w = m_vehicle.Wheels[i]; var data = m_net_wheelsData[i]; if (w.Collider != null) { w.Collider.brakeTorque = data.brakeTorque; w.Collider.motorTorque = data.motorTorque; w.Collider.steerAngle = data.steerAngle; } //w.Travel = data.travel; w.Child.SetLocalY(data.localPosY); Vehicle.UpdateWheelRotation(w, data.rpm, data.steerAngle); } } // position and rotation will be applied in syncvar hooks // apply velocity on all clients if (VehicleManager.Instance.syncLinearVelocity) { m_vehicle.RigidBody.velocity = m_net_linearVelocity; } else { m_vehicle.RigidBody.velocity = Vector3.zero; } if (VehicleManager.Instance.syncAngularVelocity) { m_vehicle.RigidBody.angularVelocity = m_net_angularVelocity; } else { m_vehicle.RigidBody.angularVelocity = Vector3.zero; } m_vehicle.Health = m_net_health; } }