add functionality to the c# unity script below, I want it to also be able to when shift is held and an object that isn't in the selection then add it to selection and give it an outline as it sits now it handles removing an outline from one if its already selected/outlined.

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

public class ObjectClickDetector : MonoBehaviour
{
	public Color32 SelectionColor;
	public List<GameObject> SelectionObjects = new List<GameObject>();

	void Update()
	{
		// Check if the left mouse button is pressed down
		if (Input.GetMouseButtonDown(0)) // 0 is for left-click
		{
			ShootRay(Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift));
		}
	}

	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 = Camera.main;

		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))
							{
								DestroyOutlines(currentTransform);
							}
							else
							{
								Debug.Log("Shift held but object not selected: " + currentTransform.name);
							}
						}
						else
						{
							// If no modifier key is held, add the outline
							FindMeshRenderers(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();
			}
		}
		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
		{
			DestroyOutlines(obj.transform);
		}
	}
}