Использую интерфейсы 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). Оба срабатывают правильно. Мне нужно, что бы при перетягивании предмета в инвентаре правой кнопкой мыши он просто перетягивался, а если левой кнопкой мыши, то половина оставалась в том же слоте, а половина перетягивалась.
Мне кажется, что проблема несколько в другой области.
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))
{
//логика, если вы перетаскивали с помощью ПКМ
}
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
Клиент-серверное приложение на tcp/ip
Необходимо считать матрицу с бинарного файла (расширениеdat ) где первые два элемента идут целые числа указывающие количество строк и столбцов...
Такой вопрос, использовал раньше VisualStudio сейчас перешёл на Sublime в связи с тем что он "легче" для системыВ Visual есть команда #region и #endregion которая...
Нужно хранить локализованные названия свойств классов в словаре ресурсовСейчас делаю это так: