hola a todos, estoy aprendiendo a hacer un juego en red (para saber aplicarlo a otros proyectos) pero tengo varios problemas:
1- He utilizado el siguiente codigo para hacer el movimiento online pero ahora en el juego, al ejecutarlo no se mueve el coche (A todo esto,¿tengo que poner el "NetworkBehaviour" y "using UnityEngine.Networking" en todos los script que quiero que funcionen online?)
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class movimiento : NetworkBehaviour {
public float VelocidadNormal = 15f;
public GameObject nitro;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (!isLocalPlayer) {
return;
}
float tecladoVertical = Input.GetAxisRaw ("Vertical");
float posicionZ = transform.position.z + (tecladoVertical * VelocidadNormal * Time.deltaTime);
transform.position = new Vector3 (transform.position.x, transform.position.y, posicionZ);
float tecladoHorizontal = Input.GetAxisRaw ("Horizontal");
float posicionX = transform.position.x + (tecladoHorizontal * VelocidadNormal * Time.deltaTime);
transform.position = new Vector3 (posicionX, transform.position.y, transform.position.z);
Nitro ();
}
public void Nitro () {
if (Input.GetButton("Fire1")) {
VelocidadNormal = 30f;
}
if (Input.GetButtonUp ("Fire1")) {
VelocidadNormal = 10f;
}
}
}
2- al intentar probar el juego en red con build and run me da una serie de errores y no se que esta ocurriendo
(1-Failed to find prefab parent for scene object [name:coche]
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)
2-Failed to find prefab parent for scene object [name:coche]
UnityEngine.Networking.NetworkIdentity:OnValidate()
3-Failed to find prefab parent for scene object [name:coche]
Unit***itor.BuildPlayerWindow:BuildPlayerAndRun()
4-Error building Player: Failed to find prefab parent for scene object [name:coche]
5-Unit***itor.BuildPlayerWindow+BuildMethodException: 2 errors
at Unit***itor.BuildPlayerWindow+DefaultBuildMethods.BuildPlayer (BuildPlayerOptions options) [0x00207] in C:\buildslave\unity\build\Editor\Mono\BuildPlayerWindowBuildMethods.cs:172
at Unit***itor.BuildPlayerWindow.CallBuildMethods (Boolean askForBuildLocation, BuildOptions defaultBuildOptions) [0x00050] in C:\buildslave\unity\build\Editor\Mono\BuildPlayerWindowBuildMethods.cs:83
Unit***itor.BuildPlayerWindow:BuildPlayerAndRun()
6-Failed to find prefab parent for scene object [name:coche]
UnityEngine.Networking.NetworkIdentity:OnValidate() )
[/quote]
me podrian decir que significan??
Gracias
Te recomiendo que primero leas la documentación de UNET.
En principio tu error está en pensar el cliente como si fuera un híbrido entre un server y cliente cuando no lo es, NetworkManager requiere del prefab de "Player", por recomendación te sugiero que en este caso sea un "Controlador del jugador"..
La abstracción para el Multiplayer seria -
El juego debe funcionar en modo local en un 100% todas las mecánicas, físicas, etc. aunque el GamePlay se vea afectado por un factor externo en este caso producido por el servidor, en el cliente tienes que tener una forma de "Simularlo".
El juego tiene que funcionar perfecto sin estar en multijugador, luego para el multijugador solo tienes que sincronizar Inputs, posiciones y tiempo, con estos 3 valores tienes que inventar tu propio sistema de interpolación para que los escenario de diferentes clientes se vean similares.
eso ultimo no lo acabo de entender
Cita de: francoe1 date=1510773498
El juego tiene que funcionar perfecto sin estar en multijugador, luego para el multijugador solo tienes que sincronizar Inputs, posiciones y tiempo, con estos 3 valores tienes que inventar tu propio sistema de interpolación para que los escenario de diferentes clientes se vean similares.
Primero programa todo el juego de manera "OFFLINE" -
Trata de que cada controlador se dependiente del superior, por ejemplo si en tu GamePlay con la Tecla W aceleras entonces haz en tu controlador de vehiculo una funcion Acelerar, y otra para doblar, o incluso unir y hacer una sola función, pero supongamos que hiciste todo separado.
public class VehicleController : MonoBehaviour
{
public void Acelerate(float value){}
public void Brake(){}
public void HandBrake(){}
public void Turn(float angle){}
}
Ahora para que esto trabaje de manera "Online" deberias sincronizar los inputs de todos los jugadores más la posición del auto. Para una predicción mucha más precisa podrias sincronizar dirección y velocidad.
public class PlayerNetwork : NetworkBehaviour
{
public VehicleController Controller;
private void Update()
{
if(islocal)
UpdateInput();
}
private void UpdateInput()
{
float dir = Inpt....
float aceleration ...
Controller.Acelerate(aceleration);
Controller.Turn(dir);
Cmd_SendIn***ndPosition(dir, aceleration, Controller.transform.position, Controller.trasnform.rotation);
}
[Command]
private void Cmd_SendIn***ndPosition(float dir, float aceleration ...)
{
Rpc_ReceiverIn***ndPosition(dir, aceleration);
}
[ClientRPC]
private void Rpc_ReceiverIn***ndPosition(float dir, float aceleration ...)
{
Controller.Acelerate(aceleration);
Controller.Turn(dir);
}
}
De esta manera podrias hacerlo, logicamente falta muchisimo para que funcione pero esa es la idea principal.
entonces como los sincronizo??
entiendo lo que me explicas pero ¿como sincronizo los inputs y todo??
En el ejemplo ya esta como sincronizar los Inputs.
Si vas a jugar en Modo Online el vehiculo es controlado por PlayerNetwork - Si vas a jugar en modo local creas un controlador nuevo
Lo que quieres hacer se hace con UNET muy fácil hay un tutoriales en video.
https://unity3d.com/es/learn/tutorials/s/multiplayer-networking?_ga=2.35452066.2078746215.1510789047-1078449187.1493931736 (https://unity3d.com/es/learn/tutorials/s/multiplayer-networking?_ga=2.35452066.2078746215.1510789047-1078449187.1493931736)
No trates de hacer todo desde 0, aprovecha las herramientas que te brinda unity y así vas a ahorrar tiempo.
pero si mi problema es que al usa el network y networking no funciona nada
Por eso te digo mira el tutorial, hay te explican todo muy muy bien, mejor de lo que puedo hacer yo, sin embargo es muy probable que tu problema no sea el código, sino que no agregaste los scripts de unet a tus GameObject.
Solo los GameObject con el script NetworkIdentity pueden ejecutar scripts de multiplayer.
El tutorial lo haces en 30min o menos es muy recomendado.
vale ya lo tengo, pero al hacer un prefab de mi coche, se dobla en el eje x y no se como soluccionarlo
vale ya esta
una pregunta, tengo scipts hechos de puntuacion, pero al ponerle los scripts a las porterias no va el script
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
public class puntuacion : NetworkBehaviour {
public static int azul = 0;
public Text Azul;
// Use this for initialization
void Start () {
Azul.text = "Azul: " + puntuacion.azul;
}
void OnTriggerEnter(){
puntuacion.azul++;
Azul.text = "Azul: " + puntuacion.azul;
}
}
Eso nunca va a funcionar NetworkBehaviour no hace magia, tenes que aprender primero a diseñar tu juego de forma local luego intenta el networking -
Te paso a explicar -
Si por ejemplo tu juego es de fútbol entonces el balón y los jugadores son administrados por el servidor, en particular estos juegos tienen un nivel de sincronización muy complejo para que ambos clientes se sientan comodos
Si tu juego va a ser de máximo dos jugadores entonces tenes 2 capas Servidor y Cliente, en el servidor se aloja toda la lógica del juego y los atributos, por ejemplo para patear la pelota -
Network.sendCommand("shot_ball");
Cuando el servidor recibe este comando hace que X jugador patee el balón tienen el el control absoluto del juego.
Por eso este script está mal, en principio se ejecuta de manera normal, tendría que ver como esta configurado el NetworkIdentity, pero de ninguna manera funcionaria .
UNET no es un sistema para armar juegos multijugador como si fuera mágico, simplemente nos facilita el intercambio de paquetes y nos brinda servicios como Relay, Server, migration... etc, pero lógicamente todo esto es un mundo muy avanzado, tu limite no tendría que ser el lenguaje de programación.
Haz los tutoriales de UNET y aprende C# con mas calma y pronto podras hacer lo que te propongas.
entonces como lo hago para que funcione, en principio sin online funciona
una cosilla porfavor respondanmela:
es que tendo 2 spawns el el juego y uno mira al lado opuesto que el otro (tipo rocket leage) pero el coche siempre va a moverse hacia delante y yo quiero que se mueva con respecto a donde mira.
no se si me entienden pero si no es asi ayudarme porfavor
Cita de: zopas tv date=1511351287una cosilla porfavor respondanmela:
es que tendo 2 spawns el el juego y uno mira al lado opuesto que el otro (tipo rocket leage) pero el coche siempre va a moverse hacia delante y yo quiero que se mueva con respecto a donde mira.
no se si me entienden pero si no es asi ayudarme porfavor
Por el problema creería que estás utilizando Rigidbody y no WheelCollider, para solucionar este problema deberias de aplicar la fuerza en el eje Z relativo a la rotación, para facilitar este calculo, en el Transform tenes una propiedad llamada forward que hace el trabajo de sacar la dirección en base a la rotación.
Para entender las direcciones no es muy complicado, tienes que estudiar si aun no lo sabes sobre vectores. Link - Estudio (https://neetescuela.org/explicacion-de-vectores/)
para solucionar puntualmente el problema deberias compartir el código.
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class movimiento : NetworkBehaviour {
public float VelocidadNormal = 15f;
public GameObject nitro;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (!isLocalPlayer) {
return;
}
float tecladoVertical = Input.GetAxisRaw ("Vertical");
float posicionZ = transform.position.z + (tecladoVertical * VelocidadNormal * Time.deltaTime);
transform.position = new Vector3 (transform.position.x, transform.position.y, posicionZ);
float tecladoHorizontal = Input.GetAxisRaw ("Horizontal");
float posicionX = transform.position.x + (tecladoHorizontal * VelocidadNormal * Time.deltaTime);
transform.position = new Vector3 (posicionX, transform.position.y, transform.position.z);
}
}
Fijate que estás aplicando al eje Z el axis vertical, por lo que está mal.
Por el código te recomiendo que aprendas a programar y a leer en la Documentación de Unity como funcionan las cosas, mira tutoriales en YT existe muchísima información.
Para resolver el problema
private Vector3 axis = Vector3.zero;
private void Update()
{
axis.x = Input.GetAxis("Horizontal");
axis.z = Input.GetAxis("Vertical");
axis = transform.TransformDirection(axis);
axis.Normalize();
transform.Translate(axis * 10 * Time.deltaTime);
axis.x = axis.z = 0;
}
entonces ese es el codigo correcto?
Cita de: zopas tv date=1511447436entonces ese es el codigo correcto?
Desconozco la lógica del juego, pero realiza lo mismo que tu codigo, lo unico que de una manera mas optima.
PD: Lo escribí desde el foro, desconozco si existe un error -
Gracias.
Dos cosillas: el online esta hecho,y quiero probarlo con un amigo, pero no nos va entonces querria saber como hacer que funcione
y otra, El script de puntuacion que pues hace un tiempo sigue sin funcionar. Le quito el networking y el networkbehaviour??
Muchas gracias a todos los que me ayudais y queria deciros que gracias por soportarme
1º Tienes que crear toda la lógica del juego en un componente si quieres llamarlo GameServer -
public class GameServer : NetworkBehaviour
{
private ClientServer ClientA, ClientB;
private void Update()
{
if(ClientA.transform.position.z > 10)
ClientA.AddScore(100);
}
public class ClientServer
{
public NetworkConnection Conn {get; private set;}
public string Name {get; private set;}
public int Score {get; private set;}
public ClientServer(NetworkConnection conn, string name)
{
Conn = conn;
Name = name;
}
public void AddScore(int value)
{
Score += value;
Conn.Send(NetworkCommand.NetMsgID, new NetworkCommand {action = "setScore", data = Score.ToString() });
}
}
}
public class NetworkCommand : MessageBase
{
public const int NetMsgID = 1001;
public string action;
public string data;
}
Esto sería simplemente el código para un lógica extremadamente simple para el servidor, con esto ya puedes sacar tus propias conclusiones -
ESCRIBO EL CODIGO BIEN INDENTADO Y SE DESACOMODA TODO CUANDO SE POSTEA -
pero si yo trabajo con los scripts de unity para el multijugador hago eso tambien??
Vale ya se eso, y ahora otra cosilla, mi jugador tiene una cámara propia, como hago para que otra cámara no la remplace?? Es decir, que cuando aparezca un jugador online no remplace a la cámara de otro jugador
hola me responden a la pregunta??
Cita de: zopas tv date=1511643240Vale ya se eso, y ahora otra cosilla, mi jugador tiene una cámara propia, como hago para que otra cámara no la remplace?? Es decir, que cuando aparezca un jugador online no remplace a la cámara de otro jugador
desactivas la camara a menos q sea la del jugador local
Cita de: zopas tv date=1511791388hola me responden a la pregunta??
No tenemos la obligación de hacerlo, creo que te di a entender que no cumples con los requisitos mínimos para lograr un juego multijugador, no sabes programar, menos aún vas a lograr completar un sistema que lógicamente es muy complejo, no seas arrogante con las peticiones -
Te invito a que pases por mi blog donde explico un poco sobre UNET es sobre una versión vieja pero no a cambiado mucho -
http://unitydoc.blogspot.com.ar/2016/02/unet-networking-primeros-pasos.html (http://unitydoc.blogspot.com.ar/2016/02/unet-networking-primeros-pasos.html)
http://unitydoc.blogspot.com.ar/2016/02/unet-networking-sistema-de-salud.html (http://unitydoc.blogspot.com.ar/2016/02/unet-networking-sistema-de-salud.html)
Cita de: francoe1 date=1511802308No tenemos la obligación de hacerlo, creo que te di a entender que no cumples con los requisitos mínimos para lograr un juego multijugador, no sabes programar, menos aún vas a lograr completar un sistema que lógicamente es muy complejo, no seas arrogante con las peticiones -
no, me entendiste mal. No queria deciroslo como obligacion, es que pensaba que no la sabrian responder por preguntar en otro post
"creo que te di a entender que no cumples con los requisitos mínimos para lograr un juego multijugador, no sabes programar, menos aún vas a lograr completar un sistema que lógicamente es muy complejo"
Por algo se empieza... mi idea es un juego local, no online con servidores, eso si que es complejo, pero como dijiste creo que usted: "mira tutoriales en YT existe muchísima información. " a si que creo que se lo que hacer con respecto a esa frase suya.
muchas gracias a todos
Cita de: Braltor date=1511797657desactivas la camara a menos q sea la del jugador local
es que se clonan los jugadores es decir, que se crean a partir de un prefab ...
Lo que @Braltor esta indicando es que desactives la cámara en los clientes no locales.
public class NetworkCamera : NetworkBehaviour
{
[SerializeField]
private Transform _cam = null;
public override void OnStartClient()
{
_cam.gameObject.SetActive(isLocalPlayer);
}
}
Esto lo tienes que añadir al componente Player .
No debes crear múltiples Network Identity para un solo jugador -
Cita de: francoe1 date=1511810801Lo que @Braltor esta indicando es que desactives la cámara en los clientes no locales.
public class NetworkCamera : NetworkBehaviour
{
[SerializeField]
private Transform _cam = null;
public override void OnStartClient()
{
_cam.gameObject.SetActive(isLocalPlayer);
}
}
Esto lo tienes que añadir al componente Player .
No debes crear múltiples Network Identity para un solo jugador -
muchas gracias, me podrias explicar que dice este codigo?? es decir, que que significa. Gracias
Y otra cosa, que pongo el el transform, es que me pide que rellene el hueco (para colocar algo)
Cita de: zopas tv date=1511880533muchas gracias, me podrias explicar que dice este codigo?? es decir, que que significa. Gracias
perdón, solo vengo a tirar una idea, y que tal si lo investigas por tu cuenta? ... bueno es entendible la clase posee varios métodos compuestos de centenares de líneas... mmm ...oh espera un momento, ahora que lo veo de cerca... ohh!! es solo un método compuesto de de una línea!
Cita de: lightbug date=1511882996perdón, solo vengo a tirar una idea, y que tal si lo investigas por tu cuenta? ... bueno es entendible la clase posee varios métodos compuestos de centenares de líneas... mmm ...oh espera un momento, ahora que lo veo de cerca... ohh!! es solo un método compuesto de de una línea!
GRACIAS ARGENTINA :) JAJAJA - QUE IRONÍA -
El código dice lo siguiente
public class NetworkCamera : NetworkBehaviour
{
[SerializeField]
private Transform _cam = null;
public override void OnStartClient()
{
_cam.gameObject.SetActive(isLocalPlayer);
}
}
Espero que te sirva :)
buenas, no me va bien el script, cuando le doy a jugar, me pone"no cameras display rendering. ayudarme porfavor"
nada mas asegurate de q la camara del jugador local este activa...
pero x lo q he leido no estas entendiendo lo q haces... programar es MAS q copiar y pegar
el codigo de francoe no me sirve aunque muchisimas gracias.
HE CREADO POR MI CUENTA UN SCRIPT DIFERENTE PERO MAS SENCILLO, lo unico es que sigue reemplazandose las camaras y no lo entiendo...
He buscado por internet pero no consigo recoger informacion.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
public class NetworkCamera : NetworkBehaviour {
public Camera cam;
void Start(){
BloquearCamara ();
}
public void BloquearCamara(){
if (isLocalPlayer) {
cam = null;
}
}
}
si pueden decirme alguna pagina que pueda obterner informacion sobre esto me seria de grata ayuda.
Gracias
muchisimas gracias... me mirare todos los tutoriales gracias
pero... no funciona
vale, he encontrado en el manual de unity, como manejar varios display, el problema es que como el prefab se clona no puedo hacer que un prefab ocupe un display diferente a otro, no se si me siguen pero suponiendo que si, podrian darme alguna soluccion, yo seguire investigando para quitar el problema
Cita de: zopas tv date=1512562988vale, he encontrado en el manual de unity, como manejar varios display, el problema es que como el prefab se clona no puedo hacer que un prefab ocupe un display diferente a otro, no se si me siguen pero suponiendo que si, podrian darme alguna soluccion, yo seguire investigando para quitar el problema
Estas planteando problemas lógico que tienen múltiples soluciones simples, el problema es que te estas limitando a preguntar y no a aprender, lamento decirte que sera muy raro que alguien venga y te de el "Codigo Magico" que pongas en tu proyecto y salga funcionando, primero porque no se puede programar algo si no se conoce el 100% del proyecto y segundo, porque al no saber programar con cualquier componente vas a cometer este tipo de errores.
Te recomiendo que aprendas usando PlayMaker para que el lenguaje no sea un obstaculo, y luego vayas aprendiendo C#
Cita de: francoe1 date=1512569974Estas planteando problemas lógico que tienen múltiples soluciones simples, el problema es que te estas limitando a preguntar y no a aprender, lamento decirte que sera muy raro que alguien venga y te de el "Codigo Magico" que pongas en tu proyecto y salga funcionando, primero porque no se puede programar algo si no se conoce el 100% del proyecto y segundo, porque al no saber programar con cualquier componente vas a cometer este tipo de errores.
Te recomiendo que aprendas usando PlayMaker para que el lenguaje no sea un obstaculo, y luego vayas aprendiendo C#
escucha, yo no quiero que me den el codigo, quiero que me ayuden sin necesidad de darme un codigo, solo que, como estoy aprendiendo os pensais que yo lo quiero facil... Pero el caso es que no. Quiero investigar y soluccionar este error por mi mismo, quiero programar un juego simple y local, como el que estoy haciendo. voy a acabar este proyecto, ya que con el y gracias a vuestra ayuda estoy aprendiendo mas que si me meto a hacer tutoriales. Como ya he dicho, quiero que me digais paginas para investigar, y de alguna manera poder aprender lo que me gusta. No todos tenemos la misma experiencia en este mundo, y por eso la gente es diferente y tiene diferentes problemas.
Espero que, si no es molestia, me faciliteis alguna pagina para investigar sobre este mundo de la programacion.
No os lo tomeis a mal. Gracias
Te explico, un videojuego no cambia su estructura de desarrollo sigue siendo un programa con entradas y salidas, si bien cada algoritmo debe ser pensado para que este lleve el menor tiempo posible se trata de seguir siempre los mismos métodos.
1º - Trata de separar y abstraer todo lo que el juego va a contener - Por ejemplo, personaje, pelota, vehiculo.
2º - Trata de programar todo esto en clases con sus metodos y propiedades
3º - Evalúa que tiene que ser realmente un componente MonoBehaviour
4º - Empieza a enlazar la lógica con los componentes de unity.
5º - Tendrás un juego en "optimas condiciones".
Para lograr todo esto primero empieza a programar cosas en consola, formateo de string, parseos, funciones, funciones lambda, linq, eventos, delegados, vas buscando cada parte en YT según tu progreso.
muchas gracias
me informo sobre todo eso y entonces que??
Cita de: zopas tv date=1512584357muchas gracias
me informo sobre todo eso y entonces que??
cuenta la leyenda q si estudias entonces sabras lo q tienes q hacer...
buena leyenda esa xD
Cita de: Braltor date=1512585878cuenta la leyenda q si estudias entonces sabras lo q tienes q hacer...
jajajaja Gracias :)
Cita de: zopas tv date=1512584357muchas gracias
me informo sobre todo eso y entonces que??
Sos un pelotudo hermano, salí de la PC y anda a jugar a la pelota, no servis para esto.
Cita de: francoe1 date=1512590369Sos un pelotudo hermano, salí de la PC y anda a jugar a la pelota, no servis para esto.
JAJAJAJjaja q entrerriano guacho que sos