視頻參考:Unity教程:背包系統:04:顯示在背包里(C# code) InventoryManager_嗶哩嗶哩_bilibili
素材下載:
https://pan.baidu.com/s/1o7_RW_QQ1rrAbDzT69ApRw
提取碼: 8s95
目錄
創建Item腳本(logic:存盤資料)
----創建背包腳本Inventory
創建觸發條件:ItemOnWorld
創建背包格子腳本:slot
實作功能,點擊物品彈出描述在slot里面添加
系結按鈕點擊
創建Inventorymanager掛載在畫布上控制腳本
1.創建panel(修改為居中模式:這樣就可以調節長寬高)起名叫:Bag 515 415
就是弄個背景框,弄個grid lay out
-----
2.創建資料庫
使用:ScriptableObject API->不用掛載在腳本上
創建Item腳本(logic:存盤資料)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName ="New Item",menuName ="Inventory/New Item")]//默認名字,右鍵選單叫什么名字/
/// <summary>
/// 屬性
/// </summary>
public class Items : ScriptableObject
{/// <summary>
/// 物品的名字
/// </summary>
public string itemName;
/// <summary>
/// 物品的圖片
/// </summary>
public Sprite itemImage;
public int ItemHeld;///數量
[TextArea]//多段描述,單行描述就不用加了
/// <summary>
/// 介紹
/// </summary>
public string ItemInfo;
/// <summary>
/// 是否可以裝備上
/// </summary>
public bool equip;
}
----
創建背包腳本Inventory
創建腳本Inventory,我希望這個背包系統是一個串列他將我所有的物品都存盤在一個背包中,這樣就可以創建不同的背包:鐵匠鋪的背包,藥水商的背包等等,裝備武器的背包
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName = "New Inventory", menuName = "Inventory/New Inventory")]
public class Inventory : ScriptableObject
{
public List<Items> itemList = new List<Items> ();
// public Items[] itemlist;
}
這樣就把item里的資料都存盤到了Inventory背包里面
list陣列和普通陣列:
list陣列常用方法
1,Capacity獲取容量大小
2,Add()方法添加元素
3.3,Insert()方法插入元素
4,[index]訪問元素
5,Count屬性訪問元素個數
6,RemoveAt()方法移除指定位置的元素
7,IndexOf()方法取得一個元素所在串列中的索引位置
LastIndexOf()上面的方法是從前往后搜索,這個是從后往前搜索,搜索到滿足條件的就停止,上面的兩個方法,如果沒有找到指定元素就回傳-1
8,Sort()對串列中是元素進行從小到大排序
9.洗掉元素.Remove
10.判斷某個元素是否在該List中
List.Contains(T item) 回傳true或false
11.給List里面元素順序反轉 List.Reverse() 可以與List.Sort()配合使用
12.List清空 List.Clear()
13.List.FindAll方法:檢索與指定謂詞所定義的條件相匹配的所有元素
14.List.Find方法 搜索與指定謂詞所定義的條件相匹配的元素,并回傳整個List中的第一個匹配元素
----
創建觸發條件:ItemOnWorld
logic:當我的游戲角色碰到物品時Inverotory里就加1
功能實作:
拖拽物品到地圖上添加必要組件(Collider->Trigger),我要寫一個代碼,這個代碼是寫在所有的物品上,只要觸碰游戲角色,那么就會保存在游戲角色的bag里面
logic:判斷游戲玩家是否碰撞到這個
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// logic:掛在在腳本上我要知道這是屬于哪一個我們創建好的物品的資料,
/// 生成變數告訴UNity這是一個寶劍還是一個鞋
/// </summary>
public class ItemOnWorld : MonoBehaviour
{[Tooltip("Items->物品是哪一個資料庫")]
public Items thisItem;
[Tooltip("屬于哪一個背包")]
public Inventory PlayerInventory;
private void OnTriggerEnter2D(Collider2D collision)
{
if(collision.gameObject.CompareTag("Player"))
{
AddNewItem();//添加物品
Destroy(gameObject);
}
}
public void AddNewItem()
{
if(!PlayerInventory.itemList.Contains(thisItem))
{
PlayerInventory.itemList.Add(thisItem);
}
else
{
thisItem.ItemHeld += 1;
}
}
}
添加:
在ItemOnWord里的AddNewItem添加陳述句段
public void AddNewItem()
{
if(!PlayerInventory.itemList.Contains(thisItem))
{
PlayerInventory.itemList.Add(thisItem);
InventoryManager.CreatNewItem(thisItem);
}
else
{
thisItem.ItemHeld += 1;
}
}
替換(替換itemonworld里面的方法)
public void AddNewItem()
{
if(!PlayerInventory.itemList.Contains(thisItem))
{
PlayerInventory.itemList.Add(thisItem);
// InventoryManager.CreatNewItem(thisItem);
}
else
{
thisItem.ItemHeld += 1;
}
InventoryManager.RefreshItem();
}
------
創建背包格子腳本:slot
制作背包格子實體prefab
logic:我們接下來要更改prefab的圖片和數量
在prefab上掛在腳本
public class Slot : MonoBehaviour
{
public Items slotItem;
public Image slotImage;
public Text slotNum;
}
實作功能,點擊物品彈出描述在slot里面添加
public void ItemOnClicked()
{
isinfo = !isinfo;
if (isinfo) { InventoryManager.UpdateItemInfo(slotItem.ItemInfo);}
else { InventoryManager.UpdateItemInfo(""); }
}
系結按鈕點擊
添加功能
public void SetupSlot(Items item)
{
if(item==null)
{
}
}
創建Inventorymanager掛載在畫布上控制腳本
在畫布上掛在腳本manager來控制實體
public class InventoryManager : MonoBehaviour
{
static InventoryManager instance;
//logic:背包是哪個,要將背包中的物品生成出來
public Inventory mabag;
public GameObject slotgrid;//做好的格,在格的范圍之內生成prefab
public Slot slotPrefab;
public Text itemInformation;
private void Awake()
{
if (instance != null)
Destroy(this);
instance = this;
}
/// <summary>
/// logic:希望將
/// </summary>
public static void CreatNewItem(Items item)
{
Slot newitem = Instantiate(instance.slotPrefab, instance.slotgrid.transform.position, Quaternion.identity);
//將位置聯系在一起
newitem.gameObject.transform.SetParent(instance.slotgrid.transform);//掛到物品的下面成為子集
newitem.slotItem = item;
newitem.slotImage.sprite = item.itemImage;
newitem.slotNum.text = item.ItemHeld.ToString();
//logic:生成了prefab的物體叫newitem,但是newitem含有newitem這個函式所以新的物品包括slot里所有的引數
}
}
這時我們想要在一開始就能打開背包看到我們想要的物品,所以新寫方法
InventoryManager
private void Awake()
{
if (instance != null)
Destroy(this);
instance = this;
}
public static void RefreshItem()
{
print("Refreshitem is running");
print("instance.slotgrid.transform.childCount" + instance.slotgrid.transform.childCount);
for (int i = 0; i < instance.slotgrid.transform.childCount; i++)//回圈看它有多少個子集,將子集全部銷毀
{
print("instance.slotgrid.transform.childCount" + instance.slotgrid.transform.childCount);
if (instance.slotgrid.transform.childCount == 0)
break;
Destroy(instance.slotgrid.transform.GetChild(i).gameObject);
}
for(int i=0; i <instance.mabag.itemList.Count;i++)
{
CreatNewItem(instance.mabag.itemList[i]);//重新創建回來了
}
}
替換itemonworld里面的方法
public static void UpdateItemInfo(string itemDesciption)
{
instance.itemInformation.text = itemDesciption;
}
修改代碼
/// <summary>
/// logic:希望將
/// </summary>
/*public static void CreatNewItem(Items item)
{
Slot newitem = Instantiate(instance.slotPrefab, instance.slotgrid.transform.position, Quaternion.identity);
//將位置聯系在一起
newitem.gameObject.transform.SetParent(instance.slotgrid.transform);//掛到物品的下面成為子集
newitem.slotItem = item;
newitem.slotImage.sprite = item.itemImage;
newitem.slotNum.text = item.ItemHeld.ToString();
//logic:生成了prefab的物體叫newitem,但是newitem含有newitem這個函式所以新的物品包括slot里所有的引數
}*/
/// <summary>
/// 想要只改變數字將子集中的東西全部洗掉再重新生成
/// </summary>
public static void RefreshItem()
{
print("Refreshitem is running");
print("instance.slotgrid.transform.childCount" + instance.slotgrid.transform.childCount);
for (int i = 0; i < instance.slotgrid.transform.childCount; i++)//回圈看它有多少個子集,將子集全部銷毀
{
print("instance.slotgrid.transform.childCount" + instance.slotgrid.transform.childCount);
if (instance.slotgrid.transform.childCount == 0)
break;
Destroy(instance.slotgrid.transform.GetChild(i).gameObject);
}
for(int i=0; i <instance.mabag.itemList.Count;i++)
{
//CreatNewItem(instance.mabag.itemList[i]);//重新創建回來了
instance.slots.Add(Instantiate(instance.emptyslot));
instance.slots[i].transform.SetParent(instance.slotgrid.transform);
}
}
----------------------
實作功能,點擊物品彈出描述在slot里面添加,在Inventorymanager里添加
-----------
實作拖拽效果:可以拖拽放到背包的其他格子里,可以與背包格里的其他物品調換位置.調整之前的代碼
之前是拾取到幾個裝備就生成幾個格子

這時相當于只有兩個抽屜

我們先創建好十八個抽屜
新建一個button來存放

logic:把item換到其他的slot里面來就可以實作
想要拖拽到背包的其他格子我們可以把item按鈕取消勾選,這樣就能判斷如果list里面不包含這個物品我們就把它這個圖示改掉???
我希望這十八個格子可以保存在一個串列中,之前為了使用方便我們直接使用的是一個
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/325835.html
標籤:其他
