5-16 Character Property Panel
本章要來講講顯示人物屬性的視窗,主要是從背包內裝上裝備後,必須要更新人物屬性數值。首先,讓我們在Character Panel中新增一個UI/Panel。
新的Panel取名為Property Panel,然後在底下新增一個UI/Text,這是要用來顯示人數屬性的。
然後,Text的Anchor Presets請設定成stretch stretch。
然後請大家自己調整一下文字的大小、顏色。
最後,大致上做成如下圖的模樣,Property Panel的背景底圖就請大家自己找找吧。
接著,新增一個Script名為CharacterProperty.cs。
CharacterProperty.cs的原始碼如下:
然後將CharacterProperty.cs拉進Text底下。
接著修改InventorySystem.cs,主要變動的地方如下圖,僅是新增了一個方法用來呼叫CharacterProperty的UpdatePropertyText方法。
InventorySystem.cs:
修改完以後,記得在Canvas的InventorySystem中,要設定Character Property屬性,將Text拉進去。
最後,我們在EquipmentSlot.cs中,有一些穿脫裝備的地方需要更新人物屬性。
新的Panel取名為Property Panel,然後在底下新增一個UI/Text,這是要用來顯示人數屬性的。
然後,Text的Anchor Presets請設定成stretch stretch。
然後請大家自己調整一下文字的大小、顏色。
最後,大致上做成如下圖的模樣,Property Panel的背景底圖就請大家自己找找吧。
接著,新增一個Script名為CharacterProperty.cs。
CharacterProperty.cs的原始碼如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace RPG.Inventory{
public class CharacterProperty : MonoBehaviour {
[SerializeField] int baseStrength = 10;
[SerializeField] int baseIntellect = 10;
[SerializeField] int baseAgility = 10;
[SerializeField] int baseStamina = 10;
Text propertyText;
InventorySystem inventorySystem;
void Start(){
propertyText = GetComponent ();
inventorySystem = GetComponentInParent ();
}
public void UpdatePropertyText(){
int strength = 0;
int intellect = 0;
int agility = 0;
int stamina = 0;
Slot[] slotList = inventorySystem.GetSlotList ();
if (slotList.Length == 0) {
return;
}
foreach (Slot slot in slotList) {
EquipmentSlot equipmentSlot = (slot as EquipmentSlot);
if (equipmentSlot && slot.transform.childCount > 0) {
Item item = slot.transform.GetComponentInChildren ().Item;
if (item is Equipment) {
Equipment equipment = (item as Equipment);
strength += equipment.Strength;
intellect += equipment.Intellect;
agility += equipment.Agility;
stamina += equipment.Stamina;
}
}
}
strength += baseStrength;
intellect += baseIntellect;
agility += baseAgility;
stamina += baseStamina;
string text = string.Format ("力量:{0}\n智力:{1}\n敏捷:{2}\n體力:{3}",
strength, intellect, agility, stamina);
propertyText.text = text;
}
}
}
然後將CharacterProperty.cs拉進Text底下。
接著修改InventorySystem.cs,主要變動的地方如下圖,僅是新增了一個方法用來呼叫CharacterProperty的UpdatePropertyText方法。
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;
void Start () {
ParseItemsJson ();
slotList = GetComponentsInChildren ();
}
void Update(){
PressGToAddItem ();
MovePickedItemByMousePosition ();
DiscardPickedItem ();
}
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 void PressGToAddItem(){
// 測試程式碼,手動生成物品
if (Input.GetKeyDown (KeyCode.G)) {
StoreItem (Random.Range(1,17));
}
}
private void MovePickedItemByMousePosition(){
if (isPickedItem) {
// 將滑鼠座標轉換成Canvas上的座標
Vector2 position;
Canvas canvas = GetComponentInParent
修改完以後,記得在Canvas的InventorySystem中,要設定Character Property屬性,將Text拉進去。
最後,我們在EquipmentSlot.cs中,有一些穿脫裝備的地方需要更新人物屬性。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
namespace RPG.Inventory{
public class EquipmentSlot : Slot {
[SerializeField] public EquipmentType equipmentType;
public override void OnPointerDown(PointerEventData eventData){
// 使用滑鼠右鍵自動脫下裝備
if (eventData.button == PointerEventData.InputButton.Right
&& invetorySystem.isPickedItem == false && transform.childCount > 0) {
ItemUI clickedItemUI = GetComponentInChildren ();
invetorySystem.StoreItem (clickedItemUI.Item);
DestroyImmediate (clickedItemUI.gameObject);
invetorySystem.UpdatePropertyText ();
}
if (eventData.button != PointerEventData.InputButton.Left) {
return;
}
if (invetorySystem.isPickedItem == true) {
Item pickedItem = invetorySystem.GetPickedItem ().Item;
// 判斷手上的裝備類型是否與該Slot的裝備類型相同
if (EquipmentTypeIsEqual (pickedItem)) {
if (transform.childCount > 0) {
// 若裝備槽有東西,將手上的物品與裝備槽交換
ItemUI clickedItemUI = transform.GetChild (0).GetComponent ();
invetorySystem.GetPickedItem ().ExchangeItem (clickedItemUI);
invetorySystem.UpdatePropertyText ();
} else {
// 若裝備槽沒東西,直接把手上的東西放進去
PutInOneItem();
invetorySystem.UpdatePropertyText ();
}
}
} else {
if (transform.childCount > 0) {
// 若裝備槽有東西,將裝備拿到手上
ItemUI clickedItemUI = transform.GetChild (0).GetComponent ();
PickupAllSlotItem(clickedItemUI);
invetorySystem.UpdatePropertyText ();
}
}
}
public bool EquipmentTypeIsEqual(Item item){
return item is Equipment && (item as Equipment).TheEquipmentType == equipmentType;
}
}
}









留言
張貼留言