一起来玩U3D之角色背包功能实现

这个背包是博主刚学完UGUI的八个回调时写的简陋版,之后会更新一个进阶版。

个人觉得理解这个之后,再去写复杂的背包功能(已更新https://blog.csdn.net/maybe_ice/article/details/104908125)

UI展示如下:
在这里插入图片描述

具体要求

一个格子只能放一件物品,武器格子只能放武器,防具格子只能放防具(我这里直接通过TAG区分)。。。
物品在背包中可以随便放位置,可以随意交换位置
装备武器后可以更换武器

很简单的背包基本功能。

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class EquipItemController : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
	private Image currentImage;

	/// <summary>
	/// 物品原先所在的格子
	/// </summary>
	private Transform originParent;

	void Awake()
	{
		//初始化当前拖拽的物品
		currentImage = GetComponent<Image>();
	}

	public void OnBeginDrag(PointerEventData eventData)
	{
		//开始拖拽的时候记住当前物品所属的父对象(物品格子)
		originParent = transform.parent.transform;
		//将当前拖拽的物品的图片的射线检测关闭
		currentImage.raycastTarget = false;
	}

	public void OnDrag(PointerEventData eventData)
	{	
		//拖拽时让当前物品跟着鼠标移动
		transform.position = Input.mousePosition;
		//
		始终让物品保持在UI的最前面,以防被其他UI遮挡
		transform.SetParent(eventData.pointerEnter.transform);

		transform.SetAsFirstSibling();

	}

	public void OnEndDrag(PointerEventData eventData)
	{
		//如果物品当前所处位置是空的背包格子,就直接移动物品
		if (eventData.pointerEnter.transform.tag.Equals("Grid") && eventData.pointerEnter.transform.childCount == 1)
		{
			transform.SetParent(eventData.pointerEnter.transform);

		}
		//如果物品当前所处位置是空的武器背包格子且拖拽的物品是武器,就直接移动物品
		else if (eventData.pointerEnter.transform.tag.Equals("WeaponBox") && transform.tag.Equals("Weapon") && eventData.pointerEnter.transform.childCount == 1)
		{
			transform.SetParent(eventData.pointerEnter.transform);

		}
		//如果物品当前所处位置是空的防具背包格子且拖拽的物品是防具,就直接移动物品
		else if (eventData.pointerEnter.transform.tag.Equals("ArmorBox") && transform.tag.Equals("Armor") && eventData.pointerEnter.transform.childCount == 1)
		{
			transform.SetParent(eventData.pointerEnter.transform);

		}
		//如果物品当前所处位置是空的移速背包格子且拖拽的物品是移速,就直接移动物品
		else if (eventData.pointerEnter.transform.tag.Equals("SpeedBox") && transform.tag.Equals("Speed") && eventData.pointerEnter.transform.childCount == 1)
		{
			transform.SetParent(eventData.pointerEnter.transform);

		}
		//如果物品当前所处位置是别的物品进入下面的判断
		else if (eventData.pointerEnter.transform.tag.Equals("Speed") || eventData.pointerEnter.transform.tag.Equals("Armor") || eventData.pointerEnter.transform.tag.Equals("Weapon"))
		{
			//如果当前检测到的物品的父对象(物品格子)的标签以拖拽物品的标签开头,交换两个物品的位置
			if (eventData.pointerEnter.transform.parent.tag.StartsWith(transform.tag))
			{
				ExchangeItem(transform, eventData);

			}
			//如果当前检测到的物品的父对象(物品格子)的标签是普通的物品格子标签,直接交换物品位置
			else if (eventData.pointerEnter.transform.parent.tag.Equals("Grid"))
			{
				ExchangeItem(transform, eventData);

			}
			else
			{
				//回复原位
				transform.SetParent(originParent);
			}
			
		}
		else
		{
			//回复原位
			transform.SetParent(originParent);
		}
		//结束拖拽时将拖拽的物品的图片的射线检测打开
		currentImage.raycastTarget = true;
		//调整物品位置
		transform.localPosition = Vector3.zero;

	}
	//物品交换方法
	public void ExchangeItem(Transform transform, PointerEventData eventData)
	{	//将当前拖拽的物品的父对象设置为要交换的物品的父对象
		transform.SetParent(eventData.pointerEnter.transform.parent);
		//将要交换的物品的父对象设置为当前拖拽物品在拖拽之前保存的父对象
		eventData.pointerEnter.transform.SetParent(originParent);
		//调整被交换的物品的位置
		eventData.pointerEnter.transform.localPosition = Vector3.zero;
	}

}

好了,背包就简单的介绍到这里。(复杂的背包链接https://blog.csdn.net/maybe_ice/article/details/104908125

点个关注,给个赞呗!

猜你喜欢

转载自blog.csdn.net/maybe_ice/article/details/104858718