Related Posts Plugin for WordPress, Blogger...

5-12 Click To Put Item Into Slot

本章要來完成背包系統點擊物品的功能,按住Z鍵點擊物品時僅會取得一半的物品,按住Z鍵放置物品時則會一個一個的放進去。若直接點擊物品則能取得所有物品,也能直接放置物品,同時必須顧慮到物品的容量上限。

本次修改只有動到Slot.cs,而且程式碼解說已經寫在註解中了,請大家自己看看吧!如果不懂這次修改的內容,請記得將前幾篇相關的文章都看一下唷!

5-10 Click To Pickup Item
https://rpgcorecombat.blogspot.tw/2018/01/5-10-click-to-pickup-item.html

5-11 Play Scale Animation When Getting Item

Slot.cs:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
 
namespace RPG.Inventory{
 public class Slot : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerDownHandler {
 
  [SerializeField] GameObject itemPrefab;
 
  public void StoreItem(Item item){
   // 若Slot底下沒有Item,則Instantiate一個
   if (transform.childCount == 0) {
    GameObject itemObject = Instantiate (itemPrefab, transform);
    itemObject.GetComponentInChildren<itemui> ().SetItem (item);
   } else {
    // 已存在該Item,所以增加數量即可
    transform.GetComponentInChildren<itemui> ().AddAmount ();
   }
  }
 
  public int GetItemID(){
   return transform.GetComponentInChildren<itemui> ().Item.ID;
  }
 
  public bool IsFilled(){
   ItemUI itemUI = transform.GetComponentInChildren<itemui> ();
   return itemUI.Amount >= itemUI.Item.Capacity;
  }
 
  public void OnPointerEnter(PointerEventData eventData){
   if (transform.childCount > 0) {
    Item item = GetComponentInChildren<itemui> ().Item;
    GetComponentInParent<inventorysystem> ().ShowToolTip (item.GetToolTipText ());
   }
  }
 
  public void OnPointerExit(PointerEventData eventData){
   GetComponentInParent<inventorysystem> ().HideToolTip ();
  }
 
  public void OnPointerDown(PointerEventData eventData){
   InventorySystem invetorySystem = GetComponentInParent<inventorysystem> ();
   // Slot內是否已經有物體
   if (transform.childCount > 0) {
    // 取得目前滑鼠點擊Slot的ItemUI
    ItemUI clickedItemUI = GetComponentInChildren<itemui> ();
    // 當滑鼠沒有Item時
    if (invetorySystem.isPickedItem == false) {
     if (Input.GetKey (KeyCode.Z)) {
      // 壓住Z鍵時,只會取出一半的數量
      PickupHalfOfSlotItem(clickedItemUI, invetorySystem);
     } else {
      // 取出全部
      PickupAllSlotItem (clickedItemUI, invetorySystem);
     }
    // 當滑鼠有Item時
    } else if (invetorySystem.isPickedItem == true) {
     if (clickedItemUI.Item.ID == invetorySystem.GetPickedItem ().Item.ID) {
      if (Input.GetKey (KeyCode.Z)) {
       // 壓住Z鍵時,只會一個一個的放入物體
       PutInOneItem (invetorySystem);
      } else {
       // 放入所有物體
       PutInAllItem (clickedItemUI, invetorySystem);
      }
     }
    }
   } else {
    if (invetorySystem.isPickedItem == true) {
     if (Input.GetKey (KeyCode.Z)) {
      // 壓住Z鍵時,只會一個一個的放入物體
      PutInOneItem (invetorySystem);
     } else {
      // 放入所有物體
      PutInAllItemToEmptySlot (invetorySystem);
     }
    }
   }
  }
 
  private void PickupHalfOfSlotItem(ItemUI clickedItemUI, InventorySystem invetorySystem){
   int amountToPick = (clickedItemUI.Amount + 1) / 2;
   int amountRemained = clickedItemUI.Amount - amountToPick;
   // 將PickedItem的ItemUI設置為目前滑鼠點中的ItemUI
   invetorySystem.PickupItem (clickedItemUI.Item, amountToPick);
   if (amountRemained == 0) {
    Destroy (clickedItemUI.gameObject);
   } else {
    clickedItemUI.SetAmount (amountRemained);
   }
  }
 
  private void PickupAllSlotItem(ItemUI clickedItemUI, InventorySystem invetorySystem){
   // 將PickedItem的ItemUI設置為目前滑鼠點中的ItemUI
   invetorySystem.PickupItem (clickedItemUI.Item, clickedItemUI.Amount);
   // 因為已經選中物體了,要將Slot內的ItemUI刪除
   Destroy (clickedItemUI.gameObject);
  }
 
  private void PutInOneItem(InventorySystem invetorySystem){
   this.StoreItem (invetorySystem.GetPickedItem ().Item);
   invetorySystem.ReducePickedItem (1);
  }
 
  private void PutInAllItem(ItemUI clickedItemUI, InventorySystem invetorySystem){
   if (clickedItemUI.Item.Capacity > clickedItemUI.Amount) {
    int slotRemained = clickedItemUI.Item.Capacity - clickedItemUI.Amount;
 
    if (slotRemained >= invetorySystem.GetPickedItem ().Amount) {
     // 若Slot內的空間足以放下滑鼠拿著的全部物體
     clickedItemUI.SetAmount (clickedItemUI.Amount + invetorySystem.GetPickedItem ().Amount);
     invetorySystem.ReducePickedItem (invetorySystem.GetPickedItem ().Amount);
    } else {
     // Slot內的空間不夠放,只能放下部分滑鼠拿著的物體
     clickedItemUI.SetAmount (clickedItemUI.Amount + slotRemained);
     invetorySystem.ReducePickedItem (slotRemained);
    }
   }
  }
 
  private void PutInAllItemToEmptySlot(InventorySystem invetorySystem){
   for (int i = 0; i < invetorySystem.GetPickedItem ().Amount; i++) {
    this.StoreItem (invetorySystem.GetPickedItem().Item);
   }
   invetorySystem.ReducePickedItem (invetorySystem.GetPickedItem().Amount);
  }
 }
}
</itemui></inventorysystem></inventorysystem></inventorysystem></itemui></itemui></itemui></itemui></itemui>

撰寫完程式碼後,來執行遊戲看看吧,壓住Z鍵就可以取出部分物品了,而且可以在每個Slot各放一個物品。

也可以隨自己的喜好隨便放置物品。

留言