www videojuegos unity programa pro games español creador c# unity3d game-engine unityscript

c# - programa - unity videojuegos



La destrucción del clon destruye todos los clones (1)

Quiero destruir una instancia de un objeto cuando se encuentra dentro de un área circular particular. El código es el siguiente:

Collider2D[] overlap = Physics2D.OverlapCircleAll( ball.transform.position, (ball.renderer.bounds.size.x)/2); if (overlap.Length>=1) { foreach (Collider2D coll in overlap) { Debug.Log (coll.GetInstanceID()); if (coll.name.Contains("alien")) { //problem here: Destroy (coll.gameObject); } } }

The Destroy(coll.gameObject) destruye todos los clones de forma permanente y los nuevos no se MissingReferenceException: The object of type ''GameObject'' has been destroyed but you are still trying to access it. Your script should either check if it is null or you should not destroy the object. instancias y obtengo el error MissingReferenceException: The object of type ''GameObject'' has been destroyed but you are still trying to access it. Your script should either check if it is null or you should not destroy the object. MissingReferenceException: The object of type ''GameObject'' has been destroyed but you are still trying to access it. Your script should either check if it is null or you should not destroy the object.

¿Hay alguna manera de destruir eso y ese clon en específico? He probado diferentes nombres y uso Destroy(GameObject.Find(coll.name)) pero eso destruye todos los clones también y evita que otros nuevos se reproduzcan.

¿Alguien ayuda?

ACTUALIZAR:

Hacer una instancia de lo siguiente:

private bool bCanCreateParachuter = true; // bool to stop the spawning GameObject go; // Use this for initialization void Start () { //handling screen orientation Screen.orientation = ScreenOrientation.LandscapeLeft; /// go = (GameObject)Instantiate(Resources.Load("alienPink")); StartCoroutine("CreateParachuter"); } IEnumerator CreateParachuter() { while(bCanCreateParachuter) { Instantiate(go, new Vector3(Random.Range(-10,10), Random.Range(-5,5), 0), Quaternion.identity); // Instantiate(go, new Vector3(Random.Range(-10,10), Random.Range(-10,10), 0), Quaternion.identity); go.name = "alienPink"+nextNameNumber; nextNameNumber++; yield return new WaitForSeconds(Random.Range(0f,1f)); yield return null; } yield return null; }

Actualización crucial:

El código funciona si if (grabbedObject !=null) comentario de if (grabbedObject !=null) en

// if (grabbedObject != null) { //works if uncomment above for some reason Collider2D[] overlap = Physics2D.OverlapCircleAll (ball.transform.position, (ball.renderer.bounds.size.x)/2); if (overlap.Length>=1){ foreach (Collider2D coll in overlap){ Debug.Log (coll.GetInstanceID()); if (coll.name.Contains("alien")){ Destroy (coll.gameObject); } } }else { // Debug.Log (grabbedObject.renderer.bounds.size.x); }

Este es el fondo de grabbedObject:

Rigidbody2D grabbedObject = null; . . . RaycastHit2D hit = Physics2D.Raycast(mousePos2D , dir); //if (hit!=null && hit.collider!=null){ // check collisions with aliens // OnCollisionEnter2D(grabbedObject.collisionDetectionMode); if ( hit.collider!=null){ // we clicked on something lol... something that has a collider (box2d collider in this case) if (hit.collider.rigidbody2D!=null){ //hit.collider.rigidbody2D.gravityScale = 1; grabbedObject = hit.collider.rigidbody2D; // circleCollider = hit.collider.collider2D. ; springJoint = grabbedObject.gameObject.AddComponent<SpringJoint2D>(); // set the anchor to the spot on the object that we clicked Vector3 localHitPoint = grabbedObject.transform.InverseTransformPoint(hit.point); springJoint.anchor = localHitPoint; // dragLine.enabled = true; } }

Básicamente, el objeto agarrado es cualquier cosa que haga clic y arrastre en la pantalla (cualquier GameObject), ¿qué me estoy perdiendo por aquí, chicos?


El problema de reaparición es que no está guardando una referencia al elemento de recursos, por lo que cuando destruye el primer elemento que crea su "plantilla" para crear una instancia se destruye

Esto resolvería esto

GameObject template; void Start() { //handling screen orientation Screen.orientation = ScreenOrientation.LandscapeLeft; template = (GameObject)Resources.Load("alienPink"); StartCoroutine("CreateParachuter"); } IEnumerator CreateParachuter() { while(bCanCreateParachuter) { GameObject go = Instantiate(template, new Vector3(Random.Range(-10,10), Random.Range(-5,5), 0), Quaternion.identity); go.name = "alienPink"+nextNameNumber; nextNameNumber++; yield return new WaitForSeconds(Random.Range(0f,1f)); yield return null; } yield return null; }

En términos de destruir todos los clones, ¿está el registro de depuración que indica que está destruyendo varios elementos? Si es así, la colisión puede afectar a todos los clones y, por lo tanto, destruirlos a todos.