Unity 2D游戏开发: 背包

一導入圖片資源

導入 Sprite 圖片資源

修改圖片檢查器屬性

纹理類型： Sprite (2D和UI)

Sprite 模式: 多个

每單位像素數：32

过滤模式: 点 (无过滤器)

压缩: 无

打開 Sprite Editor -> 切片 -> 自动 -> 应用

二 創建預制件

新建 UI -> 画布 重命名爲 BagObject

刪除 EventSystem : ui 對象與输入设备的交互事件系统。暂时不需要

修改BagObject屬性

Canvas -> 勾選完美像素

Canvas Scaler -> UI缩放模式: 屏幕大小缩放

BagObject 下 新建 空對象 命名爲 BagBackground

BagBackground 添加 Horizontal Layout Group 水平排列組件

BagObject 下 新建 空對象 命名爲 Slot

Slot 屬性:
Rect Transform : 80x80

Slot 下 新建 UI -> 图像 命名爲 ItemImage

Slot 下 新建 UI -> 图像 命名爲 Background

Background 下 新建 UI -> 图像 命名爲 Tray

Tray 下 新建 UI -> 图像 命名爲 QtyText

設置各對象背景圖片及位置錨點

禁用 ItemImage -> Image組件顯示

Background: 背景图片

Tray: 背景图片

創建 Slot 預制件

創建 BagObject 預制件: 刪除其中的Slot

三 编写脚本

新建Slot類

using UnityEngine;
using UnityEngine.UI;

public class Slot : MonoBehaviour
{
? ? public Text qtyText; // qxtText 對象的引用
}

新建Bag類

using UnityEngine.UI;
using UnityEngine;

public class Bag : MonoBehaviour
{
? ? public GameObject slotPrefab; // slot預制件
? ? public const int numSlots = 5; // 格子数量
? ? Image[] itemImages = new Image[numSlots]; // 格子背景图
? ? PropScriptable[] props = new PropScriptable[numSlots];
? ? GameObject[] slots = new GameObject[numSlots]; // 格子對象
? ? void Start() {
? ? ? ? CreateSlots();
? ? }
? ? /// 創建格子
? ? public void CreateSlots() {
? ? ? ? // 如果格子預制件存在
? ? ? ? if (slotPrefab != null) {
? ? ? ? ? ? // 遍历生成
? ? ? ? ? ? for (int i = 0; i < numSlots; i++) {
? ? ? ? ? ? ? ? GameObject newSlot = Instantiate(slotPrefab);
? ? ? ? ? ? ? ? newSlot.name = "propslot_" + i;
? ? ? ? ? ? ?newSlot.transform.SetParent(gameObject.transform.GetChild(0).transform);
? ? ? ? ? ? ? ? slots[i] = newSlot; // 添加到 slots 對象列表
? ? ? ? ? ? ? ? itemImages[i] = newSlot.transform.GetChild(1).GetComponent<Image>(); // 添加图标到图标列表
? ? ? ? ? ? }
? ? ? ? }
? ? }

? ? /// 添加道具到背包
? ? public bool AddProp(PropScriptable prop) {
? ? ? ? // 遍历道具数量
? ? ? ? for (int i = 0; i < props.Length; i++) {
? ? ? ? ? ? if (props[i] != null && props[i].itemType == prop.itemType && prop.stackable == true)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? // Adding t existing slot
? ? ? ? ? ? ? ? props[i].quantity = props[i].quantity + 1;
? ? ? ? ? ? ? ? Slot slotScript = slots[i].GetComponent<Slot>();
? ? ? ? ? ? ? ? Text quantityText = slotScript.qtyText;
? ? ? ? ? ? ? ? quantityText.enabled = true;
? ? ? ? ? ? ? ? quantityText.text = props[i].quantity.ToString();
? ? ? ? ? ? ? ? return true;
? ? ? ? ? ? }

? ? ? ? ? ? if (props[i] == null)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? props[i] = Instantiate(prop);
? ? ? ? ? ? ? ? props[i].quantity = 1;
? ? ? ? ? ? ? ? itemImages[i].sprite = prop.sprite;
? ? ? ? ? ? ? ? itemImages[i].enabled = true;
? ? ? ? ? ? ? ? return true;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return false;
? ? }
}

更新 Player 類

...

四 挂載脚本

五 挂載脚本預制件