Instantiate object during collision only once

I have these “detectors” objects on my character that check collisions and then move the collided object to “holders” to become “attachments” of the character. Once this happen I need more to spawn more detectors and holders for the character to grow further. However as you can see from the script, as the the “detector” and the “attachCheck” begins collision they never cease to as the object is moved on a position of constant collision.


Instead I would only like to instanciate a new “attacher” (detectors+holders) once, when the collision first happens.


 private void DL_Attach()
    {
        RaycastHit2D attachCheck = Physics2D.Raycast(DL_Detector.position, Vector2.one * transform.localScale, -0);

        if (attachCheck.collider != null && attachCheck.collider.tag == "Molecule")
        {
            attachCheck.collider.gameObject.transform.parent = DL_Holder;
            attachCheck.collider.gameObject.transform.position = DL_Holder.position;
            AttachersInstantiation();

            if (Input.GetKey(KeyCode.X))
            {
                attachCheck.collider.gameObject.transform.parent = null;
            }
        }
    }

    private void AttachersInstantiation()
    {
        Transform attacher = Instantiate(this.attachersPrefab);
        attacher.position = Attachers[Attachers.Count - 1].position;
        Attachers.Add(attacher);
    }

I solved by hardcoding. I created two kinds of “molecules”. An external which is empty, and an internal with detectors and holders. When the external collides gets destroyed and I instanciate an internal one, which cannot collide (different tag). The lesson here is: Divide et impera. But in hindsight I am having more problems, so I will probably move the detectors on the external one. Here’s some code for reference:

private void DL_Attach()
    {
        RaycastHit2D attachCheck = Physics2D.Raycast(DL_Detector.position, Vector2.one * transform.localScale, -0);

        if (attachCheck.collider != null && attachCheck.collider.tag == "Ext_Molecule")
        {
            Destroy(attachCheck.collider.gameObject);
            Transform Int_Molecule_Inst = Instantiate(this.Int_MoleculePrefab);
            Int_Molecule_Inst.transform.parent = DL_Holder;
            Int_Molecule_Inst.transform.position = DL_Holder.position;

            if (Input.GetKey(KeyCode.X))
            {
                attachCheck.collider.gameObject.transform.parent = null;
            }
        }
    }