Jump to content
farenhai

Multiplayer SaveGame

Recommended Posts

Pues habiendo conseguido la sincronización de la variable population resulta que se me ha ido al cuerno la función de salvado. Evidentemente, esto es un problema - no de que el código se haya trastocado (comprobado), sino del mismo Network Identity que tiene que llevar la esfera/ciudad que comentaba en el post anterior 'Networking'  ( http://www.unityspain.com/topic/35905-networking/ ) ; quitando todas las alusiones a la red, el problema desaparece y vuelve a salvar/cargar sin problema

 

Pensé que podría ser porque no estaba pasando los datos por el servidor, así que incorporé las instrucciones Command y Rpc a los void Save() y Load(), pero tras salvar y ejecutar la función      

RpcLoad(), se comporta como si no sucediera nada.

Compruebo el archivo creado y No se están salvando las variables en el archivo; crea el archivo pero no guarda las variables (diferentes kb en el archivo creado en Application.PersistantDataPath; 0 kb en este momento)

No tengo claro si es que me estoy saltando un paso del tipo dar autoridad al cliente (

  NetworkServer.SpawnWithClientAuthority(go, connectionToClient);  

en cualquier caso algunos valores que añada posteriormente deberán influir en 'population', 

siendo valores locales, asi que imagino que tendré que hacer algo así tarde temprano; no obstante, ignoro si tiene algo que ver en el caso que nos ocupa en

este momento);

 

Total, que un poco lío todo esto del networking :7_sweat_smile:

 

El siguiente script es exactamente el mismo que he estado usando antes de aplicar el Network Identity, salvo por las alusiones network añadidas (NetworkBehaviour, Cmd y prefijo en voi+ Rpc y prefijo en void). ¿Alguna idea?

 

¡¡Mil gracias!!

 

using UnityEngine;
using System.Collections;
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System;
using System.Linq;
using UnityEngine.Networking;


public class GameControl : NetworkBehaviour  {
    

    public GameObject [ ] countries;    
    public static GameControl control;

    [Serializable]
    public class PlayerCountryData 
    {
        public int population;                                       // Es una [SyncVar] en otro script llamado Country       !!!!!!!!
           }
    public PlayerCountryData pais;
 
    
    void Awake ()
    {
        if (control == null)
        {
            DontDestroyOnLoad (gameObject);
            control = this;
        }
        else if (control != this)
        {
            Destroy(gameObject);
        }
    }
    
    // Use this for initialization
    void Start ()
            {
                countries = GameObject.FindGameObjectsWithTag ("Country");
 
            }

    void Update () {
    
    }
  

    [Command]
    public void CmdSave ()                                        // Guardar datos;
    {
        BinaryFormatter bf = new BinaryFormatter ();
        
        FileStream file = File.Create (Application.persistentDataPath + "/playerInfo.dat");
        foreach (GameObject country in countries)            
        {
            //BUCLE PARA RECORRER EL ARRAY DE PAISES PARA GUARDAR SU POBLACION
            for (int i = ; i<countries.Length; i++)
            {
                PlayerCountryData pais = new PlayerCountryData ();
                //PONER EN LA VARIABLE PAIS EL CONTENIDO DE LA VARIABLE COUNTRIES PARA GUARDAR EL DATO EN EL FICHERO

pais.population = countries.GetComponent<Country>().population

pais.poblacionAdulta = countries.GetComponent<Country>().poblacionAdulta;

pais.poblacionInfantil = countries.GetComponent<Country>().poblacionInfantil;
                 // ESCRIBE EN EL FICHERO EL DATO DE LA POBLACION
                bf.Serialize( file, pais);
                //Debug.Log("Esta es la poblacion" + pais.population);
            }
        }    
        
        file.Close();
        
        Debug.Log ("Save complete!");
 
    }
    
    [ClientRpc]
    public void RpcLoad()
    {
        
        if (File.Exists (Application.persistentDataPath + "/playerInfo.dat")) {
            
            BinaryFormatter bf = new BinaryFormatter ();
            FileStream file = File.Open (Application.persistentDataPath + "/playerInfo.dat", FileMode.Open);
            
            //BUCLE PARA RECORRER EL FICHERO Y CARGAR LA POBLACION DE CADA PAIS
            for (int i = ; i<countries.Length; i++) {
                //LEE EL REGISTRO DE LA POBLACION DE CADA PAIS.
                PlayerCountryData pais = (PlayerCountryData)bf.Deserialize (file);
                
                
countries .GetComponent<Country> ().population = pais.population;
countries.GetComponent<Country>().poblacionAdulta = pais.poblacionAdulta;    

countries.GetComponent<Country>().poblacionInfantil = pais.poblacionInfantil;

 


                //PASA EL VALOR DE LA POBLACION REGISGRADA EN EL FICHERO A LA POBLACION DE CADA PAIS.

 
                Debug.Log (pais.population);
            
            }
            
            //CIERRA EL FICHERO
            file.Close();
            Debug.Log ("Load Complete!");
        }
        
        if (!File.Exists (Application.persistentDataPath + "/playerInfo.dat"))
        {
            Debug.Log ("ERROR");
        }
    }
} 

 

Edited by farenhai

Share this post


Link to post
Share on other sites

Es complicado sí, supongo que querrás guardar los datos en el servidor, también deberás cargarlos en el servidor y luego pasarlos al cliente, lo que estás haciendo con el Rpc es llamar en el cliente la función "Load" pero en el cliente no debe haber archivos (o sí?). Por otra parte, no sé si te esté dando algún error y no te estés dando cuenta, lo digo porque en la funciones de carga y guardado que tienes haces un bucle pero intentas acceder al componente del array (?). Lo que yo haría es primero intentar que el servidor sea quien se encargue de guardar los datos (por ejemplo cuando se actualice una población), no mediante un atributo Command sino con un Server, y asegurarme de que se guardan, suena fácil pero es laborioso, segundo cargar los datos y los mandarlos al cliente con un Rpc, pero los cargo en el servidor antes de llamar al Rpc ya que lo que se ejecute en el Rpc será en el cliente.

Esta vez no hay código, es bastante más complejo, tienes que tener en cuenta quién está guardando los datos y sobre todo quién los está cargando, o sino cada vez que cargues se cargarán los datos en todos los clientes. No sé la idea de juego que tengas, pero para guardar los datos te aconsejo usar una base de datos y JSON. Suerte!!

Share this post


Link to post
Share on other sites
hace 19 horas, juanma_teso said:

Es complicado sí, supongo que querrás guardar los datos en el servidor, también deberás cargarlos en el servidor y luego pasarlos al cliente, lo que estás haciendo con el Rpc es llamar en el cliente la función "Load" pero en el cliente no debe haber archivos (o sí?). Por otra parte, no sé si te esté dando algún error y no te estés dando cuenta, lo digo porque en la funciones de carga y guardado que tienes haces un bucle pero intentas acceder al componente del array (?). Lo que yo haría es primero intentar que el servidor sea quien se encargue de guardar los datos (por ejemplo cuando se actualice una población), no mediante un atributo Command sino con un Server, y asegurarme de que se guardan, suena fácil pero es laborioso, segundo cargar los datos y los mandarlos al cliente con un Rpc, pero los cargo en el servidor antes de llamar al Rpc ya que lo que se ejecute en el Rpc será en el cliente.

Esta vez no hay código, es bastante más complejo, tienes que tener en cuenta quién está guardando los datos y sobre todo quién los está cargando, o sino cada vez que cargues se cargarán los datos en todos los clientes. No sé la idea de juego que tengas, pero para guardar los datos te aconsejo usar una base de datos y JSON. Suerte!!

¡Hola, Juanma! Pues precisamente, sí, me has comprendido (creo) bastante bien. La idea que tenía era que el jugador-Host guardara la  partida. No obstante, como en las ciudades hay variables que pertenecen en exclusiva a cada uno de los jugadores (véase, por ejemplo: influencia, dinero adeudado, etcétera), que enviaran todos los clientes la información y que la guardara el jugador Host.

Efectivamente, intento al componente del array: Todos los "countries" tienen esas características (evidentemente, muchas más; las he omitido por no aburrir).

 

Seguiré las pistas que me has dado para ver qué puedo encontrar.

 

¡Muchas gracias y un saludo!

 

 

Share this post


Link to post
Share on other sites

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...