Buenas a todos, antes de nada decir que estoy empezando en unity, mi problema es el siguiente, tengo un ascensor con un script muy básico con una función(void) que lo mueve y esta es llamada desde otro script, todo esto función bien, el problema viene cuando entran 2 personas al servidor (hecho con los recursos de unity) lo que pasa es que cuando el que crea el servidor pulsa para subir el ascensor todo funciona perfecto sin embargo cuando lo hace el otro jugador solo funciona en su ordenador, el movimiento del ascensor no se ve reflejado en los otros jugadores.
¿Porque puede ser? Gracias de antemano.
Todo es cuestión de organizar bien, todo lo que quieras que esté sincronizado debe usar el networking, es decir el script del ascensor debe heredar de NetworkBehaviour.
Después debes conocer los atributos [Server], [Command] y [ClienRpc], para que el ascensor se mueva en todos los clientes debe ser el servidor el que llame la función "mover", para esto el cliente debe usar su player para llamar la función del ascensor desde el servidor, es bastante confuso al principio, pero intenta hacerte una idea:
jugador (cliente) -> Command -> jugador (servidor) -> ascensor (servidor) -> ClientRpc -> ascensor(local).
También puedes hacerlo llamando la función en el ascensor en el cliente y sea éste quien se comunique con el servidor, de cualquier manera la complicación está en las referencias pues la inicialización con el networking no se limita al Awake y al Start.
Cita de: juanma_teso date=1535739350Todo es cuestión de organizar bien, todo lo que quieras que esté sincronizado debe usar el networking, es decir el script del ascensor debe heredar de NetworkBehaviour.
Después debes conocer los atributos [Server], [Command] y [ClienRpc], para que el ascensor se mueva en todos los clientes debe ser el servidor el que llame la función "mover", para esto el cliente debe usar su player para llamar la función del ascensor desde el servidor, es bastante confuso al principio, pero intenta hacerte una idea:
jugador (cliente) -> Command -> jugador (servidor) -> ascensor (servidor) -> ClientRpc -> ascensor(local).
También puedes hacerlo llamando la función en el ascensor en el cliente y sea éste quien se comunique con el servidor, de cualquier manera la complicación está en las referencias pues la inicialización con el networking no se limita al Awake y al Start.
No necesariamente tienes que heredar desde NetworkBehaviour, tambien puedes identificar cada asensor con un ID unico en la escena, y luego que el "boton" que activa el le solicita la acción al servidor, imaginemos el comando como.
useobject=IDDelAsensor => useobject=100
[/quote]
El servidor interpreta el comando aplica su logica y le envia todos los clientes el mismo comando, cuando el cliente recibe este comando activa el asensor con x id.
Gracias por contestar!! me pondré ha investigar como se hace lo que decís.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
public class Ascensor : NetworkBehaviour
{
public bool NetActive = false;
public GameObject moveTo;
public Button boton;
private Vector3 startPos;
private Vector3 endPos;
public float velocidad = 5;
void Start()
{
startPos = transform.position;
endPos = moveTo.transform.position;
}
public void OnTriggerStay(Collider other)
{
if (other.gameObject.tag == "Player")
{
boton.onClick.AddListener(active);
}
if (other.gameObject.tag == "Player" && Input.GetKeyDown(KeyCode.E))
{
active();
}
}
public void active()
{
if (NetActive)
{
NetActive = false;
}
else
{
NetActive = true;
}
}
void Update()
{
if (NetActive)
{
transform.position = Vector3.MoveTowards(transform.position, endPos,