一起來玩U3D之揹包系統優化

揹包系統優化

上一次發的揹包其實不能算面向對象。只是一種面向過程的解決了揹包的基本需求,這次更新面向對象該怎麼實現揹包。

多的就不說了,實現的效果是一樣的,說一下腳本。

首先抽取一個抽象類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);

	}

}

點個關注,給個讚唄!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章