1、目标
当在道具栏中选中一个Item时,点击地面就可以实现Item的drop操作,每点击一次就drop一次,直到道具栏中Item数量不够。
这样的好处:避免每次Drop都从道具栏中拖拉Item,通过点击这种操作可以更加高效。
方法:通过EventHandler脚本创建Event,在Player脚本中处理点击并触发Event,在UIInvenrotySlot脚本中订阅Event进行处理。
2、优化EventHandler脚本
添加如下事件代码:

3、优化Player脚本
添加如下变量:
cs
private GridCursor gridCursor;
添加Start方法:
cs
private void Start()
{
gridCursor = FindObjectOfType<GridCursor>();
}
在Update中添加如下代码:

其具体实现如下:
cs
private void PlayerClickInput()
{
if (Input.GetMouseButton(0))
{
if (gridCursor.CursorIsEnabled)
{
ProcessPlayerClickInput();
}
}
}
相关的代码实现如下:
cs
private void ProcessPlayerClickInput()
{
ResetMovement();
// Get Selected item details
ItemDetails itemDetails = InventoryManager.Instance.GetSelectedInventoryItemDetails(InventoryLocation.player);
if(itemDetails != null)
{
switch (itemDetails.itemType)
{
case ItemType.Seed:
if (Input.GetMouseButtonDown(0))
{
ProcessPlayerClickInputSeed(itemDetails);
}
break;
case ItemType.Commodity:
if (Input.GetMouseButtonDown(0))
{
ProcessPlayerClickInputCommodity(itemDetails);
}
break;
case ItemType.none:
break;
case ItemType.count:
break;
default:
break;
}
}
}
private void ProcessPlayerClickInputSeed(ItemDetails itemDetails)
{
if(itemDetails.canBeDropped && gridCursor.CursorPositionIsValid)
{
EventHandler.CallDropSelectedItemEvent();
}
}
private void ProcessPlayerClickInputCommodity(ItemDetails itemDetails)
{
if(itemDetails.canBeDropped && gridCursor.CursorPositionIsValid)
{
EventHandler.CallDropSelectedItemEvent();
}
}
4、优化UIInventorySlot脚本
在OnEnable方法中增加如下代码,订阅事件并进行处理。

5、运行程序
