Exemplo n.º 1
0
    void ServerUpdate()
    {
        if (!isServer || isLocalPlayer) //Precludes any player from being a server host
        {
            return;
        }

        Package packageData = PackageManager.GetNextDataReceived();

        if (packageData == null)
        {
            return;
        }

        Move(packageData.Horizontal * moveSpeed, packageData.Vertical * moveSpeed);

        if (transform.position == lastPosition)
        {
            return;
        }

        lastPosition = transform.position;

        ServerPackageManager.AddPackage(new ReceivePackage
        {
            X         = transform.position.x,
            Y         = transform.position.y,
            Z         = transform.position.z,
            Timestamp = packageData.Timestamp
        });
    }
Exemplo n.º 2
0
    public void RemoteClientUpdate()
    {
        if (isServer)
        {
            return;
        }

        var data = ServerPackageManager.GetNextDataReceived();

        if (data == null)
        {
            return;
        }

        if (isLocalPlayer && isPredictionEnabled)
        {
            var transmittedPackage = predictedPackages.Where(x => x.Timestamp == data.Timestamp).FirstOrDefault();
            if (transmittedPackage == null)
            {
                return;
            }

            //If the distance between where the server says player should be, and player says they are, is too high
            if (Vector3.Distance(new Vector3(transmittedPackage.X, transmittedPackage.Y, transmittedPackage.Z), new Vector3(data.X, data.Y, data.Z)) > correctionThreshold)
            {
                transform.position = new Vector3(data.X, data.Y, data.Z);
            }

            //Remove old packages
            predictedPackages.RemoveAll(x => x.Timestamp <= data.Timestamp);
        }
        else
        {
            transform.position = new Vector3(data.X, data.Y, data.Z);
        }
    }