professionally modify the c# script for unity below, the problem is it throws errors about missing gameobjects in the list or something so make sure that never happens

using UnityEngine;
using EPOOutline;
using System.Collections.Generic;
using LibreMetaverse.PrimMesher;

public class ObjectClickDetector : MonoBehaviour
{
	public Color32 SelectionColor;
	public List<GameObject> SelectionObjects = new List<GameObject>();
	public Camera Cam;
	public UltimateRadialMenu URM;
	public RectTransform targetRectTransform;
	public MeshInspector Inspector;
	public DestroyDisabledMeshRenderers DDMR;
	void Update()
	{
		// Check if the left mouse button is pressed down
		if (Input.GetMouseButtonDown(1)) // 0 is for left-click
		{
			FollowMouse();
			URM.Enable();
			ShootRay(Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift));
		}
	}

	public void DeleteSelection()
	{
		foreach (GameObject obj in SelectionObjects)
		{
			DDMR.RemoveGameobjectFromList(obj);
			Destroy(obj);
		}
	}

	public void InspectSelection()
	{
		Inspector.Meshes = SelectionObjects;
		Inspector.InspectMeshes();
	}

	void FollowMouse()
	{
		// Check if the RectTransform reference is set
		if (targetRectTransform == null)
		{
			Debug.LogWarning("Target RectTransform is not assigned!");
			return;
		}

		// Get the mouse position in screen coordinates
		Vector2 mousePos = Input.mousePosition;

		// Convert the mouse position to the local coordinate space of the canvas
		Vector2 anchoredPosition;
		RectTransformUtility.ScreenPointToLocalPointInRectangle(
			targetRectTransform.parent.GetComponent<RectTransform>(),
			mousePos,
			null, // Use null for the camera to use the UI camera
			out anchoredPosition
		);

		// Set the anchored position of the RectTransform to follow the mouse
		targetRectTransform.anchoredPosition = anchoredPosition;
	}

	void FindMeshRenderers(Transform parentTransform)
	{
		// Get all MeshRenderer components in the child hierarchy of the parentTransform
		MeshRenderer[] meshRenderers = parentTransform.GetComponentsInChildren<MeshRenderer>(true);

		// Check if the GameObject already has an Outlinable component
		if (parentTransform.gameObject.GetComponent<Outlinable>() == null)
		{
			var outlinable = parentTransform.gameObject.AddComponent<Outlinable>();
			outlinable.RenderStyle = RenderStyle.Single;
			outlinable.OutlineParameters.Color = SelectionColor;

			// Add each MeshRenderer to the Outlinable
			foreach (MeshRenderer meshRenderer in meshRenderers)
			{
				outlinable.AddRenderer(meshRenderer);
			}

			// Add the GameObject to the selection list
			SelectionObjects.Add(parentTransform.gameObject);
			Debug.Log("Added to selection: " + parentTransform.gameObject.name);
		}
	}

	void DestroyOutlines(Transform parentTransform)
	{
		Outlinable outlinable = parentTransform.GetComponent<Outlinable>();
		if (outlinable != null)
		{
			Destroy(outlinable);
			SelectionObjects.Remove(parentTransform.gameObject);
			Debug.Log("Removed from selection: " + parentTransform.gameObject.name);
		}
	}

	void ShootRay(bool ShiftHeld)
	{
		// Get the main camera
		Camera mainCamera = Cam;

		if (mainCamera != null)
		{
			// Create a ray from the camera to the mouse position
			Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);
			RaycastHit hit;

			// Perform the raycast
			if (Physics.Raycast(ray, out hit))
			{
				// Get the parent transform of the hit collider
				Transform currentTransform = hit.collider.transform;

				// Traverse the parent hierarchy
				while (currentTransform != null)
				{
					// Check if the parent name starts with "sim:"
					if (currentTransform.parent != null && currentTransform.parent.name.ToLower().StartsWith("sim:"))
					{
						Debug.Log("Found parent: " + currentTransform.name);

						if (ShiftHeld)
						{
							// If Shift is held, check if it's already in the selection
							if (SelectionObjects.Contains(currentTransform.gameObject))
							{
								// Deselecting the object
								DestroyOutlines(currentTransform);
							}
							else
							{
								// Adding the object to the selection
								FindMeshRenderers(currentTransform);
							}
						}
						else
						{
							// If Shift is not held, select or deselect the object directly
							if (!SelectionObjects.Contains(currentTransform.gameObject))
							{
								// Clear previous selections
								RemoveAllOutlines();
								// Select the new object
								FindMeshRenderers(currentTransform);
							}
							else
							{
								// If it's already selected and no Shift is held, deselect it
								DestroyOutlines(currentTransform);
							}
						}
						return; // Exit the method after handling the click
					}
					// Move to the parent transform
					currentTransform = currentTransform.parent;
				}

				Debug.Log("No parent found starting with 'sim:'");
			}
			else
			{
				// If no collider was hit, remove all outlines from selected objects
				Debug.Log("No collider was hit.");
				RemoveAllOutlines();
				URM.Disable();
			}
		}
		else
		{
			Debug.LogError("Main Camera not found.");
		}
	}

	void RemoveAllOutlines()
	{
		// Remove outlines from all selected objects
		foreach (GameObject obj in new List<GameObject>(SelectionObjects)) // Create a copy to avoid modifying while iterating
		{
			if(obj != null)
			{
				DestroyOutlines(obj.transform);
			}
		}
	}
}