Noticias

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

Problemas con Array Boleano

Iniciado por Lord Bruno, Diciembre 09, 2015, 10:41:59 PM

Tema anterior - Siguiente tema
Diciembre 09, 2015, 10:41:59 PM Ultima modificación: Enero 01, 1970, 01:00:00 AM por Lord Bruno
He escrito este Script, para poder crear objetos en ciertas zonas de la scene; el problema que me faltaba resolver era que me permitia construir un objeto sobre otro objeto ya existente, por lo que decide mediante un array de boleanos definir si se crea la instancia para su construccion, el problema es que los valores del array siempre permanecen en "true" a pesar de que le indique a los elementos del array cambiar a false. 
public class BuildMode : MonoBehaviour {

    public GameObject BuildWin;
    bool[] TrueBuilding = new bool [20] { true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, };
    public Image selectImage;
    public Text descriptionText;


    public void Start()
    {

        //TrueBuilding = new bool[20] { true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, };
        selectImage = GameObject.Find("SelectImage").GetComponent<Image>();
        descriptionText = GameObject.Find("DescripText").GetComponent<Text>();

    }

    public void OnClickMain() //Va para el boton grande
    {
        if (BuildWin.activeInHierarchy == false)
        {
            BuildWin.SetActive(true);
        }
        else {
            BuildWin.SetActive(false);
        }
    }

    public void EnteringArchery()
    {
        selectImage.sprite = Resources.Load<Sprite>("Sprite/Fortress/Archery");
        descriptionText.text = "Una sala para entrenar arqueros. Cuesta 50 oros, 10 de madera.";
        Debug.Log("Has pasado por archery");
    }

    public void EnteringBarrack()
    {
        selectImage.sprite = Resources.Load<Sprite>("Sprite/Fortress/Barrack");
        descriptionText.text = "Una sala para entrenar soldados. Cuesta 50 oros, 10 de metal.";
    }

    public void EnteringForge()
    {
        selectImage.sprite = Resources.Load<Sprite>("Sprite/Fortress/Forge");
        descriptionText.text = "Una sala para crear espadas, lanzas, y armaduras. Cuesta 75 oros, 10 de madera y 25 de metal.";
    }

    public void EnteringInfirmary()
    {
        selectImage.sprite = Resources.Load<Sprite>("Sprite/Fortress/Infirmary");
        descriptionText.text = "Una sala para curar a los heridos. Cuesta 120 oros.";
    }

    public void EnteringLibrary()
    {
        selectImage.sprite = Resources.Load<Sprite>("Sprite/Fortress/Library");
        descriptionText.text = "Una sala para mejorar y descubrir cosas. Cuesta 100 oros, 20 de madera y 10 de metal.";
    }

    public void ExitingAll()
    {
        selectImage.sprite = Resources.Load<Sprite>("Sprite/Fortress/emptyRoom");
        descriptionText.text = "Selecciona un Room para construir";
        Debug.Log("Has abandonado la arqueria");
    }

    //BuildMode//

    public Transform BuildPlacePrefab; //Boton de construccion.
    public Transform ArcheryPrefab; //Prefab ArcheryRoom Correspondiente

    float[] deltax = { -9f, -4.5f, 0f, 4.5f, 9f };
    float[] deltay = { 1.5f, 4.5f, 7.5f, 10.5f };

    public void selectArcheryForBuild()
    {
        //Debug.Log("Has seleccionado la Arqueria");

        int pat = -1;
        foreach (float posiX in deltax)
        {
            //Debug.Log(posiX);

            foreach (float posiY in deltay)
            {
                //Debug.Log(posiY);
                //Debug.Log("x = " + posiX + " ; y = " + posiY);
                pat++;
                //Debug.Log(pat + "/" + TrueBuilding[pat]);
                if (TrueBuilding[pat] == true)
                {
                    Instantiate(BuildPlacePrefab, new Vector3(posiX, posiY, -0.9f), Quaternion.identity);
                }
                else { Debug.Log("La instancia" + pat + "es" + TrueBuilding[pat]); }
            }
        }//Fin del foreach instantiate
            BuildWin.SetActive(false);
    }

    //DebugMode - Creating Room//
    float infoX;
    float infoY;
    public void CreateRoom()
    {
        infoX = gameObject.transform.position.x;
        infoY = gameObject.transform.position.y;
        if (infoX == deltax[0])
        {
            if (infoY == deltay[0]) { TrueBuilding[0] = false; Debug.Log("La 0instancia se ha anulado" + TrueBuilding[0]); }
            else if (infoY == deltay[1]) { TrueBuilding[1] = false; Debug.Log("La 1instancia se ha anulado" + TrueBuilding[1]); }
            else if (infoY == deltay[2]) { TrueBuilding[2] = false; Debug.Log("La 2instancia se ha anulado" + TrueBuilding[2]); }
            else if (infoY == deltay[3]) { TrueBuilding[3] = false; Debug.Log("La 3instancia se ha anulado" + TrueBuilding[3]); }
        }
        else if (infoX == deltax[1])
        {
            if (infoY == deltay[0]) { TrueBuilding[4] = false; Debug.Log("La4 instancia se ha anulado" + TrueBuilding[4]); }
            else if (infoY == deltay[1]) { TrueBuilding[5] = false; Debug.Log("La 5instancia se ha anulado" + TrueBuilding[5]); }
            else if (infoY == deltay[2]) { TrueBuilding[6] = false; Debug.Log("La 6instancia se ha anulado" + TrueBuilding[6]); }
            else if (infoY == deltay[3]) { TrueBuilding[7] = false; Debug.Log("La7 instancia se ha anulado" + TrueBuilding[7]); }
        }
        else if (infoX == deltax[2])
        {
            if (infoY == deltay[0]) { TrueBuilding[8] = false; Debug.Log("La 8instancia se ha anulado" + TrueBuilding[8]); }
            else if (infoY == deltay[1]) { TrueBuilding[9] = false; Debug.Log("La 9instancia se ha anulado" + TrueBuilding[9]); }
            else if (infoY == deltay[2]) { TrueBuilding[10] = false; Debug.Log("La10 instancia se ha anulado" + TrueBuilding[10]); }
            else if (infoY == deltay[3]) { TrueBuilding[11] = false; Debug.Log("La11 instancia se ha anulado" + TrueBuilding[11]); }
        }
        else if (infoX == deltax[3])
        {
            if (infoY == deltay[0]) { TrueBuilding[12] = false; Debug.Log("La12 instancia se ha anulado" + TrueBuilding[12]); }
            else if (infoY == deltay[1]) { TrueBuilding[13] = false; Debug.Log("La 13instancia se ha anulado" + TrueBuilding[13]); }
            else if (infoY == deltay[2]) { TrueBuilding[14] = false; Debug.Log("La14 instancia se ha anulado" + TrueBuilding[14]); }
            else if (infoY == deltay[3]) { TrueBuilding[15] = false; Debug.Log("La 15instancia se ha anulado" + TrueBuilding[15]); }
        }
        else if (infoX == deltax[4])
        {
            if (infoY == deltay[0]) { TrueBuilding[16] = false; Debug.Log("La 16instancia se ha anulado" + TrueBuilding[16]); }
            else if (infoY == deltay[1]) { TrueBuilding[17] = false; Debug.Log("La 17instancia se ha anulado" + TrueBuilding[17]); }
            else if (infoY == deltay[2]) { TrueBuilding[18] = false; Debug.Log("La 18instancia se ha anulado" + TrueBuilding[18]); }
            else if (infoY == deltay[3]) { TrueBuilding[19] = false; Debug.Log("La 19instancia se ha anulado" + TrueBuilding[19]); }
        }
        //Ver de poner un switch
        Instantiate(ArcheryPrefab, new Vector3(infoX, infoY, -1f), Quaternion.identity);
        DestroyAllObjects();

    }




    void DestroyAllObjects()
    {
        var gameObjects = GameObject.FindGameObjectsWithTag("TemporalBuild");
        for (var i = 0; i < gameObjects.Length; i++)
        {
            Destroy(gameObjects);
        }
    }
}
 

Y cuando haces el debug de la instancia te sale a false??

Diciembre 10, 2015, 03:41:20 AM #2 Ultima modificación: Diciembre 10, 2015, 03:45:48 AM por Lord Bruno
Cuando realizo el Debug los elementos del array jamas cambian a false. Edit: Ahora en los ultimos Debug que he realizado los cambia a false, pero el sistema lo considera true de todas maneras.

A lo mejor tienes que iniciarlo en false el array

pones debug.logs en los if que no deberian pasar, y miras hacia atras en el codigo a ver si se cambia a true en alguna parte. asegurate de usar == en vez de = al comparar, es un error de typing que a veces se pasa por alto

en primera tienes un desorden infinito de if, cuando tienes demasiados usa mejor switch, ahora, la comparacion de float == float , es un ambigua esto quiere decir, que es poco probable que te de exactamente la misma gama de decimales osea no es lo mismo 1.5f a 1.501f , ahi ya son muy diferentes.si es por posicion trata de usar posiciones enteras de preferencia, o de plano mejor colocale al tile un boxcollider con trigger, al pasar el gameobjet sobre el, instancia sobre su posicion y lo desactivas.saludos.   

Etiquetas: