Przechowywanie przedmiotów oraz Okna Edytora

Witam w kolejnym artykule poświęconym InventoryLight.

W tej części zajmę się bardziej złożoną częścią przechowywania przedmiotów. Mam zamiar stworzyć system okienek i edytorów pozwalający łatwiej i szybciej zarządzać Itemami i zależnościami między nimi bez zbędnego otwierania co chwile kompilatora. Unity pomaga mi w tym umożliwiając pełny dostęp do edytowania wyglądu Skryptów, oraz do tworzenia własnych okien. Właściwie to jedyne co zmieniłem w klasach tworzonych wcześniej (oprócz klasy ItemList, ta już chyba nie zostanie przeze mnie przywołana ponownie) to opatrzyłem je jedynie atrybutem [Serializable], ponieważ jest to konieczne jeśli chcemy by nasze Okno oraz Edytor czytały dane które przez nie przechodzą i je nadpisywały.

Najpierw stworzyłem prostą klasę nieco podobną do poprzedniej klasy ItemList, jednak różni się ona od niej jedną ważną rzeczą:

ItemDatabase.cs


using UnityEngine;
using System.Collections.Generic;

namespace Assets.Scripts.Items
{
[CreateAssetMenu(menuName = "ItemDatabase")]
public class ItemDatabase : ScriptableObject
{
[HideInInspector]
public List<Item> ItemList = new List<Item>();

[HideInInspector]
public List<ItemProperty> ItemProperties = new List<ItemProperty>();

[HideInInspector]
public List<ItemCategory> ItemCategories = new List<ItemCategory>();
}
}

Klasa ta dziedziczy po klasie ScriptableObject, krótko mówiąc sprawia to, że nasza klasa nie jest komponentem(skryptem), ale można do niej zapisywać w trybie edycji różne dane, które potem można wykorzystać w trybie gry i nie inaczej. Na podobnej zasadzie działają znane niektórym GUISkin‚y. Atrybut  [CreateAssetMenu], pozwala nam tworzyć obiekty tej klasy tak samo jak inne za pomocą prawego przycisku myszy.

sadas

Następnym krokiem będzie stworzenie nam Edytora dla tej bazy itemów, by móc za jego pośrednictwem otworzyć specjalne okno. Bardzo ważne jest to, że ta i następna klasa jaką stworzę musi znajdować się w folderze nazwanym jak „Editor„, inaczej otrzymamy błąd od kompilatora.

ItemDatabaseEditor.cs

[CustomEditor(typeof(ItemDatabase))]
public class ItemDatabaseEditor : Editor 
{
 public override void OnInspectorGUI()
 {
 DrawDefaultInspector();

ItemDatabase database = (ItemDatabase) target;

if (GUILayout.Button("Modify this Item Database"))
 {
 ItemDatabaseWindow.ShowWindow(database);
 }
 }
}

W ten sposób tworzę prosty przycisk dostępny po zaznaczeniu obiektu klasy ItemDatabase.

Pozostało jedynie utworzenie okna, którego jedna z metod jest widoczna w kodzie powyżej.

Niestety, ale kod źródłowy tego okna jest zbyt duży by go tu wcisnąć, więc zapraszam na moje Repozytorium poświęcone InventoryLight.

Tak naprawdę to najwięcej miejsca w kodzie klasy ItemDatabaseWindow zabierają specjalne formatowania układające przyciski i pola tekstowe w taki sposób w jaki chcę.

Efekt działania kodu tej klasy można zobaczyć na poniższym zdjęciu:

sadas

Mam obecnie pełną kontrolę nad dodawaniem nowych przedmiotów oraz edycją ich właściwości z tego okienka. Mogę je również usuwać, ale występuje wtedy błąd który zacina na moment całe okno, a potem otrzymuję w konsoli NullReferenceException. Staram się to naprawić.

To by było chyba na tyle, w przyszłych wpisach zacznę rozwijać jeszcze bardziej o nowe funkcjonalności to okno, a gdy już uznam że spełnia moje oczekiwania to przejdę do poprawnego wyświetlania tych przedmiotów.

Do zobaczenia w następnym wpisie 🙂 .

 

 

 

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ń )

Facebook photo

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

Google+ photo

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

Connecting to %s