Ситуация следующая - есть объект UI с имунем Lec1, на нем подвешены еще элементы текста и кнопка. Скрипт определяет номер (1), по нему обращается к скрипту в котором созданы экземпляры другого класса и уложены в список. В первом объекте все отлично, а если создать дубликат объекта, то первый объект все нормально меняет в полях, а второй выдает ощибку ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index скрипт с базой экземпляров:
using System.Collections; using System.Collections.Generic; using UnityEngine;
public class LecCont : MonoBehaviour//Создание базы лекарств { // Start is called before the first frame update public List<Lecarstvo> listLecarstvos = new List<Lecarstvo>(); public Lecarstvo Lek1; public Lecarstvo Lek2; public Lecarstvo Lek3; // Start is called before the first frame update void Awake() { Lek(); } void Lek()//Создание экземпляров лекарств и занесение их в список { Lek1 = new Lecarstvo("Лекарство от голода", 15f, 1, 1, 15, 1, 1); listLecarstvos.Add(Lek1); Lek2 = new Lecarstvo("Лекарство от совести", 500f, 0, 0, 35, 1, 1); listLecarstvos.Add(Lek2); Lek3 = new Lecarstvo("Лекарство от глаза", 5000f, 0, 0, 35, 1, 1); listLecarstvos.Add(Lek3);
} }
public class Lecarstvo {
public string name; //название public float startCost; //стартовая стоимость public int currentNumber; //число на складе public int numberOfWorkers; //количество работников на заводе public int costForSell; //стоимость продажи в аптеке стартовая public float prodUpgrade; //кэффициент производства public float costUpgrade; //коэффициент к цене в аптеке
public Lecarstvo(string name, float startCost, int currentNumber, int numberOfWorkers, int costForSell, float prodUpgrade, float costUpgrade) //класс для лекарств { this.name = name; this.startCost = startCost; this.currentNumber = currentNumber; this.numberOfWorkers = numberOfWorkers; this.costForSell = costForSell; this.prodUpgrade = prodUpgrade; this.costUpgrade = costUpgrade; }
}
Скрипт с вызовом этих экземпляров и заполнением полей
using System; using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.UI;
public class RightPanelSorter : MonoBehaviour { #region LocalPeremennie public string lecarstvoName;//название лекарства public int lecarsvaSklad;//лекарств на складе public float lecarstvoCostUp;//Стоимость покупки рабочего public int lecarstvoWorkers;//Количество рабочих [HideInInspector] public int numberOfLecarstva;//порядковый номер лекарства private GameObject GM; private LecCont Lc; #endregion
#region PublicGO public TextMeshProUGUI aname;//поле с именем public Text asklad;//поле с количеством на складе public Text acost;//поле со стоимостью апгрейда public Text aworkers;//поле с рабочими public Button aupButton;//доступ к кнопке #endregion
private void Awake() { GM=GameObject.Find("GameManager"); Lc = GM.GetComponent<LecCont>();//Доступ к базе лекаств zapolnenie();
Добавлено (05 Января 2024, 19:10) --------------------------------------------- от второго объекта приходит отклик, что он определил номер кнопки, вычел единицу и знает номер обращения к списку - 1, но дальше происходит лажа, как я понимаю, скрипт со второго объекта уже не может обратиться к базе, даже если все параметры поставить 0, чтобы выдавал те же данные что и первый объект. Возможно есть боле простой способ хранения данных стороннего класса с укладывание в базу??
Сообщение отредактировал Seleborn - Пятница, 05 Января 2024, 19:11
Попробуй обмазать там всё логами вида Debug.Log("@@@ 1"); Debug.Log("@@@ 2"); ну или как удобно посмотри в каком порядке создаётся объект и дубликат. может выходит что дубликат обращается к списку когда он еще не заполнен. вообще у объекта и дубликата используй start вместо awake. а у gamemanager awake так они заведомо будут позже обращаться. как вариант.