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);
}
Answer by MichaelABC · Oct 18, 2021 at 03:33 PM
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;
}
}
}
Your answer
Follow this Question
Related Questions
Is there any good sample code for shooting a projectile and collision detection? 0 Answers
I have two different objects I would like to check when A and B gameObjects are collided ? 1 Answer
Physics2D.Raycast not working with LayerMask 0 Answers
cant pause game when character collides,cant pause when my character dies 1 Answer
How to spawn obstacles just after another one gets destroyed. 0 Answers