Проверка Input.GetMouseButtonUp(1) не срабатывает

132
22 мая 2019, 22:10

Использую интерфейсы IBeginDragHandler, IDragHandler, IEndDragHandler.

В методе OnEndDrag есть 2 условия :

if (Input.GetMouseButtonUp(0)){...}
if (Input.GetMouseButtonUp(1)){...}.

Между ними нету else. Если я отпускаю кнопку мыши 0, то проверка на Input.GetMouseButtonUp(0) срабатывает, а если нажимаю на кнопку мыши 1, то проверка на Input.GetMouseButtonUp(1) не срабатывает. Пробывал поставить вместо Up - Down или же вообще ничего - все равно не работает.

Скрипт -

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class DragItemsInInventory : MonoBehaviour, IBeginDragHandler, 
IDragHandler, IEndDragHandler
{
public ItemScript itemScript;
[SerializeField]
private Transform player;
private Inventory inventory;
private int lastSlotIndex;
private int lastAmount;
public GameObject DraggingObject;
private GameObject InstantiatedObject;
public void OnBeginDrag(PointerEventData eventData)
{
    lastSlotIndex = transform.parent.GetComponent<Transform>().GetSiblingIndex();
    if (Input.GetMouseButton(0))
    {
        inventory = GameObject.Find("InventoryCanvas").transform.Find("Slots").GetComponent<Inventory>();
        player = GameObject.FindGameObjectWithTag("MainPlayer").GetComponent<Transform>();
        itemScript = GetComponent<ItemScript>();
        GetComponent<Image>().raycastTarget = false;
    }
    if (Input.GetMouseButton(1))
    {
        lastSlotIndex = transform.parent.GetComponent<Transform>().GetSiblingIndex();
        DraggingObject = Instantiate(eventData.pointerCurrentRaycast.gameObject.GetComponent<ItemScript>().InventoryIcon, inventory.slots[lastSlotIndex].transform);
        DraggingObject.GetComponent<ItemScript>().amount = eventData.pointerCurrentRaycast.gameObject.GetComponent<ItemScript>().amount / 2;
        eventData.pointerCurrentRaycast.gameObject.GetComponent<ItemScript>().amount = eventData.pointerCurrentRaycast.gameObject.GetComponent<ItemScript>().amount - DraggingObject.GetComponent<ItemScript>().amount;
        inventory = GameObject.Find("InventoryCanvas").transform.Find("Slots").GetComponent<Inventory>();
        player = GameObject.FindGameObjectWithTag("MainPlayer").GetComponent<Transform>();
        itemScript = GetComponent<ItemScript>();
    }
    OnDrag(eventData);
}
public void OnDrag(PointerEventData eventData)
{
    if (Input.GetMouseButton(0)) {
        transform.position = Input.mousePosition;
    } else if (Input.GetMouseButton(1))
    {
        DraggingObject.transform.position = Input.mousePosition;
    }
}
public void OnEndDrag(PointerEventData eventData)
{
    if (Input.GetMouseButtonUp(0))
    {
        if (eventData.pointerCurrentRaycast.gameObject == null)
        {
            lastAmount = inventory.slots[lastSlotIndex].GetComponent<SlotScript>().amount;
            InstantiatedObject = Instantiate(itemScript.MainObject, player.position + new Vector3(0, -0.9755f, 0), Quaternion.Euler(0, player.rotation.y, 90)) as GameObject;
            InstantiatedObject.GetComponent<ItemScript>().amount = lastAmount;
            inventory.slots[lastSlotIndex].GetComponent<SlotScript>().amount = 0;
            inventory.slots[lastSlotIndex].GetComponent<SlotScript>().Name = "";
            inventory.isFull[lastSlotIndex] = false;
            Destroy(gameObject);
        }
        else if (eventData.pointerCurrentRaycast.gameObject.tag == "Slot")
        {
            eventData.pointerCurrentRaycast.gameObject.GetComponent<SlotScript>().Name = inventory.slots[lastSlotIndex].GetComponent<SlotScript>().Name;
            inventory.isFull[lastSlotIndex] = false;
            inventory.slots[lastSlotIndex].GetComponent<SlotScript>().Name = "";
            eventData.pointerCurrentRaycast.gameObject.GetComponent<SlotScript>().amount = inventory.slots[lastSlotIndex].GetComponent<SlotScript>().amount;
            inventory.slots[lastSlotIndex].GetComponent<SlotScript>().amount = 0;
            transform.SetParent(eventData.pointerCurrentRaycast.gameObject.transform);
            GetComponent<RectTransform>().anchoredPosition = Vector3.zero;
            GetComponent<Image>().raycastTarget = true;
            inventory.isFull[eventData.pointerCurrentRaycast.gameObject.transform.GetSiblingIndex()] = true;
        }
        if (Input.GetMouseButtonUp(1))
        {
            Debug.Log(eventData.pointerCurrentRaycast.gameObject.transform.name + "    aaaa");
            lastAmount = DraggingObject.GetComponent<ItemScript>().amount;
            if (eventData.pointerCurrentRaycast.gameObject == null)
            {
                InstantiatedObject = Instantiate(itemScript.MainObject, player.position + new Vector3(0, -0.9755f, 0), Quaternion.Euler(0, player.rotation.y, 90)) as GameObject;
                InstantiatedObject.GetComponent<ItemScript>().amount = lastAmount;
                inventory.slots[lastSlotIndex].GetComponent<SlotScript>().amount = inventory.slots[lastSlotIndex].GetComponent<SlotScript>().amount - lastAmount;
                Destroy(gameObject);
            }
            else if (eventData.pointerCurrentRaycast.gameObject.tag == "Slot")
            {
                eventData.pointerCurrentRaycast.gameObject.GetComponent<SlotScript>().Name = inventory.slots[lastSlotIndex].GetComponent<SlotScript>().Name;
                eventData.pointerCurrentRaycast.gameObject.GetComponent<SlotScript>().amount = inventory.slots[lastSlotIndex].GetComponent<SlotScript>().amount - lastAmount;
                inventory.slots[lastSlotIndex].GetComponent<SlotScript>().amount = eventData.pointerCurrentRaycast.gameObject.GetComponent<SlotScript>().amount;
                DraggingObject.transform.SetParent(eventData.pointerCurrentRaycast.gameObject.transform);
                DraggingObject.GetComponent<RectTransform>().anchoredPosition = Vector3.zero;
                DraggingObject.GetComponent<Image>().raycastTarget = true;
                inventory.isFull[eventData.pointerCurrentRaycast.gameObject.transform.GetSiblingIndex()] = true;
            }
        }
    }
}

}

Хочу добавить, что в методе OnBeginDrag есть проверки if (Input.GetMouseButtonDown(0) и if (Input.GetMouseButtonDown(1). Оба срабатывают правильно. Мне нужно, что бы при перетягивании предмета в инвентаре правой кнопкой мыши он просто перетягивался, а если левой кнопкой мыши, то половина оставалась в том же слоте, а половина перетягивалась.

Answer 1

Мне кажется, что проблема несколько в другой области.

GetMouseButton(int) - метод будет возвращаться true, каждый кадр, пока нажата нужная кнопка мыши.
GetMouseDown(int) - возвращает true только в том кадре, в котором кнопка была нажата.
GetMouseUp(int) - возвращает true только в том кадре, в котором кнопку отпустили.

Другими словами - в OnBeginDrag и OnDrag всё нормально потому, что вы проверяете сам факт того, что кнопка нажата, а вот в OnEndDrag вы уже проверяете "отпускание" кнопки в конкретном кадре. Чтобы у вас сработало обе проверки, нужно чтобы вы отпустили обе кнопки мыши в один и тот же кадр (сколько их там у вас в секунду?). При этом OnEndDragу вас вызовется только при "отпускании" той кнопки, с помощью которой перетаскивание тригирнулось.

Как вариант, проверить кнопку 1 через GetMouseButton(1) - это решит проблему с отпусканием кнопки 0, когда 1 уже была отпущена. Но, возможно, стоит как-то переделать логику управления?) а то звучит не сильно удобно. Например, можно добавить участие Shift или Ctrl, как обычно делают в рпг играх)

После уточняющего комментария дополняю пост: Метод OnEndDrag интерфейса IEndDragHandler вызовется только при "отпускании" той кнопки, с которой перетаскивание было начато. Другими словами вам достаточно делать проверку такого вида:

if (Input.GetMouseButtonUp(0))
{
    //логика, если вы перетаскивали с помощью ЛКМ
}
else if (Input.GetMouseButtonUp(1))
{
    //логика, если вы перетаскивали с помощью ПКМ
}
READ ALSO
Чтение бинарного файла С#

Чтение бинарного файла С#

Необходимо считать матрицу с бинарного файла (расширениеdat ) где первые два элемента идут целые числа указывающие количество строк и столбцов...

143
Sublime Text 3 Plugins

Sublime Text 3 Plugins

Такой вопрос, использовал раньше VisualStudio сейчас перешёл на Sublime в связи с тем что он "легче" для системыВ Visual есть команда #region и #endregion которая...

139
Аналог nameof для XAML

Аналог nameof для XAML

Нужно хранить локализованные названия свойств классов в словаре ресурсовСейчас делаю это так:

137