Jump to content
Sign in to follow this  
Pedro

Scripts Problemas

Recommended Posts

Acabo de hacer un par de scripts para un inventario y no me funcionan. Pulso E y no ocurre nada.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Pan : MonoBehaviour {


    GameObject player;
    Inventario Inventario;


    void Start()
    {
        player = GameObject.FindGameObjectWithTag("Player");
        Inventario = player.GetComponent<Inventario>();
        Inventario.Slot1Lleno = false;
        Inventario.Slot2Lleno = false;
        Inventario.Slot3Lleno = false;
        Inventario.Slot4Lleno = false;
        Inventario.Slot5Lleno = false;
    }

    // Update is called once per frame
    void Update()
    {

    }

    public void OnTriggerStay(Collider collision)
    {

        if (collision.gameObject.name == "Pan")
        {
            if (Input.GetKeyDown(KeyCode.E) && Inventario.Slot1Lleno != true)
            {
                Inventario.Pan = true;
                Inventario.Slot1Lleno = true;
                Destroy(collision, 0);
            }
            if (Input.GetKeyDown(KeyCode.E) && Inventario.Slot1Lleno != false)
            {
                Inventario.Pan = true;
                Inventario.Slot2Lleno = true;
                Destroy(collision, 0);
            }
            if (Input.GetKeyDown(KeyCode.E) && Inventario.Slot1Lleno != false && Inventario.Slot2Lleno != false)
            {
                Inventario.Pan = true;
                Inventario.Slot3Lleno = true;
                Destroy(collision, 0);
            }
            if (Input.GetKeyDown(KeyCode.E) && Inventario.Slot1Lleno != false && Inventario.Slot2Lleno != false && Inventario.Slot3Lleno != false)
            {
                Inventario.Pan = true;
                Inventario.Slot4Lleno = true;
                Destroy(collision, 0);
            }
            if (Input.GetKeyDown(KeyCode.E) && Inventario.Slot1Lleno != false && Inventario.Slot2Lleno != false && Inventario.Slot3Lleno != false && Inventario.Slot5Lleno != false)
            {
                Inventario.Pan = true;
                Inventario.Slot5Lleno = true;
                Destroy(collision, 0);
            }
        }
    }


}
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class Inventario : MonoBehaviour
{
    public Image Slot1;
    public Image Slot2;
    public Image Slot3;
    public Image Slot4;
    public Image Slot5;
    public bool Slot1Lleno;
    public bool Slot2Lleno;
    public bool Slot3Lleno;
    public bool Slot4Lleno;
    public bool Slot5Lleno;
    public bool Botella;
    public bool Botiquin;
    public bool Manzana;
    public bool Pan;
    public bool vendas;

    void Start()
    {
        Slot1 = GameObject.Find("Slot1").GetComponent<Image>();
        Slot2 = GameObject.Find("Slot2").GetComponent<Image>();
        Slot3 = GameObject.Find("Slot3").GetComponent<Image>();
        Slot4 = GameObject.Find("Slot4").GetComponent<Image>();
        Slot5 = GameObject.Find("Slot5").GetComponent<Image>();
    }

    void Update()
    {
        //Slot1
        if (Botella && Slot1Lleno != true && Slot2Lleno != false && Slot3Lleno != false && Slot4Lleno != false && Slot5Lleno != false)
        {
            Slot1.sprite = Resources.Load<Sprite>("Inventario/botella");
            
        }
        if (Botiquin && Slot1Lleno != true && Slot2Lleno != false && Slot3Lleno != false && Slot4Lleno != false && Slot5Lleno != false)
        {
            Slot1.sprite = Resources.Load<Sprite>("Inventario/botiquin");

        }
        if (Manzana && Slot1Lleno != true && Slot2Lleno != false && Slot3Lleno != false && Slot4Lleno != false && Slot5Lleno != false)
        {
            Slot1.sprite = Resources.Load<Sprite>("Inventario/manzana");
        }
        if (Pan && Slot1Lleno != true && Slot2Lleno != false && Slot3Lleno != false && Slot4Lleno != false && Slot5Lleno != false)
        {
            Slot1.sprite = Resources.Load<Sprite>("Inventario/Pan");

        }
        if (vendas && Slot1Lleno != true && Slot2Lleno != false && Slot3Lleno != false && Slot4Lleno != false && Slot5Lleno != false)
        {
            Slot1.sprite = Resources.Load<Sprite>("Inventario/vendas");

        }
        //Slot2
        if (Botella && Slot1Lleno != false && Slot2Lleno != true && Slot3Lleno != false && Slot4Lleno != false && Slot5Lleno )
        {
            Slot2.sprite = Resources.Load<Sprite>("Inventario/botella");

        }
        if (Botiquin && Slot1Lleno != false && Slot2Lleno != true && Slot3Lleno != false && Slot4Lleno != false && Slot5Lleno)
        {
            Slot2.sprite = Resources.Load<Sprite>("Inventario/botiquin");

        }
        if (Manzana && Slot1Lleno != false && Slot2Lleno != true && Slot3Lleno != false && Slot4Lleno != false && Slot5Lleno)
        {
            Slot2.sprite = Resources.Load<Sprite>("Inventario/manzana");
        }
        if (Pan && Slot1Lleno != false && Slot2Lleno != true && Slot3Lleno != false && Slot4Lleno != false && Slot5Lleno)
        {
            Slot2.sprite = Resources.Load<Sprite>("Inventario/Pan");

        }
        if (vendas && Slot1Lleno != false && Slot2Lleno != true && Slot3Lleno != false && Slot4Lleno != false && Slot5Lleno)
        {
            Slot2.sprite = Resources.Load<Sprite>("Inventario/vendas");

        }
        //Slot3
        if (Botella && Slot1Lleno != false && Slot2Lleno != false && Slot3Lleno != true && Slot4Lleno != false && Slot5Lleno != false)
        {
            Slot3.sprite = Resources.Load<Sprite>("Inventario/botella");

        }
        if (Botiquin && Slot1Lleno != false && Slot2Lleno != false && Slot3Lleno != true && Slot4Lleno != false && Slot5Lleno != false)
        {
            Slot3.sprite = Resources.Load<Sprite>("Inventario/botiquin");

        }
        if (Manzana && Slot1Lleno != false && Slot2Lleno != false && Slot3Lleno != true && Slot4Lleno != false && Slot5Lleno != false)
        {
            Slot3.sprite = Resources.Load<Sprite>("Inventario/manzana");
        }
        if (Pan && Slot1Lleno != false && Slot2Lleno != false && Slot3Lleno != true && Slot4Lleno != false && Slot5Lleno != false)
        {
            Slot3.sprite = Resources.Load<Sprite>("Inventario/Pan");

        }
        if (vendas && Slot1Lleno != false && Slot2Lleno != false && Slot3Lleno != true && Slot4Lleno != false && Slot5Lleno != false)
        {
            Slot3.sprite = Resources.Load<Sprite>("Inventario/vendas");

        }
        //Slot4
        if (Botella && Slot1Lleno != false && Slot2Lleno != false && Slot3Lleno != false && Slot4Lleno != true && Slot5Lleno != false)
        {
            Slot4.sprite = Resources.Load<Sprite>("Inventario/botella");

        }
        if (Botiquin && Slot1Lleno != false && Slot2Lleno != false && Slot3Lleno != false && Slot4Lleno != true && Slot5Lleno != false)
        {
            Slot4.sprite = Resources.Load<Sprite>("Inventario/botiquin");

        }
        if (Manzana && Slot1Lleno != false && Slot2Lleno != false && Slot3Lleno != false && Slot4Lleno != true && Slot5Lleno != false)
        {
            Slot4.sprite = Resources.Load<Sprite>("Inventario/manzana");
        }
        if (Pan && Slot1Lleno != false && Slot2Lleno != false && Slot3Lleno != false && Slot4Lleno != true && Slot5Lleno != false)
        {
            Slot4.sprite = Resources.Load<Sprite>("Inventario/Pan");

        }
        if (vendas && Slot1Lleno != false && Slot2Lleno != false && Slot3Lleno != false && Slot4Lleno != true && Slot5Lleno != false)
        {
            Slot4.sprite = Resources.Load<Sprite>("Inventario/vendas");

        }
        //Slot5
        if (Botella && Slot1Lleno != false && Slot2Lleno != false && Slot3Lleno != false && Slot4Lleno != false && Slot5Lleno != true)
        {
            Slot5.sprite = Resources.Load<Sprite>("Inventario/botella");

        }
        if (Botiquin && Slot1Lleno != false && Slot2Lleno != false && Slot3Lleno != false && Slot4Lleno != false && Slot5Lleno != true)
        {
            Slot5.sprite = Resources.Load<Sprite>("Inventario/botiquin");

        }
        if (Manzana && Slot1Lleno != false && Slot2Lleno != false && Slot3Lleno != false && Slot4Lleno != false && Slot5Lleno != true)
        {
            Slot5.sprite = Resources.Load<Sprite>("Inventario/manzana");
        }
        if (Pan && Slot1Lleno != false && Slot2Lleno != false && Slot3Lleno != false && Slot4Lleno != false && Slot5Lleno != true)
        {
            Slot5.sprite = Resources.Load<Sprite>("Inventario/Pan");

        }
        if (vendas && Slot1Lleno != false && Slot2Lleno != false && Slot3Lleno != false && Slot4Lleno != false && Slot5Lleno != true)
        {
            Slot5.sprite = Resources.Load<Sprite>("Inventario/vendas");

        }
    }
}

 

Edited by Pedro

Share this post


Link to post
Share on other sites

puf... es un poco lio...

creo que en vez de tener cinco variables para imagenen y cinco bool para slot_LLeno y un bool para cada tipo de objeto... deverias ser algo asi:

public class Inventario : MonoBehaviour {
public enum itemsEnum {none, botella, botiquin, manzana, pan, vendas};
public int capacidad = 5;
private itemsEnum slots[];


void Start() {
   slots = new itemsEnum[capacidad];//un array de slots
   for (int i = 0; i < capacidad; i++) {//bucle para recorrer todos los slots
                               
      slots[i] = itemsEnum.none; //slot numero "i" vacio
                                 
   }
                                 
}
          
public bool addItem(itemEnum item) {//añadir item (hay que pasarle que clase de item es)
   bool added = false;//item añadido?
   for (int i = 0; i < capacidad; i++) { //mirar todos los slots   
      if (slots[i] == itemsEnum.none && !added) {//si slot[numero "i"] esta vacio y aun no lo has añadido ( !added : no añadido)
         slots[i] = item; //el slot numero "i" pasa a tener ese item 
         added = true; //ya esta añadido
     }
   }  
   return added; //devuelve "true" si el item a sido añadido al inventario, "false" si no habia hueco para añadirlo
}                                
                            

public itemsEnum getSlotItemType(int slotNum){ ver que item hay en ese slot (pasandole el numero de slot)

   return slots[slotNum];
}

public void clearSlot(int slotNum) {//vaciar slot (numero)
}
   slots[slotNum] = itemsEnum.none;//poner slot como vacio
}

te he puesto muschos comentarios para explicar todo... pero creo que queda mas lioso con tanto comentario:7_sweat_smile:

 

haciendolo de esta maner puedes modificar facilmente el tamaño del inventario, asi como añadir facilmente todos los tipos de items que quieras con "public enum itemsEnum {todos los items que quieras}" 

:)

 

te he puesto una funcion para mirar que tipo de item hay en determinado slot... y otra funcion para vaciar el slot que quieras

puedes ver entonces que en el slot 3 por ejemplo hay una botella... y si la usas pues vacias el slot 3...

 

luego tendras que hacer una parte de codigo en tu "player" que dependiendo que item sea haga una cosa u otra

eso puedes hacerlo facilmente con un switch:

 

 

itemsEnum item = inventario.getSlotItemType(slotSelected);
switch (item) {
   case itemsEnum.botella:   
      mana = mana+50f;    
      break;   
   case itemsEnum.botiquin:
      vida = vida+50f;
      break;
   case itemsEnum.pan:
      mana += 10f;   
      life += 10f;

etc....

   default://siempre hay que incluir el default       
      //no hacer nada
      break;
}

 

 

para añadir un item he puesto que devuelva un "bool" asi si el item a sido añadido al inventario puedes destruir el item del escenario.... pero si no ha sido añadido porque el inventario esta lleno pues no lo destruyes...

para añadir el item seria algo asi:

public class Item:MonoBehaviour {   
   public itemsEnum thisItem;

...


void OnTriggerStay() {   
  if (Input.GetKeyDown(KeyCode.E)) {
 
     if (inventario.addItem(esteItem)) { //si el item se ha añadido...
        Destroy(this.gameObject);
     }
  }
}


 

huy perdon... primero he puesto "thisItem" y luego he puesto "esteItem".... va a dar error seguro XD

porcierto @pioj se pueden editar de alguna manera los codigos una vez añadidos?

Share this post


Link to post
Share on other sites

Primero fijate que el flujo/diseño de lo que estás haciendo tiende a catástrofe:

if (Input.GetKeyDown(KeyCode.E) && Inventario.Slot1Lleno != true)
{
Inventario.Pan = true;
Inventario.Slot1Lleno = true; // <-------VER ACA
Destroy(collision, 0);
}
if (Input.GetKeyDown(KeyCode.E) && Inventario.Slot1Lleno != false)  // <-------VER ACA, slit1lleno es true o distinto de false
{
Inventario.Pan = true;
Inventario.Slot2Lleno = true;
Destroy(collision, 0);
}

Si se mete en la primera también se va a meter en la segunda, usa else

------------------------------------------------------------------------------------------------------------------------------------------------

Primero separá datos de lógica... muy simplificado (lo escribí acá puede haber errores):

public class Item
{
	public string name = "Item";
	public sprite icon;
}

[CreateAssetMenu(menuName = "TusObjetos/Items")]
public Items : ScriptableObject
{
	public List<Item> itemsList = new List<item>();

}

das boton derecho y creas tu lista de objetos, esos son tus objetos, tus datos o recursos que serán compartidos, esto se hace desde el diseño, no debe estar involucrado en runtime, nunca nada que se llama manzana5, o coche23 debe aparecer en tu lógica, dentro de este scriptableObject configuras iconos y demás, podés agregar la cantidad de propiedades que se te ocurran.

 

------------------------------------------------------------------------------------------------------------------------------------------------

Segundo, con 4 slots hiciste 25 ifs, y si tuvieras 120 slots? terminás peor que Salieri en amadeus ... claramente tenés que llevar cuenta de qué slot está lleno y vacío, para esto, sabés que si tenés 3 manzanas, estos 3 slots van a compartir el recurso, osea el sprite (el dato), entonces podés interpretar a cada slot como una "base de datos dinámica", un inventario basicamente, podrías tener una lista o un array tranquilamente (un contenedor), muy parecido sino igual (para este ej) al del scriptableobject.Entonces la lógica quedaría algo como:

  • tenés tu personaje y tu objeto 3d (un prefab, de preferencia), este objeto 3d tiene un id o nombre que a futuro lo linkeará con un objeto de la base de datos, ej "manzana" o id = 23 (ponele) , podría ser por tag, por nombre, usando un monobehaviour solo contenedor de datos (no es lo ideal pero funcionar va a funcionar)
  • tu personaje recoge este obj, recogió el item 23 o "manzana"
  • ahora le toca al inventario, este recibe al item 23, se fija en el scriptableObject (un simple "public itemsList ...." que haga ref a la lista de objs) y lo asocia en la lista
  • se va a un slot vacío (usá lo lógica que quieras para esto) y en el slot (supongo a su vez relacionado a una UI) le pasa los datos de la lista, nombre = "manzana" , sprite = "manzana.png"
  • el obj 3D de la escena desaparece, se destruye, ahora el inventario tiene la info que necesita
  • si en cualquier momento necesitas "dropear" tu manzana, necesitas primero eliminarla de tu inventario, luego instanciar el prefab, podrías tambien haberlo desaparecido/aparecido nuevamente en vez de destruirlo/instanciarlo, es una posibilidad.

Y el update te queda de 10 líneas para 2 o 10000 objetos.

está muy por encima, la idea es mostrar un poco como lo podés simplificar.

------------------------------------------------------------------------------------------------------------------------------------------------

Con respecto a lo de "pulso la "E" y no pasa nada", pueden ser muchas cosas, capas habilitadas para colision?, layerMasks actuales?, colliders? el obj será "Pan" ?? estás seguro? por qué en vez de tiranle como 100 líneas de código no imprimis en consola si pasa o no pasa eso ...Debug.log("Es pan")... ? Que significa que "pase" algo, que funcione tu inventario? bueno, de la discusión podés intuir porque puede no estar funcionando, o que simplemente estás destruyendo "collision" y no el gameObject ? :

Destroy(collision) ---> Destroy(collision.gameObject)

 

 

 

Share this post


Link to post
Share on other sites
hace 3 horas, Igor said:

porcierto @pioj se pueden editar de alguna manera los codigos una vez añadidos?

Creo que el autor del post y el moderador pueden hacerlo, sí.

Share this post


Link to post
Share on other sites

De poder se puede @Igor pero lo que hago yo es poner vuestros Scripts en formato Code, que más de una vez se os olvida y tengo que estar poniendo aquí las cosas bonitas.

Share this post


Link to post
Share on other sites
Sign in to follow this  

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...