示例#1
0
        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;
            }
        }