Unity. Передача List<> в другой класс/
Пытаюсь сделать магазин и инвентарь скинов (на разных сценах). В магазине данные о предмете у меня содержатся в компоненте List, который я заполняю в инспекторе. Не знаю, насколько это целесообразно, посмотрел такую реализацию на YouTube, но магазин и инвентарь были реализованы в одной сцене через панели.
Не знаю, как реализовать передачу этого компонента в скрипт для инвентаря. Было бы неплохо, если в скрипте для инвентаря, был бы такой же List.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ShopManager : MonoBehaviour
{
[System.Serializable] public class ShopItem
{
public Sprite Image;
public int Price;
public bool IsPurchased = false;
}
public List<ShopItem> ShopItemsList;
[SerializeField] Animator NoCoinsAnimation;
[SerializeField] public Transform ShopScrollView;
[SerializeField]public Button BuyButton;
private GameObject _itemTemplate;
private GameObject _gObject;
private int _money;
private void Start()
{
_money = PlayerPrefs.GetInt("Money");
int lenght = ShopItemsList.Count;
_itemTemplate = GameObject.FindWithTag("Template");
for (int i = 0; i < lenght; i++)
{
_gObject = Instantiate(_itemTemplate, ShopScrollView);
_gObject.transform.GetChild(0).GetComponent<Image>().sprite = ShopItemsList[i].Image;
_gObject.transform.GetChild(1).GetChild(0).GetChild(0).GetComponent<Text>().text = ShopItemsList[i].Price.ToString();
BuyButton = _gObject.transform.GetChild(1).GetComponent<Button>();
BuyButton.interactable = !ShopItemsList[i].IsPurchased;
BuyButton.AddEventListener(i, OnShopItemButtonClicked);
}
Destroy(_itemTemplate);
}
private void OnShopItemButtonClicked(int itemIndex)
{
if (_money >= ShopItemsList[itemIndex].Price)
{
ShopItemsList[itemIndex].IsPurchased = true;
_money -= ShopItemsList[itemIndex].Price;
PlayerPrefs.SetInt("Money", _money);
BuyButton = ShopScrollView.GetChild(itemIndex).GetChild(1).GetComponent<Button>();
BuyButton.interactable = false;
BuyButton.image.color = new Color(0, 0, 0);
}
else
{
NoCoinsAnimation.SetTrigger("NoCoins");
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;
public static class ButtonEvent
{
public static void AddEventListener<T>(this Button button, T parametr, Action<T> OnClick)
{
button.onClick.AddListener(delegate (){
OnClick(parametr);
});
}
}
Ответы (1 шт):
Автор решения: Даниил Ганин
→ Ссылка
Предлагаю создать в скрипте инвентаря две переменные:
public ShopManager SM;
private List<SM.ShopItem> ShopItemL;
В методе "Start()" берем значение из "SM" и передаем его в "ShopItemL"
ShopItemL = SM.ShopItemL;
Перетаскиваем Скрипт "ShopManager" в скрипт инвентаря
