Wyświetlanie przepisów w UI

Witam w kolejnym wpisie poświęconym IL.

Jest to kolejny wpis poświęcony Craftingowi, w tej części uda mi się wyświetlić w scrollowanej liście przyciski odpowiadające wszystkim przepisom z bazy.

W tym celu wykorzystałem kilka prostych komponentów Unity UI do zbudowania tej scrollowanej listy, oraz przygotowałem zwykły przycisk wyposażony w mój skrypt RecipeButton, zawiera on dane niezbędne do poinformowania po kliknięciu nadrzędny komponent tj. RequirementDisplayer, który później nakieruje odpowiednie elementy UI na wyświetlenie contentu dla tej receptury.

RecipeButton.cs


public class RecipeButton : MonoBehaviour
{
Transform buttonContainer;
RequirementDisplayer displayer;
public Recipe holdedRecipe;

void Start()
{
buttonContainer = transform.parent.parent;

foreach(Transform t in buttonContainer.parent.transform)
{
if(t.GetComponent<RequirementDisplayer>() != null)
{
displayer = t.GetComponent<RequirementDisplayer>();
break;
}
}

if (holdedRecipe == null)
{
holdedRecipe = displayer.database.Recipes[transform.GetSiblingIndex()];
}
}

public void CallDisplayer()
{
print(displayer.database.ItemByID(holdedRecipe.OutputID).Name);
}
}

RequirementDisplayer.cs


public class RequirementDisplayer : MonoBehaviour
{

// Use this for initialization
public ItemDatabase database;

[SerializeField]
Transform recipeButtonPrefab;

[SerializeField]
Transform Grid;

void Start ()
{
if (recipeButtonPrefab != null)
{
for (int i = 0; i < database.Recipes.Count; i++)
{
GameObject recipeButtonInstance = Instantiate(recipeButtonPrefab).gameObject;
recipeButtonInstance.transform.SetParent(Grid.transform);

RecipeButton rb = recipeButtonInstance.AddComponent<RecipeButton>();
recipeButtonInstance.GetComponent<Button>().onClick.AddListener(new UnityEngine.Events.UnityAction(rb.CallDisplayer));

if (rb.holdedRecipe == null)
{
rb.holdedRecipe = database.Recipes[rb.transform.GetSiblingIndex()];
}
recipeButtonInstance.transform.GetChild(0).GetComponent<Text>().text = database.ItemByID(rb.holdedRecipe.OutputID).Name.ToString();
}
}
}

// Update is called once per frame
void Update () {

}
}

Jak widać, sam komponent RecipeButton nie jest przechowywany w samym prefabie, a jest dodawany przez RequirementDisplayer ponieważ w ten sposób mogę mu przypisać funkcję dla tego konkretnego przycisku oraz przypisać mu konkretną recepture na podstawie bazy, co nie byłoby chyba możliwe w trybie Edycji.

RecipeManager

 

 

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