Untitled

 avatar
unknown
plain_text
a year ago
2.5 kB
17
Indexable
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CustomerManager : MonoBehaviour
{
    [SerializeField] private Transform entryPos;
    [SerializeField] private Transform exitPos;
    [SerializeField] private Transform[] seatPoses;
    [SerializeField] private CustomerAI[] customerAIs;
    [SerializeField] private Transform[] queuePoints;

    public static CustomerManager Instance { get; private set; }
    private Queue<CustomerAI> waitingCustomerQueue = new();
    private CustomerAI currentHandledCustomer;
    private List<Transform> availableSeatPoses = new();

    private void Awake()
    {
        Instance = this;
    }

    IEnumerator Start()
    {
        foreach (var customer in customerAIs)
        {
            customer.AssignData(entryPos, null, exitPos);
            customer.gameObject.SetActive(true);
            yield return null;
        }
    }

    public void RegisterCustomerToQueue(CustomerAI customer)
    {
        if (waitingCustomerQueue.Count < queuePoints.Length)
        {
            waitingCustomerQueue.Enqueue(customer);
            UpdateCustomerInQueue();
        }
    }

    private void UpdateCustomerInQueue()
    {
        int index = 0;
        foreach (var waitingCustomer in waitingCustomerQueue)
        {
            waitingCustomer.GoToQueue(queuePoints[index]);
            index++;
        }
    }

    [ContextMenu("ACC")]
    private void AcceptQueue()
    {
        if (waitingCustomerQueue.Count == 0) return;
        foreach (var seat in seatPoses)
        {
            if (seat.gameObject.activeInHierarchy)
            {
                if (!availableSeatPoses.Contains(seat))
                {
                    availableSeatPoses.Add(seat);
                }
            }
        }
        if (availableSeatPoses.Count == 0) return;

        currentHandledCustomer = waitingCustomerQueue.Dequeue();
        currentHandledCustomer.currentQueuePoint.gameObject.SetActive(false);
        currentHandledCustomer.GoToSeat(availableSeatPoses[0]);
        availableSeatPoses[0].gameObject.SetActive(false);
        availableSeatPoses.RemoveAt(0);

        UpdateCustomerInQueue();
    }

    public void TriggerDoneUsingSeat(Transform seatPoint)
    {
        seatPoint.gameObject.SetActive(true);
        if (!availableSeatPoses.Contains(seatPoint))
        {
            availableSeatPoses.Add(seatPoint);
        }
    }
}
Editor is loading...
Leave a Comment