接下來就是暫時告一段落的最後一個功能了——當滑鼠移至上方於有物品的格子的時候,顯示相應的物品資訊
在第二篇相關文章裡面有兩個空的方法體,其實就是為了實現今天的功能而預留的.所以接下來的代碼就是寫在InventoryItemGrid這個指令碼裡的了.
接下來就讓我們來實現這個功能 1.聲明變數
依然是聲明相應的變數來儲存相應的資料,在u3d中的物品欄的ui下先建立一個Panel,可作為文字背景,然後在Panel下建立Text,Panel是通過在u3d裡面擷取的,而text我這邊是通過代碼擷取的,這裡的text就是用來寫具體的物品的資訊的
public Image goodsInformationContainer;//用來儲存物品資訊的容器,裡面有text檔案可以顯示物品資訊 public float showTime = 3;//物品資訊顯示的時間長度 private Text goodsInformation_text;//用來顯示物品資訊 private float time=0;//計時器,物品資訊顯示一段時間要消失 private bool isShowInformation = false;//標識是否開始顯示物品資訊
2. 建立ShowGoodsInformation();
我們再來定義一個方法ShowGoodsInformation();這裡我要先提一下如何通過代碼寫ui的位置,因為,物品資訊顯示的位置肯定要在物品的旁邊,當滑鼠移至上方於物品時,就要在它旁邊顯示相應的物品資訊,所以當我們讓panel顯示出來的時候,要對確定其位置.所以這個方法需要一個參數,即格子位置的參數RectTransform
/// <summary> /// 在字典尋找該物品,然後顯示物品資訊 /// </summary> /// <param name="center">顯示物品資訊的位置</param> private void ShowGoodsInformation(RectTransform center) { //如果id不等於0,就表示格子是有物品的 if (this.id != 0) { goodsInformationContainer.gameObject.SetActive(true);//使panel顯示 goodsInformationContainer.gameObject.GetComponent<RectTransform>().anchoredPosition = center.anchoredPosition + new Vector2(342.4f, -261.7f);//panel顯示的位置 ObjectInfo info = new ObjectInfo();//用來儲存物品資訊 info = ObjectsInfo._instance.GetObjectInfoById(id);//在字典裡查出這個物品並放到info goodsInformation_text = goodsInformationContainer.GetComponentInChildren<Text>();//擷取panel下的text //根據物品類型將物品資訊寫入text switch(id/1000) { ///因為物品都是四位元,藥品最高位是1,裝備物品最高位是2,之類的,所以根據id/1000即可分辨是哪類物品,然後顯示相應資訊 case 1: ObjectInfo_Drug info_Drug=(ObjectInfo_Drug)info; goodsInformation_text.text="物品名稱:"+info.name+"\n回血量:"+info_Drug.hp+"\n回藍量:"+info_Drug.mp+"\n出售價格:"+info_Drug.price_sell; break; case 2: ObjectInfo_Equip info_Equip = (ObjectInfo_Equip)info; goodsInformation_text.text = "物品名稱:" + info_Equip.name + "\n出售價格:" + info_Equip.price_sell; break; case 3: ObjectInfo_Mat info_Mat = (ObjectInfo_Mat)info; goodsInformation_text.text = "物品名稱:" + info_Mat + "\n出售價格:" + info_Mat.price_sell; break; } } }
其中確定Panel顯示位置的那行代碼中的Vector2需要自己去嘗試,找出相應的位移量然後加進去,因為我們穿進來的參數是格子ui的位置,而顯示的這個Panel是根據這個位置來位移的. 3. ShowGoodsInformation()的使用
好,有了以上的方法,那我們什麼時候去調用呢?一開始我們就定義了一個布爾isShowInformation ,當然是有用的,當它為真的時候就可以在Update()方法裡調用我們寫的這個方法了,而isShowInfomation要在什麼時候讓它為真呢?很明顯,當滑鼠移至上方在格子上的時候
那麼就需要讓我們的InventoryItemGrid繼承至IPointerEnterHandler和IPointerExitHandler這兩個介面,然後實現他們的方法
/// <summary> /// 實現介面方法,當滑鼠位于格子上時發生 /// </summary> /// <param name="eventData"></param> void IPointerEnterHandler.OnPointerEnter(PointerEventData eventData) { isShowInformation = true; } /// <summary> /// 實現介面方法,當滑鼠離開格子時發生 /// </summary> /// <param name="eventData"></param> void IPointerExitHandler.OnPointerExit(PointerEventData eventData) { time+=showTime; }
這個time+=showTime又是要幹嘛呢?其實當滑鼠移至上方於物品時,顯示物品資訊的時間得是有限的,比如懸停在格子上,它顯示出物品資訊,總不能一直顯示著,在這裡,當time>3時,也就是顯示三秒後,panel又隱藏起來,而當滑鼠離開格子時,這就實現了提前消失,以方便用來顯示接下來滑鼠會懸停的格子上的物品資訊. 4. Update()方法內容
直接上代碼了:
void Update() { if (isShowInformation) { ShowGoodsInformation(this.GetComponent<RectTransform>());//調用方法顯示panel time += Time.deltaTime;//開始累計時間 //如果顯示的時間到了,就隱藏panel,並重設時間,改變標識符 if (time > showTime) { isShowInformation = false; time -= showTime; goodsInformationContainer.gameObject.SetActive(false); } } }
至此”u3d_rpg遊戲開發之物品管理”暫時完結