Wyświetlania receptur ciąg dalszy…

Witam w kolejnym wpisie poświęconym Inventory Light – sekcji wytwarzania własnych przedmiotów.

Udało mi się rozwinąć nieco klasę RequirementDisplayer.

Teraz może ona odpowiadać na żądania od klasy RecipeButton. To znaczy, że klasa RequirementDisplayer nie sprawdza zmian klatka po klatce, ale wtedy, kiedy nacisnę przycisk RecipeButton.


public void Call(Recipe rec)
{
if (rec.OutputID != lastCalledRecipeID)
{
if (transform.childCount != 0)
{
foreach (Transform t in transform)
{
Destroy(t.gameObject);
}
}

Dictionary<int, int> IdsDictionary = new Dictionary<int, int>();
if (transform.childCount == 0)
{
foreach (Item i in rec.RequiredData)
{
if (!IdsDictionary.ContainsKey(i.ID))
{
int count = 0;
for (int j = 0; j < rec.RequiredData.Count; j++)
{
if (rec.RequiredData[j].ID == i.ID)
{
count++;
}
}
IdsDictionary.Add(i.ID, count);
}
}

foreach (var value in IdsDictionary)
{
GameObject itemInstance = Instantiate(ItemPrefab).gameObject;
itemInstance.transform.GetComponent<Image>().sprite = database.ItemByID(value.Key).Icon;
itemInstance.transform.GetChild(0).GetComponent<Text>().text = value.Value.ToString();
Destroy(itemInstance.GetComponent<ItemData>());
Destroy(itemInstance.GetComponent<LayoutElement>());

itemInstance.transform.SetParent(transform);
itemInstance.GetComponent<RectTransform>().anchoredPosition = Vector2.zero;
}
lastCalledRecipeID = rec.OutputID;
}
}
}

Sprawę stackowania się przedmiotów rozwiązałem tutaj za pomocą słownika.

Słownik jest to nieco bardziej rozbudowana lista, z podobnymi metodami, ale działająca na nieco innej zasadzie.

Lista przechowuje obiekty tak jak zwykła tablica jednowymiarowa, natomiast słownik oprócz tego, że je w ten sposób przechowuje, to każda wartość ma swój klucz, a każdy klucz ma swoją wartość. Słowniki tworzy się w następujący sposób:


Dictionary<string,int> MyDictionary = new Dictionary<string,int>();

Zgodnie z kolejnością w nawiasach domkniętych, typ string jest kluczem, a typ int jest wartością zwracaną.

Kolejne elementy moge dodać do słownika podobnie jak do listy, nie zapominając o kluczach:


MyDictionary.Add("Ania", 15);

MyDictionary.Add("Natalia,", 18);

MyDictionary.Add("Jacek",22);

//Konsola wydrukuje mi liczbę 22

Console.WriteLine(MyDictionary["Jacek"].ToString());

Jest to niezwykle wygodne w niektórych sytuacjach, jak na przykład w mojej, gdzie przekształciłem ciąg pojedynczych przedmiotów w jeden słownik z ID jako kluczem i Ilością jako wartością. W ten sposób dane są pakowane do tego słownika i następnie na podstawie tego słownika są tworzone GameObjecty dla każdego niepowtarzalnego ID, a Ilość jest to wartość Amount dziecka tego obiektu.

Wynik jest przedstawiony na obrazku poniżej. Wygląd edytora receptur się w ogóle nie zmienił, dowolność edycji interfejsu UI, przy zachowaniu pewnych standardów w hierarchii pozostał nienaruszony.

Receptura na miecz z brązu (bardzo realistyczna):

Bez tytułu

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s