Collider interaction stops working

The idea is simple, mouse over an object (in this case a circle collider atop a softbody slime), hold down, drag and release the left mouse button to throw.

After working as intended for a while, it seems that Collider-related messages in MonoBehaviour (OnMouseDown, OnMouseUp, OnMouseDrag, OnMouseEnter, OnMouseExit) become unresponsive.

Update still gets called and works as intended, just not collider related ones. It is completely random when this occurs and we can’t reproduce it reliably.
If we reinstantiate the object, sometimes the functionality comes back, not reliably though.

Everything else in the scene is on a layer further back than the targeted collider, we have ran with no background and it is away from the Canvas.
The circle colliders used as “bones” in the objects softbody have been put on the raycastignore layer.

The script is as follows:

using System;
using UnityEngine;

public class SlimeScript : MonoBehaviour
    public Material materialActive;
    public Material materialTimedOut;
    public GameObject pointer;
    public float maxForce;
    public float forceMultiplier;
    public float timeOutPeriod;
    public float minVelocity;
    public GameObject currentZone;

    private Rigidbody2D rb;
    private MeshRenderer mr;
    private float motionlessStartTime = -1.0f;
    public bool slimeIsFlung = false;
    public bool slimeStoppedMoving = false;
    public bool slimeIsTimedOut = false;
    public bool slimeIsReady;

    // Start is called before the first frame update
    void Start()
        rb = GetComponent<Rigidbody2D>();

        // change blob material
        mr = GetComponent<MeshRenderer>();
        mr.material = materialActive;


    // Update is called once per frame
    void Update()
        if (Input.GetKeyDown(KeyCode.L)) // TODO remove, for testing
            Debug.Log("L pressed in SlimeScript");

        // blobStoppedMoving if velocity too low
        slimeStoppedMoving = Math.Abs(rb.velocity.x) < minVelocity && Math.Abs(rb.velocity.y) < minVelocity;

        // start timeout timer
        if (slimeStoppedMoving && !slimeIsTimedOut)
            // start timer if not started yet
            if (motionlessStartTime < 0.0f)
                motionlessStartTime = Time.time;

            // timeout after 5 seconds
            slimeIsTimedOut = motionlessStartTime + timeOutPeriod < Time.time;

        // stop ball moving
        if (slimeIsTimedOut)
            // change blob material
            // mr.material = materialTimedOut;

            // freeze blob
            rb.constraints = RigidbodyConstraints2D.FreezeAll;

            slimeIsFlung = false;

        slimeIsReady = !slimeIsFlung && slimeIsTimedOut;

    public void OnMouseUp()
        Debug.Log("MouseUp in SlimeScript");

        // hide indicator

        if (slimeIsReady)
            // prevent reflinging
            slimeIsFlung = true;

            // change blob material
            mr.material = materialActive;

            // fling blob
            rb.constraints = RigidbodyConstraints2D.None;
            rb.velocity = GetLimitedForceVector() * forceMultiplier;

            // reset time out
            motionlessStartTime = -1.0f;
            slimeIsTimedOut = false;

	private void OnMouseDown()
        Debug.Log("MouseDown in SlimeScript");

	private void OnMouseDrag()
        // show indicator

        // move and rotate indicator
        var indicatorDirection = GetLimitedForceVector();
        var indicatorRotation = Vector2.SignedAngle(Vector2.left, indicatorDirection);
        pointer.transform.position = transform.position + indicatorDirection;
        pointer.transform.rotation = Quaternion.Euler(0.0f, 0.0f, 90.0f + indicatorRotation);

    // returns vector in world coords with direction of force and magnitude limited by maxForce
    private Vector3 GetLimitedForceVector()
        var mouseWorldPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        mouseWorldPosition.z = transform.position.z;
        var mouseDirection = mouseWorldPosition - transform.position;
        var limitedForceVector = Vector3.ClampMagnitude(mouseDirection, maxForce);

        return limitedForceVector;

	void OnTriggerEnter2D(Collider2D collider)
		if (!"Part")) return;

		currentZone = collider.gameObject;