Jump to content
UnitySpain

juanma_teso

Registrados
  • Content Count

    618
  • Joined

  • Last visited

  • Days Won

    14

juanma_teso last won the day on December 28 2018

juanma_teso had the most liked content!

Community Reputation

159 Excellent

4 Followers

About juanma_teso

  • Rank
    Experto

Profile Information

  • Especialidad
    Coder

Recent Profile Visitors

1,358 profile views
  1. Hola a todos! Vuelvo al foro como cada verano, me alegra ver a muchos usuarios igual de activos y otros subiendo juegos a steam, abro este hilo para hablar de las novedades, en casi un año Unity parece haber cambiado mucho Algún avanzado con ecs? Alguien ha trasteado con las render pipeline? No sé qué otras novedades debería echar un vistazo, por eso abro este hilo, también estaría bien ver si alguien tiene algún proyecto chulo... Saludos!!
  2. Puedes modificar el drag del rigidbody, a mayor drag más oposición tiene a moverse, para la rotación creo que está el angulardrag, es decir si fijas un angulardrag "grande" se detendrá de forma lineal rápidamente, uno "pequeño" tardará más.
  3. No tendrías que usar un Enumerator para usar un Yield?? Creo que así se hacen las funciones asíncronas no?
  4. Hola!! No sé cuál es tu concreta, de forma un poco general: Lo mejor es separar la acción de tocar la pantalla de lo que pasa al tocar, puedes crear un botón con la interfaz aunque si le echas un ojo a Input.GetTouch() verás que tiene mucho juego y te da más posibilidades... (mantener pulsado por 'x' tiempo por ejemplo) Para saber si los botones son pulsados en el orden correcto se me ocurren un par de cosas: Usar un array y un bucle for, si está bien saltas al siguiente paso. Usar una pila. De todas formas tienes que crear una manera de meter la secuencia y guardarla desde el editor, una buena manera es usar scriptableObject, esta secuencia es la que verificas como te indico arriba o de otra forma. Un saludo!
  5. juanma_teso

    Delta Squad

    Buenísimo!! Felicidades
  6. Con el CustomSpawn. Lo más sencillo será que llames el NetworkServer.Spawn y luego una función (ClientRPC) para poner el color y escala que quieras, lo que ya no estoy tan seguro es si estará bien sincronizado.
  7. A ver, creo que el NetworkServer.Spawn lo que hace es una instancia del prefab registrado en el cliente y luego inicia las variables "syncvar", por eso cuando cambias el color del prefab en el servidor el cliente no se entera (no crea una copia en el cliente), si no llamas la función donde cambias el color del prefab (ColorSprite()) en el servidor se instancia negro? Si es así puedes hacer lo siguiente: Función custom de Spawn, sería lo más complicado/sofisticado, creas una función que será la que se use en los clientes (y en el host) cuando se instancie el prefab. Cambiar el color después de instanciar el prefab, instancias el prefab y luego llamas un ClientRPC con el color que quieras. Crear una variable "syncvar" que se iniciará con el valor que tenga en el servidor en el momento de llamar el Spawn, Ahora bien. no recuerdo si "Color" sea un tipo que puedas pasar o hacer variable, sino puedes usar un simple Vector3 (o Vector4 si usas el alpha del color).
  8. Sólo por curiosidad y para crear debate, los servidores (dedicados) serán tuyos? sino sabes los características de los servidores? vas a hacer que sean hosts? Estuve leyendo sobre servidores el otro día y se supone que son bastante más potentes que los ordenares, no creo que suponga un problema hacer esos cálculos, puedes realizar pruebas? Estas son el tipo de cosas que "retrasan" el desarrollo pero que mejoran el resultado final, por qué no haces una escena en la que calculas y mueves varios (20-30) NPCs? No creo que tarde en realizar los cálculos, igual lo que podrías comparar es si te sale mejor actualizar la posición e interpolar cada "x" frames o mandar el path a cada cliente cuando un jugador lo actualiza, también podrías calcular el path en local y subir dicho path. No estoy seguro si puedas mandar el NavMeshPath directamente o tengas que implementar un serializador/deserializador.
  9. Más info estaría bien, cambias de colores los sprites por código? O cargas el sprite con el color definido?
  10. Hola! Vas por buen camino, la condición que buscas es "si el transform está entre estos puntos...", si estás usando las físicas de Unity puedes ahorrar mucho código usando la función OnTriggerEnter: void OnTriggerEnter (Collider objeto) { anim.Play("animacion"); } Si estás moviendo el GameObject mediante el Transform (mala idea) tendrías que mirar cada frame si estás en una zona próxima al punto que quieres: void Update () { if(Vector3.Distance(transform.position, posicion) < 2f) anim.Play("animacion"); } Estaría bien que controlaras si la animación se está reproduciendo para no reiniciarla o si se debe reproducir desde el principio cada vez que te acercas.
  11. Usa la función que te mencioné, en el mismo manual te pone como ejemplo que puedes usarla para activar la cámara: void OnStartLocalPlayer () { //Busca la cámara y fija el target. } @francoe1 jajaj siempre discrepamos en lo mismo, hasta donde sé los NetworkBehaviour (NB) no son nada sin un NetworkIdentity (NI), es necesario un NI para que el NB funcione y se sincronice además un NI puede manejar varios NB, todos los que tenga un mismo GameObject (creo que tiene un máximo), el NI tampoco es el que manda los mensajes a través de la red, el encargado de mandar y recibir los mensajes (no hablo a nivel bajo) es el NetworkConnection y según la documentación maneja múltiples NI y es único para un cliente, entonces según lo entendí yo, no crea múltiples conexiones.
  12. No deberías necesitar más de una cámara en la escena, cuando crees una escena "online" piensa que esa escena se va a crear en cada cliente con todos los GameObjects que haya en ella, las mallas (por ejemplo un edificio) se crean de manera "local", al igual que la cámara, audiosource, luces, etc... si no haces cambios (imagina que quieres que haya una habitación en la que los jugadores pueden encender/apagar la luz o puertas abiertas/cerradas) no deberías de tener que sincronizar nada de esto entre los diferentes clientes. La lógica es tema aparte, debes tener mucho cuidado con físicas (no hablo solo de rigidbody, sino también de los cast) porque depende de dónde hagas los cálculos puedes tener errores, como dice Franco, debes abstraer bastante, aunque no concuerdo con lo de un NetworkBehaviour por cliente, sí creo que debes reducir lo máximo el número de NetworkBehaviour. El tema de la cámara, si tienes una cámara que sigue al jugador, será el jugador el que le diga a la cámara de la escena que lo tiene que seguir (también puedes instanciar una cámara al crear al jugador), aquí verás que si no tienes cuidado acabas con tantas cámaras como jugadores (mal), puedes tirar de isLocalPlayer para saber si es el jugador "local", por ejemplo: void Start () { if(isLocalPlayer) { Emparenta la cámara con el jugador o setea tu jugador en la cámara. } } También puedes usar los métodos que son llamados por Networking: OnStartLocalPlayer. Suerte!!
  13. Es lo que tengo hecho yo, igual hay maneras más eficientes, pero esta no me laggea el juego. Cosas que tuve en cuenta: La lista de jugadores (la malla y las variables que en mi caso son diferentes para cada jugador) están en cada cliente, un objeto DontDestroy y con patrón singletón para acceder desde cualquier pantalla. Necesitas una manera de guardar los personajes escogidos en los clientes, no es necesario guardar esta información en cada cliente, con un objeto en el host basta. Hay que tener mucho cuidado con las llamadas OnStartClient/OnStartServer/Start... etc, te recomiendo usar una corrutina en el Host para que le de tiempo a todos los clientes a iniciarse bien. IMPORTANTE!! Necesitas una referencia a cada cliente, el problema es que cuando cambias de escena cada cliente obtiene un nuevo connectionID, yo usé la dirección IP (mi juego es en red local).
  14. Sí, a mí se me ocurrieron dos formas de hacer lo que quieres, ninguna es directa con el networking (no he mirado toda la API, quizas en el LobbyManager haya algo): La primera es crear un prefab genérico e instanciar en cada cliente la malla del personaje escogido, pero como lo tengo es bastante más complejo. La segunda es cambiar el PrefabPlayer que instancia el NetworkManager, para esto metes los prefabs en SpawnablePrefabs: public override void OnServerAddPlayer(NetworkConnection conn, short playerControllerId) { GameObject player; if (contador == 0) player = Instantiate(spawnPrefabs[0]); else player = Instantiate(spawnPrefabs[1]); contador++; NetworkServer.AddPlayerForConnection(conn, player, playerControllerId); } Pero no sé bien el comportamiento que tenga exactamente.
  15. Tal vez puedas usar AssetsBundles, es como un paquete en el que metes Assets, texturas, etc... no es algo imposible pero tampoco para principiantes, eso sí te ahorras los 50$... https://docs.unity3d.com/Manual/AssetBundlesIntro.html Suerte!!
×
×
  • Create New...