1. 程式人生 > >unity背包系統(摘抄)

unity背包系統(摘抄)

圖形 彈出 作用 網格 listen 系統 原創文章 vat 文章

新的背包系統包括:

1、一個用於表示背包系統的按鈕:

該按鈕上添加了EventListener事件,該事件經過改寫,可用於實現點擊一次展示,點擊第二次消失的效果。

代碼比較簡單,主要是在EventListener本身的事件代碼上進行了一定的修改:


public GameObject item;
public GameObject tip;
public int count = 0;

其中Item用於表示監聽的物體,tip表示受到監聽後發生動作的物體,count用於計數,以便於實現點擊兩次後tip物體消失的效果。

具體的點擊代碼如下所示,比較簡單,不再進行解釋:


void ButtonClick(GameObject button)
{
count++;
if(count==1)
tip.SetActive(true);
if (count == 2) {
tip.SetActive(false);
count = 0;
}
2、物品的顯示:

因為此處涉及到與後臺端數據的傳輸,所以我在這裏暫且先將物品的信息用一個TXT文件保存起來:

這些信息分別對應 物品的id 物品的名稱 物品的圖片表示 (暫且需要這麽多,更多的信息以後豐富內容的時候進行添加)

為了讀取TXT文件中物品的信息,我們需要創建一個空物體,並在該物體上掛上讀取的腳本:

我們需要把TXT的文件讀取到一個String中,根據‘\n’和‘,’來分割字符串,取得相應的物品信息,保存到之後我們需要在點擊物品是顯示的Dictionary中去。

具體代碼如下,比較簡單:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class ObjectsInfo : MonoBehaviour
{

public static ObjectsInfo _instance;
public TextAsset objectsInfoListText;

private Dictionary<int, ObjectInfo> objectInfoDictionary =
new Dictionary<int, ObjectInfo>();

void Awake()
{
_instance = this;
ReadInfo();
}

public ObjectInfo GetObjectInfoById(int key)
{
ObjectInfo info = new ObjectInfo();
objectInfoDictionary.TryGetValue(key, out info);
return info;
}
private void ReadInfo()
{
string text = objectsInfoListText.text;
string[] strArray = text.Split(‘\n‘);
foreach (string str in strArray)
{
string[] proArray = str.Split(‘,‘);

ObjectInfo info = new ObjectInfo();

int id = int.Parse(proArray[0]);
string name = proArray[1];
string iconName = proArray[2];
string typeStr = proArray[3];

info.id = id;
info.name = name;
info.iconName = iconName;
//添加到字典上,id為key,方便根據id查找
objectInfoDictionary.Add(id, info);
}
}
}

//id,名稱,icon名稱,類型
public class ObjectInfo
{
public int id;
public string name;
public string iconName;

}


要讓背包內的物品正確顯示出來,還需要對物品添加一個SetId的方法,對於每個物品來說,id對應的圖片是不同的,最後進行使用時對應的效果也是不同的。

public void SetId(int id)
{
ObjectInfo info = ObjectsInfo._instance.GetObjectInfoById(id);
sprite.spriteName = info.iconName;
this.id = id;
}


除此之外,物品和其他不同,還需要相應拖拽事件,這裏比較簡單,為物品添加一個 Box Collider,然後讓物品對應的腳本繼承於Unity原生的拖拽事件即可。

3、一個用於表示背包的Sprite:


加入一個Sprite,然後對Sprite進行圖片添加的操作。

此處需要註意的是,如果在NGUI中想要添加自己的圖片背景,和在Unity原生的添加是不一樣的。此處需要自己創建一個圖集Atlas。

點選你需要的圖片,點擊右鍵,選擇NGUI->Open Atlas Maker,會彈出以下對話框:

加入你需要的圖片後點擊畫面中的“添加/更新”按鈕即可。這樣可以被用於Sprite組件的屬於你自己的圖集就建立好了。之後只需要在對應的Sprite組件的 UI Sprite面板中,點擊Atlas,選擇圖集,在點擊Sprite,就可以了。

4、背包中的格子Cell:

首先分析一下,可以發現,背包需要一個Sprite,但背包中還有許多網格,所以在背包中創建一系列的Sprite,用於表示物品存放的格子。如圖中的Cell。

為了方便起見,這裏可以將Cell進行Prefab的處理。

所謂的Prefab,就是將一個你自己定義好的資源打包,以便下次使用的時候,可以直接從資源文件裏拖出來使用。有點類似於圖形學裏的顯示列表(不知道這麽比喻對不對)。

操作也非常簡單,對你需要進行Prefab處理的資源點擊右鍵,選擇Create -> Prefab即可。

因為背包系統中,背包本身面板需要存放一些Cell,也就格子,格子中再存放物體。所以對於背包面板來說,需要對格子Cell進行管理。需要創建一個List用於存放格子。為了方便格子的管理,最好在面板中給格子進行編號,如圖,從Cell01開始編號。

格子還需要對物體有一定的管理作用,在格子中定義變量id為物品的編號,num為物品的數量,添加一個Label用於在物品的右下角顯示該物品的數量。

using UnityEngine;
using System.Collections;

public class InventoryItemGrid : MonoBehaviour {

public int id = 0;
public int num = 0;
private ObjectInfo info = null;
private UILabel numLabel;

void Start()
{
numLabel = this.GetComponentInChildren<UILabel>();
}

public void SetId(int id, int num = 1)
{
this.id = id;
info = ObjectsInfo._instance.GetObjectInfoById(id);
InventoryItem item = this.GetComponentInChildren<InventoryItem>();
this.num = num;
numLabel.text = this.num.ToString();
numLabel.enabled = true;

item.SetId(id);
}

public void PlusNum(int num = 1)
{
this.num += num;
numLabel.text = this.num.ToString();
}
public void ClearInfo()
{
id = 0;
num = 0;
info = null;
numLabel.enabled = false;
}
}


至此我們對背包系統進行了拆分,分成了按鈕、物品、背包面板和格子幾部分。並初步實現了每一部分的功能,下面我們將要把這些分離開的功能整合到一起,實現一個完整的背包系統。
---------------------
作者:okurusT
來源:CSDN
原文:https://blog.csdn.net/zxycs1996/article/details/72995868
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

unity背包系統(摘抄)