前話
在許多類型游戲中我們經常會使用到背包,利用背包來設置相應角色屬性,多了背包也會讓游戲增色拓展不少。
那在Unity3D游戲開發中該如何編寫背包系統呢?因為有高人開發了NGUI插件,因此我們進行簡單編寫代碼設置即可實現一個簡單的背包功能了。
准備工作
- 新建一個工程PackageDemo
- 導入NGUI包(最新版3.9.8版的正版89刀)
- 准備好圖片素材,使用NGUI將其打包成圖集
背包
背包格子
物品
簡單背包功能實現
第一步,添加NGUI控件,使用素材
項目目錄以及場景列表如下:
要注意的是:
- Package、Cell和Obj都是NGUI的Sprite控件
- Cell01-Cell09都設置了名為“Cell”的tag
- UI Root設置了名為“UIRoot”的tag
- Package、Cell和Obj都添加了Box Collider組件
第二步,給Package添加NGUI腳本UI Drag Object
添加在腳本使Package可以被拖拽移動。
第三步,給Obj添加自定義腳本MyDragAndDrop
直接在Obj的屬性面板add component添加腳本 MyDragAndDrop.cs
打開並編輯腳本:
- 令MyDragAndDrop繼承UIDragDropItem
- 重寫OnDragDropRelease方法
更改后的MyDragAndDrop腳本代碼如下:
using UnityEngine;
public class MyDragAndDrop : UIDragDropItem {
//該方法用於獲取拖拽的物體釋放拖拽時,該物體所碰撞的對象
//所以我們前面需要給Cell和Obj都添加Box Collider
protected override void OnDragDropRelease(GameObject surface)
{
base.OnDragDropRelease(surface);
//判斷獲取碰撞的對象的tag是否為Cell
if (surface.tag == "Cell")
{
//將Obj放到碰撞的Cell的子列表中
transform.parent = surface.transform;
//設置Obj的相對於Cell的坐標為0
transform.localPosition = Vector3.zero;
}
else
{
//如果碰撞的對象不是Cell,就將Obj放到tag為UIRoot的對象子列表中,解除Obj和Cell父子關系
transform.parent = GameObject.FindGameObjectWithTag("UIRoot").transform;
}
}
}
第三步,測試
到這里簡單例子也就完成了。
可以看到,到我拖拽Obj在每個Cell的邊緣時,Obj都會自動移至碰撞的Cell內,類似吸附功能。
上面的簡單例子實現了物體被背包吸附裝入的功能,通過檢測Cell的子物體增加相應邏輯就可以實現背包和角色屬性關聯。
拓展
1.背包內物品欄的物品交換相互位置
給所有物品設置tag為 “Obj” ,如果物品拖拽釋放時碰撞獲取的對象tag為“Obj”,就設置交換物品的父級對象。
2.撿取物品到背包中
一般撿取得物品到背包其排序都是從左到右,從上到下填入空的物品欄中。
實現方式是將所有物品欄對象裝載到GameObject的數組中。
通過循環判斷物品欄是否有子對象,也就是判斷物品欄的子列表數值是否大於0
若小於或等於0,就將物品的父對象設置為該物品欄,然后設置其相對父對象坐標為0
還有很多實現大家自由發揮吧
源碼
鏈接:http://pan.baidu.com/s/1dF0kSlN 密碼:zamk