Ayuda con UE4: Problema replicando movimiento en el cliente

berbe

Buenas, no he visto mucho desarrollador de unreal posteando pero quiero tentar a la suerte. Quiza alguien me pueda echar un cable ya que me estoy volviendo loco.

El tema es que consegui hacer un tipo de manejo de mi personaje CON BLUEPRINTS que se acerca mucho a lo que quisiera ofrecer, aun asi soy consciente de que no estan pulidos ni la velocidad de andar ni de esprintar ademas de que al girar a la izquierda, la animacion que hice da un pequeño salto que no deberia hacer. Aun asi, este es mi objetivo que muestro con este enlace de Youtube:

El codigo que utilice para conseguirlo y sobre el que quiero centrarme estan en el Event Tick de CharacterBP y en el InputMovementForward y Right, los cuales pondre en dos screenshots.

El problema viene a la hora de replicarlo en red, ya que funciona para el servidor o hosting pero no para el cliente. Es decir, el cliente no ve nada de movimiento en si mismo ni en el otro jugador. El server ve su propio movimiento pero no ve nada en el cliente.

Creo, habria que replicar las variables de ForwardSpeed y TurnSpeed, no se si tambien habria que replicar AimForwardSpeed y AimTurnSpeed aunque lo hice en otra version posterior. Tambien hice la logica de si tengo autoridad, Multicast y Run on Server con el tocho del Event Tick. Parecia replicar los movimientos pero se desincronizaba el movimiento con el servidor. Al final, he vuelto para atras, antes de aplicar ningun cambio que he comentado y quiero ver que me puede ofrecer la ayuda externa.

Lo que me pregunto principalmente en estos momentos es, si mi cliente tiene un ordenador del año de la polka y va a 10 fps, al tener toda la logica enlazada al Event Tick y a Get World Delta Seconds, se va todo el movimiento literalmente al retrete. Que opciones alternativas hay para mudar todo esto a algo que no dependa de los FPS que consiga el ordenador para que sea inocuo el movimiento??

Este gigantesco problema puede suponerme tirar mas de medio mes a la basura, necesito ayuda!!

totespare

Echate un ojo a esto:

https://answers.unrealengine.com/questions/52111/problems-with-physics-depending-on-fps.html

Tienes que tener activado el substepping y teóricamente las físicas en Unreal no tienen que multiplicarse por un deltaTime (se ejecutan de forma independiente) como si fuera Unity en el Update (a diferencia del FixedUpdate), por lo que intenta ver si tienes multiplicados algunos cálculos por el delta, y a ver si te funciona así.

1 1 respuesta
berbe

#2 estoy probandolo, a ver que saco en claro.
en teoria dejo el event tick y el getworlddeltaseconds tal cual y el motor se encargara de gestionarlo independientemente con el substepping habilitado, no?
gracias por la sugerencia.

1 respuesta
totespare

#3 esa es la idea, si. Ya me contarás si funciona o no!

berbe

Pues por un lado soluciona el problema que tenia con el client pero ahora por algun motivo no funciona bien el que hace de server!! Voy a seguir testeando. Aun asi, lo importante es que parece corregir el problema que decia de los ticks... eso si, a costa de una caida de FPS de 80-90 a 60-70 en el ordenador potente. Pero me gusta haber corregido ese problema, voy a ver si soluciono el nuevo.

Si conocias substepping, como podria hacer que el proceso no sea tan costoso y que el bajon de fps no sea tan grande?
Muchas gracias!!

1 respuesta
totespare

#5 lo único que podrías hacer es aumentar el tiempo del substepping un poco y bajar en 1 o 2 como mucho los substeps que tengas. Eso aliviará un poco, pero también te la juegas a que las físicas se vayan a la mierda más fácilmente (porque hace menos pasadas para calcular). Ve probando y trastea con ello hasta que llegues a un equilibrio que te mole. En el server qué te pasa? El server hace de cliente también, o es dedicado?

berbe

Perdona pero estaba probando cosas. Funciona en el cliente la rotacion suave si ando, pero si esprinto, se acelera y no llega a hacer el giro que hace el servidor. Luego por otro lado, el que hace de servidor funciona bien pero en el cliente va super lagueado. Si corro con el del servidor, puedo llegar a verle corriendo hacia un lugar y al rato aparecer al lado mio.

El server no es dedicado, es hosting. Aun no me he centrado en el tema de los servidores dedicados, algo que seguro me dara problemas tambien.

  • Te parece muy absurdo hacer un Multicast del EventTick?
  • Como replicarias esos movimientos en internet? Quiza hay alguna manera mas sencilla de hacerlo?

He dejado al final ambos screenshots de la siguiente manera

1 respuesta
totespare

#7 por hosting a qué te refieres? A que tienes un servidor en la nube y ahí creado el servidor de tu juego? Porque si eso es así, eso es un servidor dedicado xD. Si por el contrario uno de los clientes hace de servidor a su vez, entonces no. Voy a suponer que uno de tus clientes hace de servidor también, porque creo que es lo que he entendido xD.

La segunda foto se ve super mal, por cierto. No tengo mucho tiempo para pararme a leer los blueprints, pero parece que lo que estás haciendo es replicando el los valores que generan la posición en cada frame, en lugar de replicar la posición final, no? O sea, la idea, para hacerlo sencillo, sería que cada cliente calcule su posición y la envíe al servidor, y este la replique en los demás clientes. Lo mismo para la rotación, y si quieres meter animaciones, tendras que pasarle los valores de las variables que estés usando para setear esas animaciones.

En resumen, replicar la posición, rotación y estado de animaciones, y no los valores de velocidad etc. para que cada cliente calcule las posiciones.

PD: esto no es la mejor de las prácticas, ya que es susceptible de ser hackeado, pero no creo que tu juego de momento vaya a tener que mirar por los hacks xd.

Échale un ojo a esto también: https://docs.unrealengine.com/en-US/Gameplay/Networking/Actors/Properties

1 respuesta
berbe

#8 Si, lo has entendido bien. Me referia a que un cliente haga de servidor y se vayan añadiendo a el.
Lo del server dedicado es algo que si o si necesitare ocuparme tarde o temprano pero tampoco queria empezar de una manera tan hardcore.

Lo que hago es un multicast continuo para que se sepa cada posicion en el giro y asi replicar el giro suavizado del video, en vez de dejar solo la posicion. El tema es que para el suavizado, utilizo Interp y para Interp parece ser que necesito algo que este en bucle lanzandolo a todos. La gente suele usar EventTicks pero el problema es que mi ordenador mierder que es lo que uso para testear el juego online y que lleva 6 años sin apagarse y con una GTX650, su EventTick es chungo y no hace el giro suavizado. Quiza con otro MSI no tenga ningun problema pero bueno, asi corrijo y avanzo pensando en los que tienen un ordena malo.

Voy a replantearlo de cero porque gran parte se puede hacer con el blendspace dentro del BP de animacion y ahi ya se replica y hace los calculos automaticamente en vez de hacerlo fuera por mi cuenta. Voy a ver que pasa.

1
DaveTS

Crea el char en el server y replícalo, UE4 viene con todos esos problemas que tienes solucionados de serie.

Un saludo.

berbe

Al final quite absolutamente todo lo que habia en el EventTick y he mejorado los giros de otra manera pero sin el suavizado.
Si al final vuelvo a meter las fInterp, la opcion de usar Timelines y Timers me parece que sera mejor.
Gracias.

1 respuesta
totespare

#11 genial, ya nos contarás tus avances. Si te animas, puedes crear un hilo del desarrollo de tu juego!

berbe

Queria adelantar cosas, tener mas videos que mostrar y tal pero viendo que la encuesta ha tenido tantos votos quiza lo cree ya esta semana directamente y lo voy actualizando con lo q sea sobre la marcha.

Ahora estoy liado con el tema de replicar las velocidades de andar y correr.
Es un puto infierno, siempre pienso q esta rulando todo y cuando te metes a testearlo profundamente con mi ordena mierdero de aqui al lado, te das cuenta q falla mas de lo q crees.