Inventory背包學(xué)習(xí)
(資料圖片)
制作背包基本UI
基礎(chǔ)的panel,container
SlotHolder【包含ItemSlot <- amount】保存為prefab
創(chuàng)建在地圖上的物品ItemOnWorld,裝備在身上的物品ItemEquipment
ItemData_SO,用于保存item數(shù)據(jù)【name,icon,stackable可堆疊,描述等等信息】
ItemType(Useable,Weapon,Armor等等)
name
icon
prefab_EQ
ItemPickUp【碰撞到玩家之后銷毀自己,給玩家加入背包】
調(diào)用InventoryData_SO中的AddItem給某個(gè)背包添加物品,RefreshUI();
刪除本體
Equipment
ChangetWeapon
EquipWeapon
UnEquipWeapon
需要的話可以修改attackData
InventoryManger
需要獲取的變量:
InventoryData
Container
UI Panel
ItemToolTip
Canvas(inventoryCanvas , dragCanvas)
DragData【自定義類,包含originalHolder,originalParent】
Fnc
獲取模板數(shù)據(jù)
保存、讀取數(shù)據(jù)
開關(guān)背包的bool
Check DragItem is In SlotArea 檢查拖拽物品是否在某一個(gè)Slot范圍內(nèi)
創(chuàng)建背包的數(shù)據(jù)庫Inventory Data【每一個(gè)背包都對應(yīng)一個(gè)inventoryData】
InventoryItem【這是背包里面的物品類型,儲存itemData和amount】
Listitems; 列表中的每一個(gè)元素都對應(yīng)背包中對應(yīng)序號的物品,交換之后會交換列表中的位置
AddItem(ItemData_SO , Int)
可堆疊
在列表中尋找物品,有則堆疊上去
不可堆疊、沒有找到相同物品
在第一個(gè)空位置添加相應(yīng)物品
InventoryUI 背包顯示物品對應(yīng)圖標(biāo)
ContainerUI 保存該背包下的所有SlotHolder
RefreshUI(),更新每一個(gè)itemUI的index ,index有值之后就可以UpdateItem了
SlotHolder
單元格類型SlotType
獲取自身子類itemUI
UpdateItem,將自身單元格的item更新到itemUI上
switch更換對應(yīng)類型的數(shù)據(jù)庫
進(jìn)行對應(yīng)的操作,比如說裝備武器
更新UI的顯示
ItemUI(包含Image <- text)具體每個(gè)物體UI上,控制image,text顯示
SetUpItemUI
如果當(dāng)前格子有物品,則更新icon、amount、SetAction(true);
如果沒有物品,SetActive(false);
InventoryData_SO InventoryData ,int index 保存這個(gè)地方對應(yīng)哪一個(gè)數(shù)據(jù)庫的哪一個(gè)index
創(chuàng)建其他Panel,按照上面的方式,保存itemUI成為Prefab,設(shè)置好SlotType,創(chuàng)建對應(yīng)的數(shù)據(jù)庫
DragItem 實(shí)現(xiàn)拖拽物品(實(shí)際上是拖拽的ItemUI),添加到可以拖拽的背包格子(ItemUI)上,命名空間EventSystems
接口:IBeginDragHandler, IDragHandler ,IEndDragHandler,拖拽開始、拖拽中、拖拽結(jié)束
/cn/current/ScriptReference/ 接口的代碼手冊
PointerEventData eventData(position鼠標(biāo)位置,pointerEnter鼠標(biāo)進(jìn)入某個(gè)區(qū)域(triggerEnter))
OnIBeginDragHandler
記錄原始信息
設(shè)置父級為DragCanvas
OnIDragHandler(自帶Update)
跟隨鼠標(biāo)位置移動
OnIEndDragHandler
放下物品,交換數(shù)據(jù)
() 【具有給定ID的指針是否位于EventSystem對象上】
在InventoryManager里面創(chuàng)建CheckInInventoryUI(vec3)檢測拖拽物品是否在某一個(gè)slot范圍內(nèi)
循環(huán)若干個(gè)containerUI需要檢測每一個(gè)該檢測的)
(方形范圍 , position)) 判斷position是否在方格范圍內(nèi)
檢查鼠標(biāo)指向的位置是否有SlotHolder組件 ,設(shè)置為targetHolder。如果image顯示出來了,獲取不到SlotHolder,則要去image的父級獲取
交換物品,判斷targetHolder是否為空,是否不是原始Holder,需要判斷targetHolder的slotType能否進(jìn)行交換,調(diào)用SwapItem()
交換完畢后更新currentHolder,targetHolder
修改父級回到原始
修改RectTransform回到原始設(shè)置
offSetMax錨點(diǎn)右上偏移
offSetMin錨點(diǎn)左下偏移
[RequireComponent(typeof(ItemUI))]在拖拽物品上自動添加ItemUI
添加一個(gè)最高層的DragCanvas,在拖拽時(shí)加入此Canvas,保證拖拽不會被擋道其他UI后面,在InventoryManager里面保存
InventoryManger中創(chuàng)建一個(gè)類DragData
保存原始的Holder,原始的Parent(RectTransform)
用來臨時(shí)儲存拖拽信息,使用的時(shí)候new一個(gè)新值
SwapItem() 【修改數(shù)據(jù)列表的排列】
targetItem,tempItem【指向當(dāng)前item,如果交換過去則清空】
判斷是否堆疊,可堆疊則堆疊,否則直接交換
Useable Item可使用物品(雙擊使用)
創(chuàng)建對應(yīng)的數(shù)據(jù),物品
在SlotHolder中,利用 IPointerClickHandler 接口實(shí)現(xiàn)雙擊使用物品
代碼手冊:/cn/current/ScriptReference/
判斷點(diǎn)擊次數(shù)為偶數(shù),避免多次點(diǎn)擊不為2會失效
UseItem(),判斷是否為空,是否可使用,數(shù)量是否大于0
鏈接到Character組件實(shí)現(xiàn)改變屬性
開關(guān)Panel,InventoryManager里面設(shè)置一個(gè)bool,一個(gè)func,用于判定打開背包時(shí)人物不可移動
ActionButton
public KeyCode actionKey,進(jìn)行逐一設(shè)置
背包中實(shí)現(xiàn)實(shí)時(shí)投影玩家
攝像機(jī)輸出到Render Texture
UI創(chuàng)建Raw Image接收這個(gè)Render Texture即可
ItemToolTip物品信息顯示欄
創(chuàng)建UI,主要用到Content Size Fitter 和 Layout Group
腳本ItemToolTip
SetUpToolTip(ItemData_SO itemData),設(shè)置圖標(biāo)、名稱、描述等,配合UI顯示
Update中跟隨鼠標(biāo)的位置,并且根據(jù)條件判斷應(yīng)該在鼠標(biāo)的哪個(gè)方向顯示,獲取矩形四個(gè)角頂點(diǎn)位置(世界坐標(biāo))
12
03
在SlotHolder中 添加 IPointerEnterHandler ,IPointerExitHandler兩個(gè)接口
鼠標(biāo)進(jìn)入時(shí)如果有物品,則更新ToolTip并且顯示
離開時(shí)、SlotHolder(背包)關(guān)閉時(shí)取消ToolTip的顯示
Loot Item 掉落物品
LootSpawner腳本
創(chuàng)建一個(gè)序列化的類,包含item以及一個(gè)權(quán)重(設(shè)置掉落概率)
SpwanLoot
獲取一個(gè)隨機(jī)值,從lootItems數(shù)組中遍歷,尋找符合概率的物品,如果掉落之后break則只掉落一個(gè)物品
背包數(shù)據(jù)的保存與讀取
調(diào)用SaveManager,在背包內(nèi)物品有所更改、或是別的條件下進(jìn)行保存數(shù)據(jù)
DragPanel面板的拖拽,調(diào)整Hierarchy排序方式改變渲染層級
拖動時(shí),為了避免電腦分辨率和Canvas分辨率不同,所以拖動要除以Canvas的分辨率
+= / ;
IPointerDownHandler
渲染層級: / Get...
滾輪選擇ActionBar物品【實(shí)現(xiàn)時(shí)需要對前文的設(shè)置進(jìn)行修改以達(dá)到最好的效果,屬于兩種截然不同的背包方法】
InventoryManager 中 ("Mouse ScrollWheel")檢測滾輪輸入 上為正,下為負(fù)
在SlotHolder中添加index來進(jìn)行索引,添加選擇框的image
InventoryManager 中 添加選擇currentSelectHolder的函數(shù)
更新前取消選擇框iamge,更新后顯示選擇框image
選擇時(shí)裝備物品,如果是空欄則卸載物品
Copyright © 2015-2022 太平洋產(chǎn)業(yè)網(wǎng)版權(quán)所有 備案號:豫ICP備2022016495號-17 聯(lián)系郵箱:93 96 74 66 9@qq.com