Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: Joawin en Noviembre 13, 2016, 01:06:20 AM

Título: Forma simple para que si un gameobject está activo los demás esten inactivos (?)
Publicado por: Joawin en Noviembre 13, 2016, 01:06:20 AM
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
Título: Forma simple para que si un gameobject está activo los demás esten inactivos (?)
Publicado por: iRobb en Noviembre 13, 2016, 12:05:40 PM
Pues de entrada "funciones" y el maravilloso operador ! (not)
Título: Forma simple para que si un gameobject está activo los demás esten inactivos (?)
Publicado por: esr en Noviembre 13, 2016, 11:06:45 PM
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.
Título: Forma simple para que si un gameobject está activo los demás esten inactivos (?)
Publicado por: kingtrase en Noviembre 14, 2016, 04:08:26 PM
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.
 
ExportTuto.unitypackage
Título: Forma simple para que si un gameobject está activo los demás esten inactivos (?)
Publicado por: lightbug en Noviembre 14, 2016, 10:49:27 PM
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;
   }
}

 
 
 
 
 
 
Título: Forma simple para que si un gameobject está activo los demás esten inactivos (?)
Publicado por: Joawin en Noviembre 15, 2016, 09:35:43 PM
Muchas gracias a todos :DD