MVC no Unity com objetos programáveis. Parte 2

Continuação da série de artigos do Cem Ugur Karacam (parte 1 pode ser lida aqui ).

Desta vez, começaremos criando várias visualizações para exibir um objeto de inventário e um painel de informações para exibir parâmetros do objeto. Uma espécie de inventário primitivo. Em seguida, focaremos na janela de inventário e concluiremos a janela de estatísticas na próxima parte.

imagem

Vamos ver em que consistirá nosso trabalho. Temos que:

  • criar componentes visuais para obter informações sobre o assunto e o inventário;
  • crie uma pré-fabricada do item no inventário;
  • preencher inventário com visualizações;
  • exibir informações no console clicando na visualização do item.

Isso é muito. Primeiro, ajuste a resolução da tela.

imagem

Usaremos objetos da interface do usuário do Unity. Crie uma tela vazia (clique com o botão direito na janela da hierarquia → UI → Tela).

imagem

Em seguida, crie dois painéis - informações sobre o item e o inventário.
Também criamos um objeto para o plano de fundo, chamamos BG e atribuímos o componente Layout Vertical a ele.

imagem

imagem

imagem

Agora os filhos de segundo plano serão alinhados verticalmente.

Vamos criar um painel dentro do BG.

imagem

No componente RectTransform, definimos apenas a altura do painel - 300 e deixamos a largura automática, sob o controle do componente Layout Vertical. Aqui estão minhas configurações para o objeto BG:

imagem

imagem

Agora duplique o painel e defina a altura para 440.

imagem

Então, damos aos painéis os nomes corretos.

imagem

Deve ficar assim:

imagem

A história do trabalho em um objeto InfoPanel continuará na próxima parte.

Vamos preparar uma exibição para o item do inventário e salvá-lo como uma pré-fabricada. Crie um botão dentro do painel. Para obter a exibição correta dos itens no inventário, adicione o conveniente componente Grid Layout Group ao objeto InventoryPanel.

imagem

Agora, cada objeto filho do painel de inventário será colocado na tela de acordo com as configurações de grade no componente Grupo de Layout de Grade. Vamos voltar ao botão.

imagem

O botão não funciona corretamente porque ainda não configuramos a grade. Por enquanto, adicione o objeto Image ao botão como filho do ícone do item e remova o sinalizador Raycast Target do componente Image para que clicar na imagem não faça com que o botão seja clicado.

imagem

Agora copie o botão várias vezes. Quatro cópias serão suficientes para esta lição. Veja como deve ficar:

imagem

Antes de prosseguir, precisamos criar um script para representar o assunto. Ele será responsável por armazenar informações sobre o item do inventário e responderá ao evento de clicar no botão (por enquanto, nos limitaremos a exibir o comando Debug.Log no console).

Crie um novo script e chame-o de ItemView.

imagem

O ItemView é responsável pelo armazenamento de dados, apresentação visual, processamento de cliques e estado inicial antes de carregar os dados.

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class ItemView : MonoBehaviour { public Button button; public Image ItemIcon; private ItemData itemData; } 

Crie um método para definir o estado inicial.

 using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class ItemView : MonoBehaviour { public Button button; public Image itemIcon; private ItemData itemData; public void InitItem(ItemData item) { this.itemData = item; button.onClick.AddListener(ButtonClicked); } private void ButtonClicked() { Debug.Log(itemData.name); } } 

Eu acho que para o nosso projeto você precisará de vários ícones. Encontrei um kit gratuito na Asset Store. Vamos adicioná-lo ao projeto.

imagem

Agora você pode adicionar uma variável que armazenará o ícone do item dentro da classe ItemData.

 using UnityEngine; [CreateAssetMenu] public class ItemData : ScriptableObject { public string itemName; public ItemType type; public float attack; public Sprite icon; public float GetPrice() { return attack * 40; } } public enum ItemType { Dagger, Axe, Hammer, Potion } 

Agora, no ItemView , podemos adicionar um ícone à exibição.

 public void InitItem(ItemData item) { this.itemData = item; itemIcon.sprite = itemData.icon; button.onClick.AddListener(ButtonClicked); } 

Adicione um script ao botão na cena e renomeie o objeto com o botão para Item. Depois disso, atribuiremos um objeto ImageIcon no campo ItemIcon.

imagem

Exclua os três botões restantes, pois eles eram necessários para configurar a grade e salve o objeto Item como uma pré-fabricada, arrastando-o para a janela do projeto.

imagem

A apresentação está quase pronta. Precisamos de 4 itens para preencher o inventário. Criaremos e atribuiremos ícones aos modelos que fizemos na lição anterior.

imagem

Feito. Agora crie um script ItemViewController.

 using System.Collections; using System.Collections.Generic; using UnityEngine; public class ItemViewController : MonoBehaviour { public Inventory inventoryHolder; public Transform inventoryViewParent; public GameObject itemViewPrefab; private void Start() { foreach (var item in inventoryHolder.inventory) { var itemGO = GameObject.Instantiate(itemViewPrefab, inventoryViewParent); itemGO.GetComponent<ItemView>().InitItem(item); } } } 

Portanto, temos um link para o inventário que armazena ItemData criado na pasta do projeto, um link para o InventoryPanel para criar visualizações como filhos deste painel e um link para a pré-fabricada que contém a própria exibição do item.

Agora, no método Start , crie uma instância da apresentação do item e chame o método InitItem para preencher os dados da apresentação com dados do modelo para cada item de inventário.

Bem, finalmente, crie um objeto vazio na cena, anexe o script do controlador e atribua links aos objetos necessários na cena.

imagem

Verifique se todos os itens estão atribuídos no inventário.

imagem

Fizemos bastante. Agora vamos ver como tudo funciona.

imagem

Itens criados, mas esqueci de remover o objeto Texto do botão. No Unity, os botões são criados por padrão com o texto. Abra a pré-fabricada que salvamos no projeto e exclua o objeto Texto. Salve a casa pré-fabricada e volte para a cena.

imagem

Agora teste novamente.

imagem

Parabéns, tudo funciona.

Na próxima parte, trataremos do painel de informações.

Source: https://habr.com/ru/post/pt478602/


All Articles