Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Forma simple para que si un gameobject está activo los demás esten inactivos (?)

Iniciado por Joawin, Noviembre 13, 2016, 01:06:20 AM

Tema anterior - Siguiente tema
Buenas, quiero saber si habría alguna forma más simple de hacer que si un gameobject está activo los demás no lo esten, ya que mi código me parece muy basura querría optimizarlo 
 


public GameObject CuadradoG;
public GameObject cuadrado;
public GameObject TrianguloG;
public GameObject triangulo;
public GameObject CirculoG;
public GameObject circulo;
public GameObject PoligonoG;
public GameObject poligono;
int aleatorio = 0;
//-----------------------------------------------------------------
void OnMouseDown () {
   if (gameObject.tag == ("bueno")){
      aleatorio = Random.Range (2, 6);
      Debug.Log (aleatorio);
   
   }
   if (aleatorio == 2){
      
      CuadradoG.SetActive (true);
      cuadrado.SetActive (true);
      Debug.Log ("activo");
      if (CuadradoG.active = true){
         TrianguloG.SetActive (false);
         triangulo.SetActive(false);
         CirculoG.SetActive(false);
         circulo.SetActive(false);
         PoligonoG.SetActive(false);
         poligono.SetActive(false);
      }
   
   }
   if (aleatorio == 3){
      
      TrianguloG.SetActive (true);
      triangulo.SetActive (true);
      Debug.Log ("activo");
      if (TrianguloG.active = true){
         CuadradoG.SetActive (false);
         cuadrado.SetActive(false);
         CirculoG.SetActive(false);
         circulo.SetActive(false);
         PoligonoG.SetActive(false);
         poligono.SetActive(false);
      }
 
   }   
   if (aleatorio == 4){
      
      CirculoG.SetActive (true);
      circulo.SetActive (true);
      Debug.Log ("activo");
      if (CirculoG.active = true){
         TrianguloG.SetActive (false);
         triangulo.SetActive(false);
         CuadradoG.SetActive(false);
         cuadrado.SetActive(false);
         PoligonoG.SetActive(false);
         poligono.SetActive(false);
      }
      
   }   
   if (aleatorio == 5){
      
      PoligonoG.SetActive (true);
      poligono.SetActive (true);
      Debug.Log ("activo");
      if (PoligonoG.active = true){
         TrianguloG.SetActive (false);
         triangulo.SetActive(false);
         CirculoG.SetActive(false);
         circulo.SetActive(false);
         CuadradoG.SetActive(false);
         cuadrado.SetActive(false);
      }
   
}
 

}

 
(Les asigno un número aleatorio para que los gameobjects aparezcan de forma aleatoria)
 
Gracias :D


Como dice iRobb puedes utilizar funciones, después yo utilizara un switch en vez de utilizar ifs, y por ultimo intentaría utilizar la jerarquía de la escena para recorrerla en vez de poner cada uno de los GameObjects, pero eso depende de como tengas montada la escena.

Te paso el codigo y un package por si no lo sabes aplicar.
 
Yo puse 6 cubos en la escena, pero los hice 'hijos' de un GameObject vacio. lo que hace es buscar en los hijos de GObject y si no es el seleccionado los deshabilita, lo hice asi para que no deshabilitara la cam y la light.
 

using UnityEngine;
using System.Collections.Generic;
public class testCode : MonoBehaviour {
   public Camera cam;
// Update is called once per frame
   void Update () {
         if(Input.GetMouseButton())LeftMouseClick();
   }
   private GameObject FindHitObject() {
         Ray ray = cam.ScreenPointToRay (Input.mousePosition);
         RaycastHit hit;
         if(Physics.Raycast(ray, out hit)) return hit.collider.gameObject;
         return null;
   }

   private void LeftMouseClick() {
      GameObject hitObject = FindHitObject();
      if(hitObject) {
               ChangeStateOfObjects(hitObject);
      }
   }
   private void ChangeStateOfObjects(GameObject excluded)
   {
         
         List<Transform> lst = new List<Transform>( this.GetComponentsInChildren<Transform>());
         foreach (var obj in lst) {
               if(obj.name != excluded.name && this.name != obj.name){
                     obj.gameObject.SetActive(!obj.gameObject.activeSelf);}
         }
   }
}

 
Un saludo y espero que te sirva.
 
//www.unityspain.com/applications/core/interface/file/attachment.php?id=9956" data-fileid="9956" rel="">ExportTuto.unitypackage

····>Desarrollando un videojuegos online-arcade para Android.


····>Programador en:C,C#,VB.net,PHP,HTML5,SQL,JS,Ruby.


····>Trabajando en: Desarrollo de paginas web y bushistudios.


                    ๑۩۞۩๑_(▀▄)KINGTRASE()_๑۩۞۩๑ 



Hola, con un switch y reacomodando las acciones que haces (activar en este caso)
 

       public GameObject CuadradoG;
public GameObject cuadrado;
public GameObject TrianguloG;
public GameObject triangulo;
public GameObject CirculoG;
public GameObject circulo;
public GameObject PoligonoG;
public GameObject poligono;
int aleatorio = 0;
//-----------------------------------------------------------------
void OnMouseDown () {
   if (gameObject.tag == ("bueno")){
      aleatorio = Random.Range (2, 6);
      Debug.Log (aleatorio);
   
   }
   //Como vas a activar uno solo, arrancas de entrada desactivando todo y luego a partir del valor aleatorio activas al ganador
   CuadradoG.SetActive (false);
   cuadrado.SetActive (false);
   TrianguloG.SetActive (false);
   triangulo.SetActive(false);
   CirculoG.SetActive(false);
   circulo.SetActive(false);
   PoligonoG.SetActive(false);
   poligono.SetActive(false);
 
   switch( aleatorio )
   {
   case 2:         
                CuadradoG.SetActive (true);
                cuadrado.SetActive (true);
   break;
   case 3:
                TrianguloG.SetActive (true);
                triangulo.SetActive(true);
   break;
   case 4:
                CirculoG.SetActive(true);
                circulo.SetActive(true);
   break;
   case 5:
                PoligonoG.SetActive(true);
                poligono.SetActive(true);
   break;
   }
}

 
 
 
 
 
 


Etiquetas: