Unity долго выполняет скрипт

Есть скрипт с поиском в ширину по графу. При вычислении поиска Unity долго выполняет скрипт. Может както можно улучшить скрипт?

using System.Collections;
using System.Collections.Generic;
using System.Linq.Expressions;
using UnityEditor.Search;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.VFX;
using Random = UnityEngine.Random;

public class ChipsController : MonoBehaviour
{
    private static Color selectedColor = new Color(0.5f, 0.5f, 0.5f, 1.0f);
    private static ChipsController previousSelected = null;
    private SpriteRenderer render;
    private bool isSelected = false;
    Queue<int> Queue = new Queue<int>();
    List<int> UsedValues = new List<int>();
    
    int startPosition;
    int endPosition;
    float positionChipX;
    float positionChipY;
    float positionPointX;
    float positionPointY;
    private Vector2[] adjacentDirections = new Vector2[] { Vector2.up, Vector2.down, Vector2.left, Vector2.right };
     
    void Awake()
    {
        render = GetComponent<SpriteRenderer>();
    }

    private void Select()
    {  
            isSelected = true;
            render.color = selectedColor;
            previousSelected = gameObject.GetComponent<ChipsController>();
            var positionChip = render.transform.position;
            positionChipX = positionChip.x;
            positionChipY = positionChip.y;
        
        

    }

    private void Deselect()
    {
        isSelected = false;
        render.color = Color.white;
        previousSelected = null;
    }
    void OnMouseDown()
    {
        
            if (render.sprite == null)
            {
                return;
            }


            if (isSelected)
            {
                Deselect();
            }
            else
            {
                if (previousSelected == null)
                {
                    Select();
                }
                else
                {
                    previousSelected.Deselect();
                }
            }


            int p = GameManagerController.numberPoints;

            for (int i = 0; i < p; i++)
            {
                if (positionChipX == GameManagerController.coordinatesPoints[i, 0] && positionChipY == GameManagerController.coordinatesPoints[i, 1])
                {
                    startPosition = i + 1;

                }
            }
            for (int i = 0; i < p; i++)
            {
                if (positionPointX == GameManagerController.coordinatesPoints[i, 0] && positionPointY == GameManagerController.coordinatesPoints[i, 1])
                {
                    endPosition = i + 1;


                }
            }
        
    }
    void Update()
    {
        if (Input.GetMouseButtonDown(1))
        {
           
            RaycastHit hit;
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            int p = GameManagerController.numberPoints;
            if (Physics.Raycast(ray, out hit))
            {
                if (hit.transform.tag == "Point")
                {
                    var positionPoint = hit.transform.position;
                    positionPointX = positionPoint.x;
                    positionPointY = positionPoint.y;

                }
            }
            for (int i = 0; i < p; i++)
            {
                if (positionChipX == GameManagerController.coordinatesPoints[i, 0] && positionChipY == GameManagerController.coordinatesPoints[i, 1])
                {
                    startPosition = i + 1;

                }
            }
            for (int i = 0; i < p; i++)
            {
                if (positionPointX == GameManagerController.coordinatesPoints[i, 0] && positionPointY == GameManagerController.coordinatesPoints[i, 1])
                {
                    endPosition = i + 1;


                }
            }
        }
        if (Input.GetMouseButtonDown(2))
        {
            Poisk();
        }


    }
    private void Poisk()
    {
        Queue.Enqueue(startPosition);

        while (Queue.Count != 0)
        {
            int node = Queue.Dequeue();
            List<int> vertites = GameManagerController.Graph[node+1];

            if (node == endPosition)
            {
                return;
            }

            foreach (int vertite in vertites)
            {
                if (!UsedValues.Contains(vertite))
                {
                    if (vertite == endPosition)
                    {
                        if (Queue.Count > 0)
                        {
                            Queue.Dequeue();
                        }
                        Queue.Enqueue(node+1);
                        Queue.Enqueue(endPosition);
                        return;
                    }
                    Queue.Enqueue(vertite);

                }

            }
            UsedValues.Add(node+1);
        }
        foreach (int value in Queue)
        {
            Debug.Log(value);
        }
    }
}

Ответы (0 шт):