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);
}
}
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&feature=youtu.be)
VUELVO A EDITAR: He encontrado lo que necesito exactamente para que funcione pero no lo consigo. Os explico:
La escena 1 es el selector de personajes.
La escena 2 es el lobby, donde elegimos el modo de juego.
La escena 3 es el gameplay.
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.
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/)
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.
Nadie sabe ayudarme? :(
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)
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.
Hola y de nada ahora boy a probar algo que se me ocurrio para hacerlo, si sirve te aviso.
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 .
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.
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
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.
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
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 Player [1].SetActive (false);
Player [2].SetActive (false);
Player [Index].SetActive (true);
}
}
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 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!!
o.o esta pequeño el error jeje.
claro si quieres te puedo ayudar.
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 !!
@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.
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 !!