Очень странно!Мой список возвращает ArgumentOutofRangeException при попытке добавить - PullRequest
0 голосов
/ 29 марта 2019

Я делаю список задач, которые должна выполнить программа, и поэтому я запустил объект List. Этот список является списком другого класса, который содержит информацию о том, что делать (задача) в зависимости от типа (целое число). Это разговор между Хозяином и Клиентом, что у них обоих есть класс (немного разные, только мое понимание типов (тип задачи клиента 0! = Тип задачи хоста 0)), и мой список Хостов работает отлично, но клиент не .

Мой список NetObjects возвращает ArgumentOutOfRangeException при попытке добавить класс (для NetObject) (я оставлю примеры кода ниже). Я не знаю, почему это так, поскольку список должен быть бесконечным, а когда вы добавляете, индекс отсутствует или что-то еще (он говорит, что индекс должен быть неотрицательным и меньше размера коллекции).

Вот ошибка:

ArgumentOutOfRangeException: индекс был вне диапазона. Должен быть неотрицательным и меньшим, чем размер коллекции. Имя параметра: индекс System.ThrowHelper.ThrowArgumentOutOfRangeException (аргумент System.ExceptionArgument, ресурс System.ExceptionResource) (в: 0) System.ThrowHelper.ThrowArgumentOutOfRangeException () (в: 0) System.Collections.Generic.List`1 [T] .get_Item (индекс System.Int32) (в: 0) Networking.Update () (в разделе Активы / Сценарии / Networking.cs: 225)

Он говорит что-то о элементе get, что я не знаю почему, потому что я использую (в коде) ссылку на задачу с индексом (читая ее), и это происходит только тогда, когда я хочу добавить в NetObject Класс объектов. Я покажу код хоста, потому что он работает, а клиент - нет, и я не понимаю, почему.

Я пытался поставить блокировку, чтобы сделать ее лучше (чтобы не было переопределения), но не сделал ничего, кроме как сделать ее лучше с моей точки зрения.

Это та часть клиента, в которой выполняются задачи (находятся в Unity), я использовал задачи, потому что Unity не позволит изменять игровые вещи (положение, порождение и т. Д.), Если это не из основного потока (и Я использую потоки для получения и отправки информации (общение между клиентом и хостом).

for (int i = 0; i < PendingClient.Count; i++) {
            if (PendingClient[i].id > -1)
                lock (lockingClient) {
                    switch (PendingClient[i].type) {
                        case 0:
                            GameObject go = null;
                            if (GetObjectFromId(PendingClient[i].id, ref go)) {
                                go.transform.position = new Vector3(PendingClient[i].px,
                                PendingClient[i].py, PendingClient[i].pz);

                                go.transform.rotation = Quaternion.Euler(PendingClient[i].rx,
                                PendingClient[i].ry, PendingClient[i].rz);
                            } else {
                                Objects.Add(new NetObject(PendingClient[i].id,
                                PendingClient[i].objectType, PendingClient[i].name,
                                PendingHost[i].prefabName,
                                Instantiate(Resources.Load("Prefabs/" +
                                PendingClient[i].prefabName) as GameObject,
                                new Vector3(PendingClient[i].px, PendingClient[i].py,
                                PendingClient[i].pz), Quaternion.Euler(PendingClient[i].rx,
                                PendingClient[i].ry, PendingClient[i].rz))));
                            }
                            break;
                    }
                    PendingClient.RemoveAt(i);
                }
        }

Ошибка появляется прямо под последним.

И код хоста, который работает:

for (int i = 0; i < PendingHost.Count; i++) {
            lock (lockingHost) {
                if (PendingHost[i].id > -1) {
                    switch (PendingHost[i].type) {
                        case 0: // Add Object
                            Objects.Add(new NetObject(PendingHost[i].id, PendingHost[i].objectType, PendingHost[i].name, PendingHost[i].prefabName, Instantiate(Resources.Load("Prefabs/" + PendingHost[i].prefabName) as GameObject, Vector3.zero, Quaternion.identity)));
                            break;
                        case 1: // Change Transform
                            GameObject go = null;
                            GetObjectFromId(PendingHost[i].id, ref go);
                            go.transform.position = new Vector3(PendingHost[i].px, PendingHost[i].py, PendingHost[i].pz);
                            go.transform.rotation = Quaternion.Euler(PendingHost[i].rx, PendingHost[i].ry, PendingHost[i].rz);
                            break;
                    }
                    PendingHost.Remove(PendingHost[i]);
                }
            }
        }

Я не инженер по информатике, но я пытался сделать лучший код, какой только мог.

Спасибо за продвижение.

1 Ответ

3 голосов
/ 29 марта 2019

Вы звоните

PendingClient.RemoveAt(i);

внутри

for (int i = 0; i < PendingClient.Count; i++) {

, поэтому i в конечном итоге выходит за пределы диапазона.

В сторону: вместоделая PendingClient[i] дюжину раз, сделайте

var current = PendingClient[i] заранее и затем используйте current.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...