void Update() { // reset input this.MyPed.ResetInput(); // follow player instance if (Ped.Instance != null) { Vector3 targetPos = Ped.InstancePos; float currentStoppingDistance = this.stoppingDistance; if (Ped.Instance.IsInVehicleSeat && !this.MyPed.IsInVehicle) { // find a free vehicle seat to enter vehicle var vehicle = Ped.Instance.CurrentVehicle; // var seat = Player.Instance.CurrentVehicleSeatAlignment; var closestfreeSeat = Ped.GetFreeSeats(vehicle).Select(sa => new { sa = sa, tr = vehicle.GetSeatTransform(sa) }) .OrderBy(s => s.tr.Distance(this.transform.position)) .FirstOrDefault(); if (closestfreeSeat != null) { // check if it is in range if (closestfreeSeat.tr.Distance(this.transform.position) < this.MyPed.EnterVehicleRadius) { // the seat is in range this.MyPed.EnterVehicle(vehicle, closestfreeSeat.sa); } else { // the seat is not in range // move towards this seat targetPos = closestfreeSeat.tr.position; currentStoppingDistance = 0.1f; } } } else if (!Ped.Instance.IsInVehicle && this.MyPed.IsInVehicleSeat) { // target player is not in vehicle, and ours is // exit the vehicle this.MyPed.ExitVehicle(); } if (this.MyPed.IsInVehicle) { return; } Vector3 diff = targetPos - this.transform.position; float distance = diff.magnitude; if (distance > currentStoppingDistance) { Vector3 diffDir = diff.normalized; this.MyPed.IsRunOn = true; this.MyPed.Movement = diffDir; this.MyPed.Heading = diffDir; } } }