Los sistemas grandes deberían comunicarse mediante contratos claros.

Ejemplo

public interface ISaveable
{
    void Save();
    void Load();
}

Otro ejemplo:

public interface IInteractable
{
    void Interact();
}

Uso con Raycast

if (hit.collider.TryGetComponent<IInteractable>(
    out IInteractable interactable))
{
    interactable.Interact();
}

Ventaja

El sistema de interacción no necesita conocer clases específicas.

Resumen rápido

sistema
→ interface
→ implementación concreta