188 lines
5.5 KiB
C#
188 lines
5.5 KiB
C#
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using UnityEngine;
|
||
|
using UnityEngine.UI;
|
||
|
using UnityEngine.EventSystems;
|
||
|
using System;
|
||
|
using static SimpleInventorySystem.GridUI;
|
||
|
|
||
|
namespace SimpleInventorySystem
|
||
|
{
|
||
|
public class SlotUI : MonoBehaviour, IDropHandler
|
||
|
{
|
||
|
public int width;
|
||
|
public int height;
|
||
|
public bool useImageAsSlotHolder;
|
||
|
public Image image;
|
||
|
public GridUI grid;
|
||
|
public GridUI.Cell cell;
|
||
|
public ItemUI itemUI;
|
||
|
[HideInInspector] public GroupSlotUI groupSlot;
|
||
|
private AppendUI appendUI;
|
||
|
|
||
|
internal ItemUI GetItemUI()
|
||
|
{
|
||
|
return itemUI;
|
||
|
}
|
||
|
|
||
|
public float imageScale = 1f;
|
||
|
public List<ItemTags> AllowedItemTags;
|
||
|
|
||
|
public void OnDrop(PointerEventData eventData)
|
||
|
{
|
||
|
//
|
||
|
//("OnDrop");
|
||
|
if (eventData.pointerDrag != null && AllowedDraggable(eventData.pointerDrag))
|
||
|
{
|
||
|
DropOntoSlot(eventData.pointerDrag);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public bool AllowedDraggable(GameObject gameObject)
|
||
|
{
|
||
|
return gameObject.GetComponent<ItemUI>() != null;
|
||
|
}
|
||
|
|
||
|
public bool DropOntoSlot(GameObject item)
|
||
|
{
|
||
|
ItemUI itemDrop = item.GetComponent<ItemUI>();
|
||
|
List<Cell> occupiedCells = new List<Cell>();
|
||
|
|
||
|
bool dropCheck = grid.CanMoveInCells(itemDrop, this, occupiedCells);
|
||
|
|
||
|
ItemTags itemTag = itemDrop.ItemTag;
|
||
|
|
||
|
bool allowed = AllowedItemTags == null || AllowedItemTags.Count == 0 || AllowedItemTags.Contains(ItemTags.Any) || AllowedItemTags.Contains(itemTag);
|
||
|
|
||
|
Debug.Log("GridUI: DropOntoSlot(): " + gameObject.name + ": " + "dropCheck: " + dropCheck);
|
||
|
Debug.Log("GridUI: DropOntoSlot(): " + gameObject.name + ": " + "allowed: " + allowed);
|
||
|
|
||
|
if (dropCheck && allowed)
|
||
|
{
|
||
|
Debug.Log("SlotUI: " + occupiedCells.Count);
|
||
|
itemDrop.SetSlots(occupiedCells);
|
||
|
|
||
|
Transform parent = transform;
|
||
|
if (useImageAsSlotHolder && image != null)
|
||
|
{
|
||
|
parent = image.gameObject.transform;
|
||
|
}
|
||
|
item.GetComponent<Transform>().SetParent(parent);
|
||
|
item.GetComponent<RectTransform>().anchoredPosition = GetComponent<RectTransform>().anchoredPosition;
|
||
|
//item.GetComponent<RectTransform>().pivot = new Vector2(0, 1);
|
||
|
itemDrop.SetImageScale(imageScale);
|
||
|
itemDrop.SetSlot(this);
|
||
|
this.itemUI = itemDrop;
|
||
|
grid.HideSlotsOfItem(itemDrop);
|
||
|
HideImage();
|
||
|
|
||
|
if(groupSlot != null)
|
||
|
{
|
||
|
groupSlot.OnItemDropped();
|
||
|
}
|
||
|
if (appendUI != null)
|
||
|
{
|
||
|
appendUI.AppendUIToTransform();
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
else if (itemDrop.previousSlot != this)
|
||
|
{
|
||
|
Debug.LogWarning("SlotUI: Failed to drop. dropCheck: " + dropCheck + ", allowed: " + allowed);
|
||
|
// return item to previous parent
|
||
|
itemDrop.ReturnToSlot();
|
||
|
return false;
|
||
|
//Debug.Log("Resetting parent");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Debug.LogWarning("SlotUI: Failed to drop. dropCheck: " + dropCheck + ", allowed: " + allowed);
|
||
|
Debug.LogError("SlotUI: Something wrong has happened.");
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Awake()
|
||
|
{
|
||
|
if(image == null)
|
||
|
{
|
||
|
Image[] images = GetComponentsInChildren<Image>(); // This will retrieve the first instance of an image in the FIRST child with the component
|
||
|
//Debug.Log(images.Length);
|
||
|
if(images.Length > 0)
|
||
|
{
|
||
|
if(images[0].transform == transform)
|
||
|
{
|
||
|
if(images.Length > 1)
|
||
|
{
|
||
|
image = images[1];
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
image = images[0];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(grid == null)
|
||
|
grid = GetComponentInParent<GridUI>();
|
||
|
|
||
|
if(TryGetComponent(out AppendUI aui))
|
||
|
{
|
||
|
appendUI = aui;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void RemoveDragDropItem()
|
||
|
{
|
||
|
ShowImage();
|
||
|
|
||
|
if (cell != null)
|
||
|
{
|
||
|
cell.inUse = false;
|
||
|
}
|
||
|
|
||
|
if(groupSlot != null)
|
||
|
{
|
||
|
groupSlot.OnItemRemoved();
|
||
|
}
|
||
|
|
||
|
if (appendUI != null)
|
||
|
{
|
||
|
appendUI.RemoveUIFromTransform();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public bool IsSingleCellSlot()
|
||
|
{
|
||
|
return width == 1 && height == 1;
|
||
|
}
|
||
|
|
||
|
// Start is called before the first frame update
|
||
|
void Start()
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
// Update is called once per frame
|
||
|
void Update()
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
internal void HideImage()
|
||
|
{
|
||
|
if(image != null)
|
||
|
{
|
||
|
image.color = new Color(image.color.r, image.color.g, image.color.b, 0);
|
||
|
}
|
||
|
}
|
||
|
internal void ShowImage()
|
||
|
{
|
||
|
if (image != null)
|
||
|
{
|
||
|
image.color = new Color(image.color.r, image.color.g, image.color.b, 1);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|