Files
2026-06-04 14:27:16 +03:00

93 lines
2.2 KiB
C#

using UnityEngine;
using UnityEngine.Events;
[RequireComponent(typeof(Collider))]
public class Slot : MonoBehaviour
{
public ItemType requiredItemType;
public bool isOccupied;
[Header("Visuals")]
public Material normalMaterial;
public Material validPreviewMaterial;
public Material invalidPreviewMaterial;
public Material successMaterial;
[Header("Placement")]
public Transform snapPoint;
public UnityEvent onItemPlaced = new UnityEvent();
private Renderer slotRenderer;
private DraggableObject placedItem;
private void Awake()
{
slotRenderer = GetComponent<Renderer>();
if (slotRenderer != null && normalMaterial == null)
{
normalMaterial = slotRenderer.sharedMaterial;
}
}
private void Start()
{
ApplyMaterial(normalMaterial);
}
public bool CanAccept(DraggableObject item)
{
return item != null && !isOccupied && item.itemType == requiredItemType;
}
public void PlaceItem(DraggableObject item)
{
if (!CanAccept(item))
{
ShowPreview(item);
return;
}
isOccupied = true;
placedItem = item;
// SnapPoint задаёт точку фиксации предмета над плоскостью слота.
Vector3 targetPosition = snapPoint != null ? snapPoint.position : transform.position + Vector3.up * 0.35f;
item.LockToSlot(targetPosition);
ApplyMaterial(successMaterial);
onItemPlaced.Invoke();
}
public void ResetSlot()
{
isOccupied = false;
placedItem = null;
ApplyMaterial(normalMaterial);
}
public void ShowPreview(DraggableObject item)
{
if (isOccupied)
{
ApplyMaterial(successMaterial);
return;
}
ApplyMaterial(CanAccept(item) ? validPreviewMaterial : invalidPreviewMaterial);
}
public void ClearPreview()
{
ApplyMaterial(isOccupied ? successMaterial : normalMaterial);
}
private void ApplyMaterial(Material material)
{
if (slotRenderer != null && material != null)
{
slotRenderer.sharedMaterial = material;
}
}
}