5-17 Vendor Panel
今天要來製作商店功能嘍!玩家要購買物品時,可以用滑鼠右鍵點擊商店的物品,也可以將背包的物品丟到商店內,藉以賣掉物品。首先,我們來複製Chest Panel當作Vendor Panel吧。
然後將多餘的Slot刪除,因為我們需要建立新的Vendor Slot,是專屬給商店用的Slot。
然後,將原本的Slot.cs刪除。
改成新的VendorSlot.cs。這個Slot的修改模式和EquipmentSlot很相似,大家也可以參考以前的文章唷:
5-15 Create Character Panel And Wear Equipment
VendorSlot.cs的完整程式碼如下:
接著再請大家將新的VendorSlot依序排好,如下圖。
接著要在背包內加入金錢的機制,在Knapsack Panel新增UI/Image,取名為Coin。
Coin的話請大家自己找圖片唷,然後在Coin底下新增UI/Text。
然後將多餘的Slot刪除,因為我們需要建立新的Vendor Slot,是專屬給商店用的Slot。
然後,將原本的Slot.cs刪除。
改成新的VendorSlot.cs。這個Slot的修改模式和EquipmentSlot很相似,大家也可以參考以前的文章唷:
5-15 Create Character Panel And Wear Equipment
VendorSlot.cs的完整程式碼如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
namespace RPG.Inventory{
public class VendorSlot : Slot {
public override void OnPointerDown(PointerEventData eventData){
if (eventData.button == PointerEventData.InputButton.Right
&& inventorySystem.isPickedItem == false && transform.childCount > 0) {
Item clickedItem = transform.GetChild (0).GetComponent ().Item;
inventorySystem.BuyItem (clickedItem);
} else if (eventData.button == PointerEventData.InputButton.Left
&& inventorySystem.isPickedItem == true) {
if (Input.GetKey (KeyCode.Z)) {
// 壓住Z鍵時,一次只販售一個
inventorySystem.SellItem (1);
} else {
// 販售全部物品
inventorySystem.SellItem (inventorySystem.GetPickedItem().Amount);
}
}
}
}
}
接著再請大家將新的VendorSlot依序排好,如下圖。
接著要在背包內加入金錢的機制,在Knapsack Panel新增UI/Image,取名為Coin。
Coin的話請大家自己找圖片唷,然後在Coin底下新增UI/Text。
介面的調整大致上如下圖。
然後來修改一下InventorySystem.cs,讓他有處理買賣商店物品的功能,同時也要初始化商店的物品。
InventorySystem.cs:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Assertions;
using UnityEngine.UI;
using UnityEngine.EventSystems;
namespace RPG.Inventory{
public class InventorySystem : MonoBehaviour {
[SerializeField] ToolTip toolTip;
[SerializeField] ItemUI pickedItem;
[SerializeField] CharacterProperty characterProperty;
public bool isPickedItem = false;
ItemList itemList;
Slot[] slotList;
int coinAmount = 100;
Text coinText;
void Start () {
ParseItemsJson ();
slotList = GetComponentsInChildren ();
coinText = GameObject.Find ("Coin").GetComponentInChildren();
coinText.text = coinAmount.ToString();
InitialVendorItem ();
}
void Update(){
PressGToAddItem ();
MovePickedItemByMousePosition ();
DiscardPickedItem ();
}
private bool ConsumeCoin(int amount){
if (coinAmount > 0) {
coinAmount -= amount;
coinText.text = coinAmount.ToString ();
return true;
}
return false;
}
private void EarnCoin(int amount){
coinAmount += amount;
coinText.text = coinAmount.ToString ();
}
public void BuyItem(Item item){
bool isSuccess = ConsumeCoin (item.BuyPrice);
if (isSuccess) {
StoreItem (item);
}
}
public void SellItem(int sellAmount){
int sellPrice = pickedItem.Item.SellPrice * sellAmount;
ReducePickedItem (sellAmount);
EarnCoin (sellPrice);
}
public void PickupItem(Item item, int amount){
pickedItem.SetItem (item, amount);
pickedItem.Show ();
toolTip.Hide ();
isPickedItem = true;
}
public void ReducePickedItem(int amount){
pickedItem.ReduceAmount(amount);
if (pickedItem.Amount <= 0) {
isPickedItem = false;
pickedItem.Hide ();
}
}
public void WearingEquipment(ItemUI equipmentToWear){
if ((equipmentToWear.Item is Equipment) == false) {
return;
}
foreach(Slot slot in slotList){
EquipmentSlot equipmentSlot = (slot as EquipmentSlot);
if(equipmentSlot && equipmentSlot.EquipmentTypeIsEqual (equipmentToWear.Item)){
if (equipmentSlot.transform.childCount > 0) {
// 人物已配戴裝備了,將裝備與背包的裝備交換
equipmentSlot.GetComponentInChildren ().ExchangeItem(equipmentToWear);
} else {
// 人物未配戴裝備,直接穿上
equipmentSlot.StoreItem (equipmentToWear.Item);
// 銷毀背包內的裝備
Destroy (equipmentToWear.gameObject);
}
break;
}
}
UpdatePropertyText ();
}
public ItemUI GetPickedItem(){
return pickedItem;
}
public Slot[] GetSlotList(){
return slotList;
}
public void ShowToolTip(string content){
toolTip.Show (content);
}
public void HideToolTip(){
toolTip.Hide ();
}
public void UpdatePropertyText(){
characterProperty.UpdatePropertyText ();
}
public bool StoreItem(int id){
Item item = GetItemByID (id);
return StoreItem (item);
}
public bool StoreItem(Item item){
if (item == null) {
return false;
}
// 若物品的儲存容量為1,則將該物品直接放進空的Slot
if (item.Capacity == 1) {
return StoreItemInEmptySlot (item);
}
// 將相同的Item放在同一個Slot
return StoreItemInSameSlot(item);
}
private bool StoreItemInSameSlot(Item item){
foreach (Slot slot in slotList) {
// 避開VendorSlot
if (slot is VendorSlot) {
continue;
}
if (slot.transform.childCount >= 1 && slot.GetItemID () == item.ID &&
slot.IsFilled () == false) {
// 將新Item與同一個Item放在一起
slot.StoreItem (item);
return true;
}
}
// 若背包內不存在相同的Item,則放進空的Slot
return StoreItemInEmptySlot (item);
}
private bool StoreItemInEmptySlot(Item item){
foreach (Slot slot in slotList) {
// 避開VendorSlot
if (slot is VendorSlot) {
continue;
}
if (slot.transform.childCount == 0) {
// 將Item存進該Slot
slot.StoreItem (item);
return true;
}
}
Debug.LogError ("No Empty Slot.");
return false;
}
private void PressGToAddItem(){
// 測試程式碼,手動生成物品
if (Input.GetKeyDown (KeyCode.G)) {
StoreItem (Random.Range(1,17));
}
}
private void InitialVendorItem(){
Item[] vendorItemList = new Item[10];
// 手動初始化要放入商店的物品
vendorItemList [0] = GetItemByID (1);
vendorItemList [1] = GetItemByID (2);
vendorItemList [2] = GetItemByID (3);
vendorItemList [3] = GetItemByID (4);
vendorItemList [4] = GetItemByID (5);
vendorItemList [5] = GetItemByID (6);
vendorItemList [6] = GetItemByID (7);
vendorItemList [7] = GetItemByID (8);
vendorItemList [8] = GetItemByID (1);
vendorItemList [9] = GetItemByID (2);
foreach (Item item in vendorItemList) {
foreach (Slot slot in slotList) {
// 限定Slot類型為VendorSlot
VendorSlot vendorSlot = (slot as VendorSlot);
// 如果同類型物品疊加在一起
if (vendorSlot && slot.transform.childCount >= 1
&& slot.GetItemID () == item.ID &&
slot.IsFilled () == false) {
slot.StoreItem (item);
break;
} // 如果沒有同類物品,則放入空Slot
else if (vendorSlot && slot.transform.childCount == 0) {
slot.StoreItem (item);
break;
}
}
}
}
private void MovePickedItemByMousePosition(){
if (isPickedItem) {
// 將滑鼠座標轉換成Canvas上的座標
Vector2 position;
Canvas canvas = GetComponentInParent
最後,執行遊戲看看吧,可以在商店中買賣物品了,金錢也會跟著變化。









留言
張貼留言