The following code continually causes unity to crash:

using System.Collections.Generic;
using UnityEngine;

public class ObjectPoolLauncher : MonoBehaviour
{
    public GameObject[] objectPrefabs; // Array of game objects to be pooled
    public int minObjectsOnScreen; // Minimum number of objects allowed in the frustum
    public int maxObjectsOnScreen; // Maximum number of objects allowed in the frustum
    public float minSpeed; // Minimum speed of objects in the arc
    public float maxSpeed; // Maximum speed of objects in the arc
    public Camera mainCamera; // Reference to the main camera

    private List<GameObject> objectPool; // Object pool for recycling objects
    private int currentObjectsOnScreen; // Number of objects currently active in the frustum

    private void Start()
    {
        // Create object pool
        objectPool = new List<GameObject>();
        for (int i = 0; i < objectPrefabs.Length; i++)
        {
            GameObject obj = Instantiate(objectPrefabs[i], transform);
            obj.SetActive(false);
            objectPool.Add(obj);
        }
    }

    private void Update()
    {
        currentObjectsOnScreen = CountActiveObjects();

        // Spawn objects if the number of active objects is less than the maximum allowed
        if (currentObjectsOnScreen < maxObjectsOnScreen)
        {
            SpawnObject();
        }
    }

    private void SpawnObject()
    {
        // Generate random speed for the object
        float speed = Random.Range(minSpeed, maxSpeed);

        // Generate random position on the arc within the camera's frustum
        Vector3 spawnPosition = GenerateArcPositionInFrustum();

        // Set the position and speed of the object
        GameObject obj = GetNextInactiveObject();
        obj.transform.position = spawnPosition;

        // Calculate arc velocity
        Vector3 velocity = CalculateArcVelocity(spawnPosition, speed);

        // Set the velocity of the object
        Rigidbody rb = obj.GetComponent<Rigidbody>();
        if (rb != null)
        {
            rb.velocity = velocity;
        }

        obj.SetActive(true);
    }

    private Vector3 GenerateArcPositionInFrustum()
    {
        Vector3 screenPoint;
        bool positionFound = false;

        // Randomly generate positions until a position within the frustum is found
        do
        {
            float randomX = Random.Range(0f, 1f);
            float randomY = Random.Range(0f, 1f);
            screenPoint = new Vector3(randomX, randomY, 0f);

            Vector3 spawnPosition = mainCamera.ViewportToWorldPoint(screenPoint);
            spawnPosition.y = transform.position.y;

            // Check if the generated position is within the frustum
            if (mainCamera.WorldToViewportPoint(spawnPosition).z > 0f)
            {
                positionFound = true;
                return spawnPosition;
            }
        } while (!positionFound);

        return Vector3.zero; // Default position if no valid position is found (shouldn't happen)
    }

    private Vector3 CalculateArcVelocity(Vector3 spawnPosition, float speed)
    {
        Vector3 direction = mainCamera.transform.position - spawnPosition;
        direction.y = 0f; // Ignore vertical difference

        float time = direction.magnitude / speed;
        Vector3 velocity = direction / time;
        velocity.y = -0.5f * Physics.gravity.magnitude * time;

        return velocity;
    }

    private GameObject GetNextInactiveObject()
    {
        foreach (GameObject obj in objectPool)
        {
            if (!obj.activeSelf)
            {
                return obj;
            }
        }

        // If no inactive object is found, instantiate a new one
        GameObject newObj = Instantiate(objectPrefabs[Random.Range(0, objectPrefabs.Length)], transform);
        newObj.SetActive(false);
        objectPool.Add(newObj);

        return newObj;
    }

    private int CountActiveObjects()
    {
        int count = 0;

        // Count the number of active objects
        foreach (GameObject obj in objectPool)
        {
            if (obj.activeSelf)
            {
                count++;
            }
        }

        return count;
    }
}