揹包系統優化
上一次發的揹包其實不能算面向對象。只是一種面向過程的解決了揹包的基本需求,這次更新面向對象該怎麼實現揹包。
多的就不說了,實現的效果是一樣的,說一下腳本。
首先抽取一個抽象類BagItem,如下:
using UnityEngine;
//裝備種類
public enum EquipType
{
//無類型
None,
//武器
Weapon,
//防具
Armor,
//鞋子
shoe
}
public abstract class BagItem : MonoBehaviour {
public EquipType type;
//揹包格子接收方法
public abstract void Receive(Equipment equip);
}
然後,裝備格子和揹包格子用同一個腳本繼承此抽象類,如下:
using UnityEngine;
public class BoxItem : BagItem
{ //用於判斷是否爲物品交換位置操作
public bool isExchange = false;
//重寫方法
public override void Receive(Equipment equip)
{ //如果是空的普通格子
if (type == EquipType.None && (isExchange || transform.childCount == 0))
{ //放入格子
SingleTon.GetInstance().SetEquipToBox(equip.transform, transform);
}
//如果是空的裝備格子且類型匹配
else if (type != EquipType.None && (isExchange || transform.childCount == 0) && equip.type == type)
{ //放入格子
SingleTon.GetInstance().SetEquipToBox(equip.transform, transform);
}
else
{ //回覆原位
SingleTon.GetInstance().SetEquipToBox(equip.transform, equip.parent);
}
//標誌位重置
isExchange = false;
}
}
然後寫一個單例,用來執行移位操作
using UnityEngine;
public class SingleTon{
private static SingleTon instance;
private SingleTon() { }
public static SingleTon GetInstance()
{
if (instance == null)
{
instance = new SingleTon();
}
return instance;
}
//將裝備放入指定格子
public void SetEquipToBox(Transform equip, Transform box)
{
equip.SetParent(box);
equip.localPosition = Vector3.zero;
equip.GetComponent<Equipment>().parent = box;
}
}
最後就是在裝備上掛上腳本,同樣繼承抽象類
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class Equipment : BagItem,IDragHandler,IBeginDragHandler,IEndDragHandler
{
//拿到圖片組件
private Image image;
//記錄父對象
public Transform parent;
void Awake()
{ //初始化圖片組件
image = GetComponent<Image>();
}
void Start()
{ //記錄父對象
parent = transform.parent;
}
public void OnBeginDrag(PointerEventData eventData)
{ //記錄父對象
parent = transform.parent;
//可以理解爲把所選裝備放在屏幕的最前面以防被其他UI遮擋
transform.SetParent(transform.root);
//關閉圖片射線檢測
image.raycastTarget = false;
}
public void OnDrag(PointerEventData eventData)
{
transform.position = Input.mousePosition;
}
public void OnEndDrag(PointerEventData eventData)
{ //拿到當前圖片下的遊戲對象的BagItem組件
BagItem bagItem = eventData.pointerEnter.GetComponent<BagItem>();
//如果不是空,調用接收方法
if (bagItem != null)
{
bagItem.Receive(this);
}
else
{ //否則復位
SingleTon.GetInstance().SetEquipToBox(transform, parent);
}
//開啓圖片射線檢測
image.raycastTarget = true;
}
public override void Receive(Equipment equip)
{ //獲取自己原來的格子
BoxItem myBox = parent.GetComponent<BoxItem>();
//獲取目標的格子
BoxItem otherBox = equip.parent.GetComponent<BoxItem>();
//如果兩個格子有一個是裝備格子
if (myBox.type != EquipType.None || otherBox.type != EquipType.None)
{ //且二者類型不匹配
if (equip.type != type)
{ //回到格子的格子
myBox.Receive(this);
otherBox.Receive(equip);
return;
}
}
//程序走到這裏,說明發生交換操作,將交換標誌設爲true
myBox.isExchange = true;
otherBox.isExchange = true;
//互相接收對方
myBox.Receive(equip);
otherBox.Receive(this);
}
}
點個關注,給個讚唄!