【Untiy2D独立/合作开发】特别篇:如何实现快速丢掉物品

学习目标:

  

一天两更累的一批,那么今天就来实现如何快速丢掉物品而不是只能拖拽物品这样能快速处理背包物品


学习内容:

首先先去EventHandler上新建一个事件

 public static event Action DropItemSelectedEvent;

    public static void CallDropItemSelectedEvent()
    {
        if (DropItemSelectedEvent != null)
            DropItemSelectedEvent();
    }

去PlayerController添加input当点击鼠标左键的时候就能有了

private void Update()
    {
        if (PlayerInputDisabled)
            return;

        PlayerClickInput();


    }

 private void PlayerClickInput()
    {
        if (Input.GetMouseButtonDown(0))
        {
            if (gridCursor.CursorIsEnabled)
            {
                ProcessPlayerClickInput();
            }
        }
    }
private void ProcessPlayerClickInput()
    {
        ResetMovement();

        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.CallDropItemSelectedEvent();
        }
    }

    private void ProcessPlayerClickInputCommodity(ItemDetails itemDetails)
    {
        if (itemDetails.canBeDropped && gridCursor.CursorPositionIsValid)
        {
            EventHandler.CallDropItemSelectedEvent();
        }
}

 那么我们创建的事件要在哪里订阅了,答案是UIInventorySlot上

 private void OnEnable()
    {
        EventHandler.AfterSceneLoadEvent += SceneLoaded;
        EventHandler.DropItemSelectedEvent += DropSelectedItemMousePosition;
    }

    private void OnDisable()
    {
        EventHandler.AfterSceneLoadEvent -= SceneLoaded;
        EventHandler.DropItemSelectedEvent -= DropSelectedItemMousePosition;
    }

private void DropSelectedItemMousePosition()
    {
        if(itemDetails != null && isSelected)
        {
            if (gridCursor.CursorPositionIsValid)
            {
                Vector3 worldPosition = mainCamera.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, -mainCamera.transform.position.z));

                GameObject itemGameobject = Instantiate(itemPrefab, new Vector3(worldPosition.x , worldPosition.y - Settings.gridCellSize/2, worldPosition.z), Quaternion.identity, itemParent);
                Item item = itemGameobject.GetComponent<Item>();
                item.ItemCode = itemDetails.itemCode;

                InventoryManager.Instance.RemoveItem(InventoryLocation.player, item.ItemCode);

                if (InventoryManager.Instance.FindItemInventory(InventoryLocation.player, item.ItemCode) == -1)
                {
                    ClearSelectedItem();
                }
            }
        }
    }

完整版如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using TMPro;
using UnityEngine.UI;
using System;

public class UIInventorySlot : MonoBehaviour,IBeginDragHandler,IDragHandler,IEndDragHandler,IPointerEnterHandler,IPointerExitHandler,IPointerClickHandler
{
    private Canvas parentCanvas;
    private Camera mainCamera;
    private GameObject draggedItem;
    private GridCursor gridCursor;
    private Transform itemParent;

    [SerializeField] private float TextboxDistance = 25f;
    public Image inventorySlotHighlight;
    public Image inventorySlotImage;
    public TextMeshProUGUI textMeshProUGUI;

    [SerializeField] private UIInventoryBar inventoryBar = null;
    [HideInInspector] public ItemDetails itemDetails;
    [SerializeField] private GameObject InventoryTextboxPrefab = null;
    [SerializeField] private GameObject itemPrefab = null;
    [HideInInspector] public int itemQuantity;
    [SerializeField] private int slotNumber = 0;
    [HideInInspector] public bool isSelected = false;

    private void Awake()
    {
        parentCanvas = transform.GetComponentInParent<Canvas>();
    }

    private void OnEnable()
    {
        EventHandler.AfterSceneLoadEvent += SceneLoaded;
        EventHandler.DropItemSelectedEvent += DropSelectedItemMousePosition;
    }

    private void OnDisable()
    {
        EventHandler.AfterSceneLoadEvent -= SceneLoaded;
        EventHandler.DropItemSelectedEvent -= DropSelectedItemMousePosition;
    }

    public void SceneLoaded()
    {
        itemParent = GameObject.FindGameObjectWithTag(Tags.ItemsParentTransform).transform;
    }

    private void Start()
    {
        mainCamera = Camera.main;
        gridCursor = FindObjectOfType<GridCursor>();
    }

    private void ClearCursor()
    {
        gridCursor.DisableCursor();

        gridCursor.SelectedItemType = ItemType.None;
    }

    public void OnBeginDrag(PointerEventData eventData)
    {
        if(itemDetails != null)
        {
            PlayerController.Instance.DisablePlayerInputAndResetMovement();

            draggedItem = Instantiate(inventoryBar.inventoryBarDragItem, inventoryBar.transform);

            Image draggedItemImage = draggedItem.GetComponentInChildren<Image>();
            draggedItemImage.sprite = inventorySlotImage.sprite;
            Debug.Log("draggedItemImage.sprite" + draggedItemImage.sprite);
        }
    }

    public void OnDrag(PointerEventData eventData)
    {
        if(draggedItem != null)
        {
            draggedItem.transform.position = Input.mousePosition;
        }
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        if(draggedItem != null)
        {
            Destroy(draggedItem);

            if(eventData.pointerCurrentRaycast.gameObject != null && eventData.pointerCurrentRaycast.gameObject.GetComponent<UIInventorySlot>() != null)
            {
                int toSlotNumber = eventData.pointerCurrentRaycast.gameObject.GetComponent<UIInventorySlot>().slotNumber;

                InventoryManager.Instance.SwapInventoryItems(InventoryLocation.player,slotNumber,toSlotNumber);

                DestoryInventoryTextbox();

                ClearSelectedItem();
            }
            else
            {
                if (itemDetails.canBeDropped)
                {
                    DropSelectedItemMousePosition();
                }
            }

            PlayerController.Instance.EnablePlayerInput();
        }
    }

    private void DropSelectedItemMousePosition()
    {
        if(itemDetails != null && isSelected)
        {
            if (gridCursor.CursorPositionIsValid)
            {
                Vector3 worldPosition = mainCamera.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, -mainCamera.transform.position.z));

                GameObject itemGameobject = Instantiate(itemPrefab, new Vector3(worldPosition.x , worldPosition.y - Settings.gridCellSize/2, worldPosition.z), Quaternion.identity, itemParent);
                Item item = itemGameobject.GetComponent<Item>();
                item.ItemCode = itemDetails.itemCode;

                InventoryManager.Instance.RemoveItem(InventoryLocation.player, item.ItemCode);

                if (InventoryManager.Instance.FindItemInventory(InventoryLocation.player, item.ItemCode) == -1)
                {
                    ClearSelectedItem();
                }
            }
        }
    }

    public void OnPointerEnter(PointerEventData eventData)
    {
        if (itemQuantity != 0)
        {
            inventoryBar.inventoryTextBoxGameObject = Instantiate(InventoryTextboxPrefab, transform.position, Quaternion.identity);
            inventoryBar.inventoryTextBoxGameObject.transform.SetParent(parentCanvas.transform, false);

            UIInventoryTextBox inventoryTextBox = inventoryBar.inventoryTextBoxGameObject.GetComponent<UIInventoryTextBox>();

            string itemTypeDescrption = InventoryManager.Instance.GetItemTypeDesciption(itemDetails.itemType);

            inventoryTextBox.SetTextboxText(itemDetails.itemDescription, itemTypeDescrption, "", itemDetails.itemDescription, "", "");

            if (inventoryBar.IsInventoryBarPositionBottom)
            {
                inventoryBar.inventoryTextBoxGameObject.GetComponent<RectTransform>().pivot = new Vector2(0.5f, 0f);
                inventoryBar.inventoryTextBoxGameObject.transform.position = new Vector3(transform.position.x, transform.position.y + TextboxDistance, transform.position.z);
            }
            else
            {
                inventoryBar.inventoryTextBoxGameObject.GetComponent<RectTransform>().pivot = new Vector2(0.5f, 1f);
                inventoryBar.inventoryTextBoxGameObject.transform.position = new Vector3(transform.position.x, transform.position.y - TextboxDistance, transform.position.z);
            }
        }
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        DestoryInventoryTextbox();
    }

    private void DestoryInventoryTextbox()
    {
        if (inventoryBar.inventoryTextBoxGameObject != null)
            Destroy(inventoryBar.inventoryTextBoxGameObject);
    }

    public void OnPointerClick(PointerEventData eventData)
    {
        if(eventData.button == PointerEventData.InputButton.Left)
        {
            if (isSelected)
            {
                ClearSelectedItem();
            }
            else
            {
                if(itemQuantity > 0)
                {
                    SetSelectedItem();
                }
            }
        }
    }

    private void SetSelectedItem()
    {
        inventoryBar.ClearHighlightOnInventorySlots();

        isSelected = true;

        inventoryBar.SetHightedInventorySlot();

        gridCursor.ItemUseGridRaudius = itemDetails.itemUseGridRadius;

        if(itemDetails.itemUseGridRadius > 0)
        {
            gridCursor.EnableCursor();
        }
        else
        {
            gridCursor.DisableCursor();
        }

        gridCursor.SelectedItemType = itemDetails.itemType;

        InventoryManager.Instance.SetSelectedInventoryItem(InventoryLocation.player,itemDetails.itemCode);

        if (itemDetails.canBeCarried)
        {
            //如果canBeCarryied就覆盖之前的动画
            PlayerController.Instance.ShowCarriedItem(itemDetails.itemCode);
        }
        else
        {
            PlayerController.Instance.ClearCarriedItem();
        }
    }

    private void ClearSelectedItem()
    {
        ClearCursor();

        inventoryBar.ClearHighlightOnInventorySlots();

        isSelected = false;

        InventoryManager.Instance.ClearSelectedInventoryItem(InventoryLocation.player);

        PlayerController.Instance.ClearCarriedItem();
    }
}

学习产出:

当你点击就有了,那我先睡了,明天开始继续出,明天见吧

猜你喜欢

转载自blog.csdn.net/dangoxiba/article/details/126899768