Unity3D使用NGUI實現簡單背包功能


前話

在許多類型游戲中我們經常會使用到背包,利用背包來設置相應角色屬性,多了背包也會讓游戲增色拓展不少。
那在Unity3D游戲開發中該如何編寫背包系統呢?因為有高人開發了NGUI插件,因此我們進行簡單編寫代碼設置即可實現一個簡單的背包功能了。


准備工作

  1. 新建一個工程PackageDemo
  2. 導入NGUI包(最新版3.9.8版的正版89刀)
  3. 准備好圖片素材,使用NGUI將其打包成圖集

背包
package

背包格子
cell

物品
ogj


簡單背包功能實現

第一步,添加NGUI控件,使用素材

項目目錄以及場景列表如下:
01

要注意的是:

  • Package、Cell和Obj都是NGUI的Sprite控件
  • Cell01-Cell09都設置了名為“Cell”的tag
  • UI Root設置了名為“UIRoot”的tag
  • Package、Cell和Obj都添加了Box Collider組件

第二步,給Package添加NGUI腳本UI Drag Object

02

03

添加在腳本使Package可以被拖拽移動。

第三步,給Obj添加自定義腳本MyDragAndDrop

直接在Obj的屬性面板add component添加腳本 MyDragAndDrop.cs
04

打開並編輯腳本:

  1. 令MyDragAndDrop繼承UIDragDropItem
  2. 重寫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;
        }

    }

}

第三步,測試

test

到這里簡單例子也就完成了。

可以看到,到我拖拽Obj在每個Cell的邊緣時,Obj都會自動移至碰撞的Cell內,類似吸附功能。

上面的簡單例子實現了物體被背包吸附裝入的功能,通過檢測Cell的子物體增加相應邏輯就可以實現背包和角色屬性關聯。


拓展

1.背包內物品欄的物品交換相互位置

給所有物品設置tag為 “Obj” ,如果物品拖拽釋放時碰撞獲取的對象tag為“Obj”,就設置交換物品的父級對象。

2.撿取物品到背包中

一般撿取得物品到背包其排序都是從左到右,從上到下填入空的物品欄中。

實現方式是將所有物品欄對象裝載到GameObject的數組中。

通過循環判斷物品欄是否有子對象,也就是判斷物品欄的子列表數值是否大於0

若小於或等於0,就將物品的父對象設置為該物品欄,然后設置其相對父對象坐標為0

還有很多實現大家自由發揮吧


源碼

鏈接:http://pan.baidu.com/s/1dF0kSlN 密碼:zamk


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM