158 lines
4.1 KiB
C#
158 lines
4.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEngine;
|
|
|
|
public class VitrinaPanel : MonoBehaviour
|
|
{
|
|
private bool initialized = false;
|
|
//запросить коробки, проверить какие требуется, найти пересечение. Если нет, то возврат.
|
|
public event Action OnComplete;
|
|
|
|
[SerializeField] private Transform BoxesRoot;
|
|
[SerializeField] private GameObject BoxViewPrefab;
|
|
|
|
private List<VitrinaBox> generatedBoxes = new();
|
|
private int pointerIndex;
|
|
|
|
[SerializeField] private float timer = 0;
|
|
private float timeToAct = 3;
|
|
VitrinaBox CurrentBox => generatedBoxes[pointerIndex];
|
|
|
|
private void OnEnable()
|
|
{
|
|
initialized = false;
|
|
}
|
|
private void OnDisable()
|
|
{
|
|
initialized = false;
|
|
ClearBoxes();
|
|
}
|
|
|
|
public void Initialize(int[] requiredBoxed)
|
|
{
|
|
if (initialized) return;
|
|
//тут проверка что есть такие коробки
|
|
|
|
int[] readyBoxes = PrizeStandController.GetReadyBoxes();
|
|
|
|
int[] res = FindIntersection(requiredBoxed, readyBoxes);
|
|
if (res.Length == 0)
|
|
{
|
|
OnComplete?.Invoke();
|
|
VitrinaCatcher.Instance.PrizeStandController_OpeningFinished(false, "Нет призов");
|
|
gameObject.SetActive(false);
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
pointerIndex = 0;
|
|
GenerateBoxes(res);
|
|
|
|
CurrentBox.SetEnabled(true);
|
|
initialized = true;
|
|
}
|
|
|
|
|
|
public static int[] FindIntersection(int[] array1, int[] array2)
|
|
{
|
|
if (array1 == null || array2 == null || array1.Length == 0 || array2.Length == 0)
|
|
{
|
|
return Array.Empty<int>();
|
|
}
|
|
|
|
// Используем HashSet для эффективного поиска
|
|
HashSet<int> set1 = new HashSet<int>(array1);
|
|
|
|
// Находим пересечение
|
|
return array2.Where(x => set1.Contains(x)).Distinct().ToArray();
|
|
}
|
|
|
|
|
|
private void GenerateBoxes(int[] indexes)
|
|
{
|
|
if (generatedBoxes == null)
|
|
generatedBoxes = new();
|
|
|
|
foreach (int index in indexes)
|
|
{
|
|
var go = Instantiate(BoxViewPrefab, BoxesRoot);
|
|
|
|
if (go.TryGetComponent<VitrinaBox>(out var Box))
|
|
{
|
|
|
|
generatedBoxes.Add(Box);
|
|
Box.SetNumber(index);
|
|
}
|
|
else
|
|
{
|
|
Destroy(go);
|
|
Debug.Log("Префаб не содержит компонента VitrinaBoxView", gameObject);
|
|
}
|
|
}
|
|
}
|
|
private void ClearBoxes()
|
|
{
|
|
if (generatedBoxes != null)
|
|
{
|
|
foreach (var box in generatedBoxes)
|
|
Destroy(box.gameObject);
|
|
generatedBoxes.Clear();
|
|
}
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (!initialized) return;
|
|
var input = CollectInputs();
|
|
|
|
if (input.direction != 0)
|
|
{
|
|
int count = generatedBoxes == null ? 0 : generatedBoxes.Count;
|
|
//отобразить изменения
|
|
|
|
CurrentBox.SetEnabled(false);
|
|
CurrentBox.shake = false;
|
|
timer = 0;
|
|
|
|
pointerIndex = (pointerIndex + input.direction + count) % count;
|
|
CurrentBox.SetEnabled(true);
|
|
|
|
}
|
|
|
|
if (input.action)
|
|
{
|
|
CurrentBox.shake = true;
|
|
timer = Mathf.Clamp(timer + Time.deltaTime, 0, timeToAct);
|
|
}
|
|
else
|
|
{
|
|
CurrentBox.shake = false;
|
|
timer = 0;
|
|
}
|
|
|
|
|
|
if (timer >= timeToAct)
|
|
{
|
|
_ = PrizeStandController.OpenBoxAsync(CurrentBox.Number);
|
|
timer = 0;
|
|
|
|
OnComplete?.Invoke();
|
|
gameObject.SetActive(false);
|
|
return;
|
|
}
|
|
}
|
|
|
|
(int direction, bool action) CollectInputs()
|
|
{
|
|
int direction = (In.GetButtonDownAnyPlayer(PlayerAction.right) ? 1 : 0) -
|
|
(In.GetButtonDownAnyPlayer(PlayerAction.left) ? 1 : 0);
|
|
bool action = In.GetButtonAnyPlayer(PlayerAction.down);
|
|
return (direction, action);
|
|
}
|
|
|
|
|
|
|
|
}
|