Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: Bydark en Julio 04, 2016, 06:38:48 PM

Título: Selección de personaje, confirmación y cargar siguiente escena.
Publicado por: Bydark en Julio 04, 2016, 06:38:48 PM
Mi problema es el siguiente, estoy haciendo una escena donde elegir personaje, el cambio de personaje se realiza, pero necesito confirmar que quiero usar ese prefab y tenerlo en la siguiente escena listo para ser cargado.
 
Os dejo el código como lo llevo hasta ahora, como podréis ver, el "Play" funciona igual que el botón "Next" ya que realmente no se seleccionar el prefab y pasar a otra escena..
 
¿Alguna ayuda? Mil gracias!
 
 
 

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
public class CharacterSelector : MonoBehaviour {
 
public List<GameObject> characterList;
public int index=0;
void Start () {

   GameObject[] characters = Resources.LoadAll<GameObject>("Prefab");
   foreach (GameObject c in characters) {
      GameObject _char = Instantiate(c) as GameObject;
      _char.name = c.name;
      _char.transform.SetParent(GameObject.Find("CharacterList").transform);
      characterList.Add(_char);
      _char.SetActive(false);
      GameObject.Find("CharName").GetComponent<Text>().text = characterList[index].name;
      characterList[index].SetActive(true);
 
   }
}
public void Next(){
   characterList [index].SetActive (false);
   if (index == characterList.Count - 1) {
      index = 0;
   } else {
      index++;
   }
   GameObject.Find("CharName").GetComponent<Text>().text = characterList[index].name;
   characterList [index].SetActive (true);
   
}
public void Previous(){
   characterList [index].SetActive (false);
   if (index == 0) {
      index = characterList.Count-1;
   } else {
      index--;
   }
   GameObject.Find("CharName").GetComponent<Text>().text = characterList[index].name;
   characterList [index].SetActive (true);
   
}
 

public void Play(){
   characterList [index].SetActive (false);
   if (index == characterList.Count - 1) {
      index = 0;
   } else {
      index++;
   }
   GameObject.Find("CharName").GetComponent<Text>().text = characterList[index].name;
   characterList [index].SetActive (true);
}
void Update(){
   characterList [index].transform.Rotate (0,0.5f,0);
}
}

 
 
Título: Selección de personaje, confirmación y cargar siguiente escena.
Publicado por: Bydark en Julio 04, 2016, 09:41:31 PM
Dejo un vídeo de lo que llevo de la escena de elegir personaje.
 
Mi intención es que al darle a "Play" elija ese prefab y cargue la siguiente escena.
 
https://www.youtube.com/watch?v=kgbTObhaUpI&feature=youtu.be (//%5Byoutube%5Dhttps://www.youtube.com/watch?v=kgbTObhaUpI%5B/youtube%5D&amp;feature=youtu.be)
 
VUELVO A EDITAR:
 
He encontrado lo que necesito exactamente para que funcione pero no lo consigo. Os explico:
 

Lo que necesito es que al darle al Play en la escena 1, elija ese prefab y lo sustituya en el NETWORK MANAGER que tengo en el Lobby, ya que éste es el que me genera el prefab en la escena 3.
 
Espero haberme explicado, sólo necesito saber como cambiar el valor del NETWORK MANAGER de la escena 2, con la elección de la escena 1, teniendo en cuenta que en la escena 1 no hay network manager.
 
A ver si ahora os lo he puesto más fácil :) , un saludo enorme y perdonad que sea así de pesado, llevo desde las 9:00 de la mañana con esto y quería dejar el tema bien claro antes de rendirme por hoy jeje.
 
 
Título: Selección de personaje, confirmación y cargar siguiente escena.
Publicado por: JordiUnity en Julio 04, 2016, 11:59:13 PM
es esto lo que necesitas? http://forum.unity3d.com/threads/how-to-setup-different-player-prefabs.332507/ (http://forum.unity3d.com/threads/how-to-setup-different-player-prefabs.332507/)
Título: Selección de personaje, confirmación y cargar siguiente escena.
Publicado por: Bydark en Julio 05, 2016, 12:02:38 AM
Cita de: JordiUnity date=1467669553es esto lo que necesitas? http://forum.unity3d.com/threads/how-to-setup-different-player-prefabs.332507/ (http://forum.unity3d.com/threads/how-to-setup-different-player-prefabs.332507/)
   


Diría que si aunque creo que lo mío es más sencillo que lo que se habla en el post que me has pasado.
 
Solo pretendo modificar el prefab del network manager en función del personaje que haya elegido la escena 1.
 
Muchas gracias, veo que los tiros van por ahí pero sigo sin saber que hacer...jajaja
 
 
 
Un saludo.
Título: Selección de personaje, confirmación y cargar siguiente escena.
Publicado por: Bydark en Julio 05, 2016, 11:46:45 PM
Nadie sabe ayudarme? :(
Título: Selección de personaje, confirmación y cargar siguiente escena.
Publicado por: DiegoSadiGame en Julio 06, 2016, 01:02:17 AM
Bueno para cargar otra escena tienes que añadir esto a tú excript
 

using UnityEngine;
using System.Collections;
//Añades esta linea
using UnityEngine.SceneManagement;
public class CharacterSelector : MonoBehaviour {

public void Play(){
//esta linea cargaria la escena entre comillas
   SceneManager.LoadScene ("Nivel1");
// SceneManager.LoadScene (0);
//o con el numero correcpondiente de la escena
}

}

 
 tiernes que tener tu Scena creada y añadida en  file>>Build Settings adjunto una imagen de ejemplo, y ya cada vez que preciones play se cargaria la escena, es la manera mas simple.
 
 (//<fileStore.core_Attachment>/monthly_2016_07/577c3bcf6b691_Buildsetings.png.6dfffe12cd008f4ef466a60cb53c89c5.png)
Título: Selección de personaje, confirmación y cargar siguiente escena.
Publicado por: Bydark en Julio 06, 2016, 01:12:53 AM
Cita de: DiegoSadiGame date=1467759737Bueno para cargar otra escena tienes que añadir esto a tú excript
   
   

using UnityEngine;
using System.Collections;
//Añades esta linea
using UnityEngine.SceneManagement;
public class CharacterSelector : MonoBehaviour {

public void Play(){
//esta linea cargaria la escena entre comillas
   SceneManager.LoadScene ("Nivel1");
// SceneManager.LoadScene (0);
//o con el numero correcpondiente de la escena
}

}

   
       tiernes que tener tu Scena creada y añadida en  file>>Build Settings adjunto una imagen de ejemplo, y ya cada vez que preciones play se cargaria la escena, es la manera mas simple.
   
   
      
   


Muchas gracias Diego, eso arregla la parte del problema que menos me preocupaba jeje, pero aun así muchísimas gracias.
 
 
 
¿Tienes alguna idea sobre cambiar el prefab del newtwork manager con un script?
 
 
 
Es decir, lo que quiero es cambiar es poner el prefab que elijo en la escena 1, que es la de selección del personaje.
 
 
 
Un saludo y muchas gracias por contestar, llevo dos días completos intentándolo y no encuentro la manera.
 
Cita de: Bydark date=1467760373Muchas gracias Diego, eso arregla la parte del problema que menos me preocupaba jeje, pero aun así muchísimas gracias.
   
   
       
   
   
      ¿Tienes alguna idea sobre cambiar el prefab del network manager con un script?
   
   
      Es decir, lo que quiero es cambiar es poner el prefab que elijo en la escena 1, que es la de selección del personaje.
   
   
       
   
   
      Un saludo y muchas gracias por contestar, llevo dos días completos intentándolo y no encuentro la manera.
   


 
Título: Selección de personaje, confirmación y cargar siguiente escena.
Publicado por: DiegoSadiGame en Julio 06, 2016, 01:18:48 AM
Hola y de nada  ahora boy a probar algo que se me ocurrio para hacerlo,  si sirve te aviso.
Título: Selección de personaje, confirmación y cargar siguiente escena.
Publicado por: Bydark en Julio 06, 2016, 01:35:14 AM
Cita de: DiegoSadiGame date=1467760728Hola y de nada  ahora boy a probar algo que se me ocurrio para hacerlo,  si sirve te aviso.
   


Mil gracias de verdad .
Título: Selección de personaje, confirmación y cargar siguiente escena.
Publicado por: DiegoSadiGame en Julio 06, 2016, 01:57:11 AM
Cita de: Bydark date=1467761714Mil gracias de verdad .
   


Pues esto va asi.

guardaremos tu variable de tipo entero index de tú escript en un PlayerPrefs para saver en la otra escena lo que elegimos.
 


Asi queda tu escrip, pero necesitamos otro que cargara el prefab
 

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class CharacterSelector : MonoBehaviour {
 
public List<GameObject> characterList;
public int index=0;
void Start () {

   GameObject[] characters = Resources.LoadAll<GameObject>("Prefab");
   foreach (GameObject c in characters) {
      GameObject _char = Instantiate(c) as GameObject;
      _char.name = c.name;
      _char.transform.SetParent(GameObject.Find("CharacterList").transform);
      characterList.Add(_char);
      _char.SetActive(false);
      GameObject.Find("CharName").GetComponent<Text>().text = characterList[index].name;
      characterList[index].SetActive(true);
 
   }
}
public void Next(){
   characterList [index].SetActive (false);
   if (index == characterList.Count - 1) {
      index = 0;
   } else {
      index++;
   }
   GameObject.Find("CharName").GetComponent<Text>().text = characterList[index].name;
   characterList [index].SetActive (true);
   
}
public void Previous(){
   characterList [index].SetActive (false);
   if (index == 0) {
      index = characterList.Count-1;
   } else {
      index--;
   }
   GameObject.Find("CharName").GetComponent<Text>().text = characterList[index].name;
   characterList [index].SetActive (true);
   
}
 

public void Play(){
     
      // primero guardamos el valor de index
      PlayerPrefs.SetInt ("PlayerIndex",index);
       //luego cargamos la siguiente esena
SceneManager.LoadScene ("Level7");
}
void Update(){
   characterList [index].transform.Rotate (0,0.5f,0);
}
}

 
 
 
Este Script yo lo puse en la camara, y necesita un ponto donde instanciara al prefab, puedes crear un objeto bacio con el atajo ctrl + shift + N
 

using UnityEngine;
using System.Collections;
public class CharacterStart : MonoBehaviour {
public GameObject[] Player;
public GameObject StartPosition;
public int Index;
// Use this for initialization
void Start () {
   //El valor que guardamos aqui se lo pasamos a index
   Index = PlayerPrefs.GetInt ("PlayerIndex",0);
   //con esta linea instanciamos el prefab en la posicion en la que pusiste el objeto bacio
   Instantiate (Player [Index], StartPosition.transform.position, Quaternion.identity);
}
}

 
en el inspector añades tus prefabs a player y el objeto bacio en StratPosition, la verdad es bastante simple. espero te sirva.
Título: Selección de personaje, confirmación y cargar siguiente escena.
Publicado por: Bydark en Julio 06, 2016, 02:13:11 AM
Cita de: DiegoSadiGame date=1467763031Pues esto va asi.

      guardaremos tu variable de tipo entero index de tú escript en un PlayerPrefs para saver en la otra escena lo que elegimos.
   
   
      

      Asi queda tu escrip, pero necesitamos otro que cargara el prefab
   
   

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class CharacterSelector : MonoBehaviour {
 
public List<GameObject> characterList;
public int index=0;
void Start () {

   GameObject[] characters = Resources.LoadAll<GameObject>("Prefab");
   foreach (GameObject c in characters) {
      GameObject _char = Instantiate(c) as GameObject;
      _char.name = c.name;
      _char.transform.SetParent(GameObject.Find("CharacterList").transform);
      characterList.Add(_char);
      _char.SetActive(false);
      GameObject.Find("CharName").GetComponent<Text>().text = characterList[index].name;
      characterList[index].SetActive(true);
 
   }
}
public void Next(){
   characterList [index].SetActive (false);
   if (index == characterList.Count - 1) {
      index = 0;
   } else {
      index++;
   }
   GameObject.Find("CharName").GetComponent<Text>().text = characterList[index].name;
   characterList [index].SetActive (true);
   
}
public void Previous(){
   characterList [index].SetActive (false);
   if (index == 0) {
      index = characterList.Count-1;
   } else {
      index--;
   }
   GameObject.Find("CharName").GetComponent<Text>().text = characterList[index].name;
   characterList [index].SetActive (true);
   
}
 

public void Play(){
     
      // primero guardamos el valor de index
      PlayerPrefs.SetInt ("PlayerIndex",index);
       //luego cargamos la siguiente esena
SceneManager.LoadScene ("Level7");
}
void Update(){
   characterList [index].transform.Rotate (0,0.5f,0);
}
}

   
       
   
   
      Este Script yo lo puse en la camara, y necesita un ponto donde instanciara al prefab, puedes crear un objeto bacio con el atajo ctrl + shift + N
   
   

using UnityEngine;
using System.Collections;
public class CharacterStart : MonoBehaviour {
public GameObject[] Player;
public GameObject StartPosition;
public int Index;
// Use this for initialization
void Start () {
   //El valor que guardamos aqui se lo pasamos a index
   Index = PlayerPrefs.GetInt ("PlayerIndex",0);
   //con esta linea instanciamos el prefab en la posicion en la que pusiste el objeto bacio
   Instantiate (Player [Index], StartPosition.transform.position, Quaternion.identity);
}
}

   
      en el inspector añades tus prefabs a player y el objeto bacio en StratPosition, la verdad es bastante simple. espero te sirva.
   


Wow la verdad es que visto como lo pones parece bastante fácil jaja, acabo de probarlo pero a la hora de jugar me salta un error que te dejo aquí en una imagen.
 
¿Este error puede deberse a que ya tengo creado dos puntos de spawn para el player?
 
Un saludo y mil gracias de nuevo, estoy aprendiendo bastante con tu ayuda :D .
 
 
 
 
 
EDITO:
 
 
 
El error era que no había metido los prefabs pero ahora nace otro error distinto..
 
 
 
Resulta que si que me instancia el personaje elegido, pero el juego no inicia con el, en el prefab de mi network manager sigue estando el prefab de siempre y el que instanciamos gracias a tu script aparece como un objeto más pero no puedo jugar con el, no se si me explico, se instancia correctamente pero no puedo usarlo de personaje principal ya que no es el prefab del network manager...
 
 
 
MIl gracias de nuevo, a ver si a la próxima logramos dar con la solución..jaja :D
 
 
Título: Selección de personaje, confirmación y cargar siguiente escena.
Publicado por: DiegoSadiGame en Julio 06, 2016, 03:03:33 AM
puede ser por
 
1.- Que el valor de index no esta dentro del tamaño del array, si tienes 3 prefabs estan ordenados del 0 al 2  asi que si el valor que se guardo es menor a 0  o mayor a 2 dara ese error.
 
2.- O porque en la escena donde se caragan los prefabs no tienes todos añadidos si solo colocate 2 prefabs estaran ordenados del 0 al 1 y cuando en la escena de seleccion elijas el que tiene el index 2 no lo podra cargar, por defecto en tú escript tienes limite de 3 prefaps por que cuando llega a index 2 se regresa a 0.
 
ya lo probe y si me funciono. asi que el punto 2 es el que te da el error
 
si aun no puedes arreglar el error dime y vemos que hacemos !!
 
ademas de que tienes dos camaras con el audio listener eliminacelo a una.

 
 
 
Título: Selección de personaje, confirmación y cargar siguiente escena.
Publicado por: Bydark en Julio 06, 2016, 03:06:17 AM
Cita de: DiegoSadiGame date=1467767013puede ser por
   
   
      1.- Que el valor de index no esta dentro del tamaño del array, si tienes 3 prefabs estan ordenados del 0 al 2  asi que si el valor que se guardo es menor a 0  o mayor a 2 dara ese error.
   
   
      2.- O porque en la escena donde se caragan los prefabs no tienes todos añadidos si solo colocate 2 prefabs estaran ordenados del 0 al 1 y cuando en la escena de seleccion elijas el que tiene el index 2 no lo podra cargar, por defecto en tú escript tienes limite de 3 prefaps por que cuando llega a index 2 se regresa a 0.
   
   
      ya lo probe y si me funciono. asi que el punto 2 es el que te da el error
   
   
      si aun no puedes arreglar el error dime y vemos que hacemos !!
   
   
      ademas de que tienes dos camaras con el audio listener eliminacelo a una.

       
   
   
       
   


Vaya, no me dió tiempo a editar antes de que lo vieras...arriba te he puesto el error actual, siento haberte hecho escribir para nada...jajaj
 
 
 
Gracias! :D
Título: Selección de personaje, confirmación y cargar siguiente escena.
Publicado por: DiegoSadiGame en Julio 06, 2016, 03:26:23 AM
No hay problema.
 
Ahora con el nuevo problema ya se que pasa XD, devido a como tienes tu proyecto convendria más activar el Player elegido y desactivar los otros mientras no se usan.  tal vez no sea la mejor forma de hacerlo pero si funciona el script.

ahora los prefabs tendran que estar en la escena y solo se mantedra activado el que sea elejido, si no te funciona tendria que ver tu proyecto para saber que te va ha servir.
 

using UnityEngine;
using System.Collections;
public class CharacterStart : MonoBehaviour {
public GameObject[] Player;
private int Index;
// Use this for initialization
void Start () {
   Index = PlayerPrefs.GetInt ("PlayerIndex",0);
   Player
  • .SetActive (false);
   Player [1].SetActive (false);
   Player [2].SetActive (false);
   Player [Index].SetActive (true);
}
}

 
 
Título: Selección de personaje, confirmación y cargar siguiente escena.
Publicado por: Bydark en Julio 06, 2016, 03:41:11 AM
Cita de: DiegoSadiGame date=1467768383No hay problema.
   
   
      Ahora con el nuevo problema ya se que pasa XD, devido a como tienes tu proyecto convendria más activar el Player elegido y desactivar los otros mientras no se usan.  tal vez no sea la mejor forma de hacerlo pero si funciona el script.
      ahora los prefabs tendran que estar en la escena y solo se mantedra activado el que sea elejido, si no te funciona tendria que ver tu proyecto para saber que te va ha servir.
   
   

using UnityEngine;
using System.Collections;
public class CharacterStart : MonoBehaviour {
public GameObject[] Player;
private int Index;
// Use this for initialization
void Start () {
   Index = PlayerPrefs.GetInt ("PlayerIndex",0);
   Player
  • .SetActive (false);
   Player [1].SetActive (false);
   Player [2].SetActive (false);
   Player [Index].SetActive (true);
}
}

   
       
   


No acaba de funcionarme, me salta este error tan enorme xD :
 



   
      NullReferenceException: Object reference not set to an instance of an object
      UnityEngine.Networking.NetworkTransform.SerializeMode3D (UnityEngine.Networking.NetworkWriter writer) (at 16 msgType, UnityEngine.Networking.MessageBase msg, Int32 channelId) (at ...
      UnityEngine.Networking.NetworkIdentity.UNetStaticUpdate () (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkIdentity.cs:1059)
   

[/quote]
 
Si quieres subo mi proyecto a Dropbox y mañana te paso el enlace, que me dices??
 
 
 
Un saludo!!
Título: Selección de personaje, confirmación y cargar siguiente escena.
Publicado por: DiegoSadiGame en Julio 06, 2016, 03:45:32 AM
o.o esta pequeño el error jeje. 
 
claro si quieres te puedo ayudar.
Título: Selección de personaje, confirmación y cargar siguiente escena.
Publicado por: Bydark en Julio 06, 2016, 03:51:14 AM
Cita de: DiegoSadiGame date=1467769532o.o esta pequeño el error jeje. 
   
   
      claro si quieres te puedo ayudar.


Vale, en unas horas te dejo en un privado el enlace, muchísimas gracias por todo :D :D !!
Título: Selección de personaje, confirmación y cargar siguiente escena.
Publicado por: pioj en Julio 06, 2016, 08:20:45 AM
@Bydark, Si algún usuario ha dado la respuesta, lo correcto es que la marques como Best Answer, pulsando en la "V" verde que hay debajo del usuario. Eso evita tener que recorrer todas las páginas del post y releerlo todo de nuevo...
 
 
 
Aprovecho también para recordaros que, cuando veáis que el código es demasiado largo, no lo pongáis entero por aquí y mejor pegar un link a Pastebin o Hastebin.com, y similares... Facilita bastante más la lectura.
Título: Selección de personaje, confirmación y cargar siguiente escena.
Publicado por: Bydark en Julio 06, 2016, 09:16:19 PM
Cita de: pioj date=1467786045@Bydark, Si algún usuario ha dado la respuesta, lo correcto es que la marques como Best Answer, pulsando en la "V" verde que hay debajo del usuario. Eso evita tener que recorrer todas las páginas del post y releerlo todo de nuevo...
   
   
       
   
   
      Aprovecho también para recordaros que, cuando veáis que el código es demasiado largo, no lo pongáis entero por aquí y mejor pegar un link a Pastebin o Hastebin.com, y similares... Facilita bastante más la lectura.
   


Gracias por los consejos, en reaildad no hice lo de la mejor respuesta por que el problema sigue activo, pero viendo todo el esfuerzo del compañero tal vez le ayude a otros a solucionar su problema, lo haré, de nuevo gracias.
 
 
 
@DiegoSadiGame ya tienes en un privado mi proyecto, gracias !!