当前位置:网站首页>Unity Advanced Backpack System
Unity Advanced Backpack System
2022-06-11 04:21:00 【Mois de mer】
Préface
Un système de sac à dos rudimentaire a été mis en place avant,Il n'a pas classé les articles.
Cette fois, le stockage et l'affichage classifiés des articles ont été ajoutés.
AssetStructure de
Pour la gestion classifiée des articles,InScriptableObjectUtilisez la liste pour stocker trois types d'articles,Armes, respectivement.、Nourriture et matériaux.Les éléments de cette liste sont une classe spéciale,Il contient le nom de ces articles,Et une liste de ces articles stockés.Dans le tableau de configuration de l'article,Ce qui est stockéItemObjet de classe,Dans la fiche technique du sac à dos,Ce qui est stockéInventoryItemObjet,La différence est,InventoryItemL'objet de la classe a plus d'un nombre d'attributs.


Numéro de l'article
101~199 C'est une arme.
201~299 C'est de la nourriture
301~399 C'est du matériel.
Déterminer le type d'article,Avec des objets index / 100 C'est tout..
Code
Liste de configuration des articles
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu]
public class ItemsConfigurationAdvanced : ScriptableObject
{
[Header(" Liste des catégories d'articles ")]
public List<ItemList> lists;
}
[System.Serializable]
public class ItemList
{
public string listName;
public List<Item> items;
}Liste de configuration des articles de sac à dos
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu]
public class InventoryConfigurationAdvanced : ScriptableObject
{
[Header(" Liste des catégories d'articles détenus par le joueur ")]
public List<InventoryItemList> lists;
}
[System.Serializable]
public class InventoryItemList
{
public string listName;
public List<InventoryItem> items;
public InventoryItemList(string name)
{
listName = name;
items = new List<InventoryItem>();
}
}Sac à dos
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[Serializable]
public class InventoryItem : Item
{
public int num;
public InventoryItem(Item item, int num) : base(item)
{
this.num = num;
}
}Note:: Le constructeur de la classe sac à dos appelle le constructeur de copie de la classe de base
Catégorie d'articles
using System;
using UnityEngine;
using UnityEngine.UI;
[Serializable]
public class Item
{
public int id;
public string name;
public string description;
public Texture2D icon;
public GameObject model;
public Item(Item item)
{
id = item.id;
name = item.name;
description = item.description;
icon = item.icon;
model = item.model;
}
}Item Data Manager
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// Fournir des listes de configuration des articles et des articles de sac à dos
/// </summary>
public class BackpackManagerAdvanced : Singleton<BackpackManagerAdvanced>
{
public ItemsConfigurationAdvanced itemsConfiguration = Resources.Load<ItemsConfigurationAdvanced>("Configurations/Items Configuration Advanced");
public InventoryConfigurationAdvanced inventoryConfiguration = Resources.Load<InventoryConfigurationAdvanced>("Configurations/Inventory Configuration Advanced");
/// <summary>
/// Obtenir un article numéroté à partir d'un sac à dos
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
InventoryItem Contains(int index)
{
if (inventoryConfiguration.lists == null)
{
inventoryConfiguration.lists = new List<InventoryItemList>();
}
if(inventoryConfiguration.lists[index / 100 - 1] == null)
{
inventoryConfiguration.lists[index / 100 - 1] = new InventoryItemList(itemsConfiguration.lists[index / 100 - 1].listName);
}
foreach (var i in inventoryConfiguration.lists[index / 100 - 1].items)
{
if (i.id == index)
return i;
}
return null;
}
/// <summary>
/// Enregistrer l'article numéroté spécifié dans le sac à dos
/// </summary>
/// <param name="index"></param>
public void SaveItemToInventory(int index)
{
InventoryItem temp = Contains(index);
if (temp != null)
temp.num++;
else
inventoryConfiguration.lists[index / 100 - 1].items.Add(new InventoryItem(GetItem(index), 1));
}
/// <summary>
/// Obtenir l'article numéroté spécifié à partir du tableau de configuration de l'article
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public Item GetItem(int index)
{
foreach (var i in itemsConfiguration.lists[index / 100 - 1].items)
{
if (i.id == index)
return i;
}
return null;
}
}Classe de panneau de sac à dos
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class BackpackPanel : BasePanel
{
static readonly string path = "Prefabs/UI/BackpackPanel";
public BackpackPanel() : base(new PanelType(path)) { }
/*-----------Paramètres configurables-----------*/
public int column = 5; //Nombre de colonnes
public float itemSize = 280; // Taille de la grille de l'article
public float interval = 20; // Écart entre les grilles
public float viewPortHeight = 1500; //Hauteur de la fenêtre
// Enregistrer l'index le plus élevé affiché la dernière fois , Pour enlever les grilles invisibles
int lastMinDisplayIndex;
int lastMaxDisplayIndex;
// Conteneur pour la liste de diapositives
public RectTransform content;
// Stocke la grille et le numéro actuellement affichés
Dictionary<int, GameObject> curDisplayGrids = new Dictionary<int, GameObject>();
public Item selectedItem;// Éléments actuellement sélectionnés
public override void OnEnter()
{
panelBindingTool.GetOrAddComponentInChildren<Button>("Fermer").onClick.AddListener(() =>
{
panelStack.Pop();
}
);
panelBindingTool.GetOrAddComponentInChildren<Button>("Détails").onClick.AddListener(() =>
{
panelStack.Push(new ItemDetailPanel(selectedItem));
}
);
panelBindingTool.GetOrAddComponentInChildren<Button>("Armes").onClick.AddListener(() =>
{
listIndex = 1;
InitThisTypeOfBackpack();
}
);
panelBindingTool.GetOrAddComponentInChildren<Button>("Alimentation").onClick.AddListener(() =>
{
listIndex = 2;
InitThisTypeOfBackpack();
}
);
panelBindingTool.GetOrAddComponentInChildren<Button>("Matériaux").onClick.AddListener(() =>
{
listIndex = 3;
InitThisTypeOfBackpack();
}
);
InitThisTypeOfBackpack();
OrbitCamera.Instance.work = false;
}
int listIndex = 1;// Catégories d'articles actuellement affichées 100~199 Armes 200~299 Alimentation 300~399 Matériaux
void InitThisTypeOfBackpack()
{
DestroyCurDisplayGrids();
content = panelBindingTool.GetOrAddComponentInChildren<RectTransform>("Content"); // Obtenir les composants du conteneur
content.sizeDelta = new Vector2(0, Mathf.CeilToInt(BackpackManagerAdvanced.Instance.inventoryConfiguration.lists[listIndex-1].items.Count / column) * (itemSize + interval)); // Calculer la hauteur du conteneur en fonction du nombre d'articles (Arrondi vers le Haut)
GameManager.Instance.listIndex = listIndex;
GameManager.Instance.MethodField = DisplayBackpackGridAdvanced; //Oui.DisplayBagItemInjection de fonctionGameManagerDeUpdateMoyenne,Mise à jour en temps réel
// Afficher initialement le premier élément
DisplayItemBeief(BackpackManagerAdvanced.Instance.inventoryConfiguration.lists[listIndex-1].items[0]);
selectedItem = BackpackManagerAdvanced.Instance.inventoryConfiguration.lists[listIndex-1].items[0];
}
void DestroyCurDisplayGrids()
{
for(int i = 0;i<curDisplayGrids.Count;i++)
{
GameObject.Destroy(curDisplayGrids[i]);
}
curDisplayGrids.Clear();
lastMinDisplayIndex = 0;
lastMaxDisplayIndex = 0;
}
// Détruire la grille affichée et initialiser les paramètres connexes
public override void OnExit()
{
GameManager.Instance.NonMonoUpdateMethod = null; // Annuler l’injection
GameManager.Instance.MethodField = null; // Annuler l’injection
panelManager.DestroyPanel(this.panelType);
OrbitCamera.Instance.work = true;
}
public override void OnPause()
{
panelBindingTool.GetOrAddComponent<CanvasGroup>().blocksRaycasts = false;
}
public override void OnResume()
{
panelBindingTool.GetOrAddComponent<CanvasGroup>().blocksRaycasts = true;
}
public void DisplayItemBeief(Item item)
{
panelBindingTool.GetOrAddComponentInChildren<Text>("Item Name").text = item.name;
panelBindingTool.GetOrAddComponentInChildren<Text>("Item Description").text = item.description;
panelBindingTool.GetOrAddComponentInChildren<Image>("Item Image").sprite = Sprite.Create(item.icon, new Rect(0, 0, item.icon.width, item.icon.height), new Vector2(0.5f, 0.5f));
}
public void DisplayBackpackGridAdvanced(int listIndex)
{
/*----------- Calculer la plage visible -----------*/
int minDisplayIndex = (int)(content.anchoredPosition.y / (itemSize + interval)) * column; //Arrondi vers le bas: 0,0 190,3 950,15
int maxDisplayIndex = (int)((content.anchoredPosition.y + viewPortHeight) / (itemSize + interval)) * column + column; // Dans la colonne suivante , Il faut montrer un peu. , Donc vous avez besoin d'une ligne supplémentaire
/*----------- Ne pas afficher hors de portée -----------*/
if (minDisplayIndex < 0)
minDisplayIndex = 0;
if (maxDisplayIndex > BackpackManagerAdvanced.Instance.inventoryConfiguration.lists[listIndex-1].items.Count)
maxDisplayIndex = BackpackManagerAdvanced.Instance.inventoryConfiguration.lists[listIndex-1].items.Count;
/*--------- Afficher les grilles dans la plage visible ------*/
for (int i = minDisplayIndex; i < maxDisplayIndex; i++)
{
if (curDisplayGrids.ContainsKey(i)) // Grilles affichées ,Ne pas recréer
continue;
else
{
GameObject obj = PoolManager.Instance.getObject("BackpackGrid", "Prefabs/UI/BackpackGrid"); // Grille non affichée , Obtenir à partir du pool
obj.transform.SetParent(content);
obj.transform.localPosition = new Vector3(i % column * (itemSize + interval), i / column * (itemSize + interval) * (-1), 0); // Placer la grille dans la bonne position
obj.GetComponent<BackpackGrid>().InitInfo(BackpackManagerAdvanced.Instance.inventoryConfiguration.lists[listIndex-1].items[i]); //Initialisation des informations de la grille
obj.GetComponent<BackpackGrid>().OnClick(this, BackpackManagerAdvanced.Instance.inventoryConfiguration.lists[listIndex-1].items[i]);
curDisplayGrids[i] = obj; // Saisissez la grille actuellement affichée dans le dictionnaire par numéro
}
}
/*---------- Supprimer les grilles invisibles ---------*/
for (int i = lastMaxDisplayIndex; i > maxDisplayIndex; i--)
{
if (curDisplayGrids.ContainsKey(i))
{
PoolManager.Instance.recycleObject("BackpackGrid", curDisplayGrids[i]);
curDisplayGrids.Remove(i);
}
}
for (int i = lastMinDisplayIndex; i < minDisplayIndex; i++)
{
if (curDisplayGrids.ContainsKey(i))
{
PoolManager.Instance.recycleObject("BackpackGrid", curDisplayGrids[i]);
curDisplayGrids.Remove(i);
}
}
lastMaxDisplayIndex = maxDisplayIndex;
lastMinDisplayIndex = minDisplayIndex;
}
}Effets

边栏推荐
- JVM (4): active and passive use of classes, internal structure of runtime data area, JVM thread description, PC register
- Embedded basic interface UART
- JVM(7):动态链接、方法的调用、四种方法调用指令区分非虚方法和虚方法、invokedynamic指令的使用
- Market prospect analysis and Research Report of surround packing machine in 2022
- Market prospect analysis and Research Report of pipe and hose press fitting tools in 2022
- Vulkan official example interpretation shadows (rasterization)
- 再聊数据中心网络
- Guanghetong LTE Cat4 module l716 is upgraded to provide affordable and universal wireless applications for the IOT industry
- 未來已來,5G-Advanced時代開啟
- 2022 love analysis · privacy computing vendor panoramic report | love Analysis Report
猜你喜欢

为了实现零丢包,数据中心网络到底有多拼?

Eth relay interface

2022 年 5 月产品大事记

From the first generation of sowing to the first generation of flowers, 5g commercial "gave birth to all things" for the third anniversary

Rational use of thread pool and thread variables

MySql索引

给你一个项目,你将如何开展性能测试工作?

Guanghetong won the "science and Technology Collaboration Award" of Hello travel, driving two rounds of green industries to embrace digital intelligence transformation

三层带防护内网红队靶场

mysql存储过程
随机推荐
This artifact is highly recommended. One line command will convert the web page to PDF!
司马炎爷爷 告诉你什么叫做内卷!
Methods to detect whether PHP websites have been broken
数字电影的KDM是什么?
SQL optimization
Some differences between people
From the first generation of sowing to the first generation of flowers, 5g commercial "gave birth to all things" for the third anniversary
Market prospect analysis and Research Report of single photon counting detector in 2022
Feature selection algorithm based on bare bones particleswarm optimization
D structure as index of multidimensional array
Esp32 gattc configuration UUID
直播助力杭州电商独角兽冲击上市,分账系统重构电商交易新格局
JVM(7):动态链接、方法的调用、四种方法调用指令区分非虚方法和虚方法、invokedynamic指令的使用
Zhongang Mining: fluorochemical industry is the main consumption field of fluorite
What is the time-consuming domain name resolution? What are the influencing factors of domain name resolution time?
ESP8266_ RTOS modifies IP address and hostname in AP mode
Game Mathematics: calculate the points on the plane in the screen points (God's perspective)
Given a project, how will you conduct performance testing?
Vulkan-官方示例解读-Shadows(光栅化)
给你一个项目,你将如何开展性能测试工作?