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

这篇博客介绍了作者在学习UGUI后实现的一个简陋版游戏背包功能,包括UI展示和基本操作,如物品放置、交换位置和装备武器。后续已更新为进阶版,详细内容可参见链接。

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

个人觉得理解这个之后,再去写复杂的背包功能(已更新https://blog.youkuaiyun.com/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.youkuaiyun.com/maybe_ice/article/details/104908125

点个关注,给个赞呗!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值