Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - farenhai

#1
General (Antiguo) / Sobre Minecraft y su optimización
Septiembre 05, 2016, 01:39:26 PM
¡Hola a todos!
 
 Seguramente este tema (que me sale por curiosidad, no porque esté en ningún proyecto de tipo parecido) me venga un poco demasiado grande, pero tengo curiosidad. A menudo leo muchos comentarios que hablan de una pobre optimización de Minecraft. En líneas generales yo no suelo tener problemas  con el juego (quadcore a 2,66 ; 4gb RAM, Quadro Fx1800) y los problemas que a veces tengo son dependientes del servidor (he estado en tres, sólo en uno estoy teniendo problemillas - y asumo que, al menos, no todo el problema es mío). El juego, no obstante, corre bien en ordenadores sensiblemente inferiores, y aún así, se habla de esa mala optimización. Me sorprende pq, a fin de cuentas, a nivel polígonos debería ser bastante bajo el consumo de recursos, puesto que todos los mesh son (o entiendo que son) cubos. Los comentarios hablan muchas veces de un pésimo código por parte de Notch, pero salvo que sea un adicto a meter todo en la función Update () (cosa que dudo pq entiendo que no hay tantos elementos que requieran el chequeo a cada frame) no se me ocurre en qué se pueda justificar la mala optimización de la que se habla (aunque estoy seguro de que puede haber mil motivos).
 
¿Alguno comparte la idea de que el juego está mal optimizado? ¿Por qué? ¿Alguno conoce los códigos? (no he investigado, pero asumo que es código cerrado y por tanto nadie conoce realmente la manera de promación de Mojang, salvo Mojang) ¿Qué ideas/reflexiones sacáis de todo esto? ¿Tienen razón los comentarios acusadores, o son solo "haters" que no saben bien de qué hablan?  Si sospecháis algunas prácticas dignas de ser evitadas, ¿cuáles serían? ¿De qué otro modo lo haríais?
 
 
 
¡Gracias, y un saludo a todos!
#2
Buenas!
 
 
 
Una pregunta que ya me temo la respuesta porque no lo he visto nunca... ¿Existe alguna manera de COLOREAR/MARCAR variables en el inspector? Tengo mogollón en un mismo script, y aunque los nombres son bastante descriptivos de por sí, a veces se hace complicado moverse entre tanta variable...
 
 
 
Imagino que ni de coña, pero por si acaso....
 
 
 
¡Gracias!
#3
General (Antiguo) / Multiplayer SaveGame
Mayo 27, 2016, 03:01:04 PM
Pues habiendo conseguido la sincronización de la variable po***tion 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 'po***tion',

 
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
 
 
 
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 po***tion;                                       // 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.po***tion = countries.GetComponent<Country>().po***tion
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.po***tion);
            }
        }    
       
        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> ().po***tion = pais.po***tion;
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.po***tion);
           
            }
           
            //CIERRA EL FICHERO
            file.Close();
            Debug.Log ("Load Complete!");
        }
       
        if (!File.Exists (Application.persistentDataPath + "/playerInfo.dat"))
        {
            Debug.Log ("ERROR");
        }
    }
}

 
 
#4
General (Antiguo) / Networking
Mayo 24, 2016, 01:01:09 PM
Hola, amigos y gurús de UnitySpain!
 
 
 
Os explico la situación: tengo varios GO (esferas) utilizadas como representación de ciudades. Cada una de estas ciudades tienen que compartir algunas variables como "población" a través de la red para que sean exactamente los mismo valores para todos los jugadores (estos variables se alteran con ayuda de variables Random). El problema es que, a la hora de hacer el networking, el valor de "población sale diferente en el host y en el cliente (segunda instancia). 
 
 
 
Había pensado como solución que sea el Pc del Host el que haga los cálculos de las variables y de ahí se derive al resto de clientes, pero... ¿cómo hago? He estado viendo la documentación (https://unity3d.com/learn/tutorials/topics/multiplayer-networking/adding-multiplayer-shooting?playlist=29690  y  he seguido video ( https://www.youtube.com/watch?v=JlKf0h0K5PU   ; había empezado usando Photon (algunos videos adicionales junto con un tutorial que ahora no vienen al caso) , pero lo he descartado temporalmente porque me da  la sensación de que tampoco facilita tanto las cosas  -  si me equivoco, please, que alguien me corrija-). El caso es que todos los ejemplos que veo van orientados a la actualización de datos desde el cliente al servidor, mientras que yo lo que necesito es que sólo haya una instancia de esas variables que se distribuya desde el servidor a los clientes...  (si estoy errado, please, nuevemente, corrijan  ).
 
 
 
Por tanto, así cómo normalmente en la documentación y los tutoriales hacen uso de if(isLocalPlayer) y el uso de [Command] para identifical al jugador local, la dificultad mayor que tengo (si hasta este punto voy bien dirigido) es que no sé cómo decir  "if(isHost;  isServer , tal vez???? - No parece funcionar...) ... ¿Cómo puedo hacer para identificar al host?
 
 
 
Please!!! ¿Ayuda? ¿Documentación adicional? ¿"Cogotazo" por no enterarme de nada?    Me siento cual octópodo en un estacionamiento automovilístico...
 
 
 
¡Gracias!
#5
General (Antiguo) / ¿Alguien Usa Photon?
Mayo 21, 2016, 03:12:50 PM
¡Hola a todos, maestros y gurús de UnitySpain!
 
Resulta que estoy con la parte multijugador del juego con ayuda de usando Photon (https://www.photonengine.com/en-US/Photon)  . 
 
 
 
¿Alguien lo conoce? Tengo la duda de si, para que se compartan los datos de un jugador a otro, el player (gameobject) tiene que ser NECESARIAMENTE instanciado a través de la función PhotonNetwork.Instantiate
 
 
 
Tengo varios gameobjects con variables tipo int, bool, etc... (no son variables de posicion Vector3 o transform) el caso es que esas variables necesito que sean LAS MISMAS para cada jugador (y sean visibles, claro está)...Por tanto... es necesario que el objeto sea convertido en prefab para luego instanciarlo?
 
 
 
Gracias!!!
#6
Buenas a todos otra vez! aki me hallo "empollándome" el asuntillo de la serialización para persistencia de datos... (aún llevo poco tiempo, de ahí mi ignorancia en todo este tema)Después haberme pasado por el hilo reciente: http://unityspain.com/topic/35649-como-guardar-las-variables-del-juego/y de haberme hecho el live training: https://www.youtube.com/watch?v=J6FfcJpbPXE , así cómo haber leído alguna que otra página de referencia como la propia de Microsoft... he conseguido replicar el ejercicio del live training y repetirlo en un proyecto de prueba a parte sin problemas. La mécanica no parece especialmente complicada en un ejercicio básico, pero a la hora de aplicarlo a un proyecto de verdad... se ve desesperante hasta la muerte..?? ¡Gracias! PD:  la información que manejo entre los scripts son esencialmente números, boleanos y texto
#7
General (Antiguo) / Comportamiento de los UI
Abril 11, 2016, 08:09:38 PM
¡Hola! Veréis: estoy absolutamente desquiciado con el comportamiento de ubicación de botones y demás historias.  Resulta que tengo un menú y un submenú. Lo que hago es cambiarlos de posición a golpe de click en el botón. El problema es que la línea que define la reubicación del submenú me da dos resultados diferentes según la coloque en la función Update o en la función dedicada (la que se activa con el botón), siendo la primera la que arroja el resultado adecuado.ahí va el código de marras. using UnityEngine;
using System.Collections;
using UnityEngine.UI;public class Menu : MonoBehaviour {     public GameObject centerScreen;
    public GameObject subMenu;
    public GameObject  subMenuOriginal;
    public Transform subMenuNew;
    public GameObject altMenu;
    public GameObject altMenuNew;
     void Start ()
    {
        altMenu.transform.position = subMenuNew.transform.position;     }    void Update ()
    {
        altMenu.transform.position = altMenuNew.transform.position;
    }    public void HideMainMenu()
            {            
//        altMenuNew.transform.position = altMenu.transform.position;
    
        centerScreen.transform.position = subMenu.transform.position;
        subMenu.transform.position = subMenuNew.transform.position;
//                altMenu.transform.position = altMenuNew.transform.position;
        }
    public void CloseMainMenu ()
    {
        subMenu.transform.position = centerScreen.transform.position;
        altMenu.transform.position = subMenuNew.transform.position;
        subMenuNew.transform.position = altMenuNew.transform.position;
        }
    }donde altMenu es el menu (conjunto de botones ) a desplazar y altMenuNew es un GO vacío que utilizo como refencia de destino (lugar de reubicación).Siendo  el resultado de  "altMenu.transform.position = altMenuNew.transform.position; " diferentes en void Update() y void CloseMainMenu() , no acabo de hallar explicación a esto y me está volviendo loco. Intuyo que la respuesta podría (¿Qué, si no?) estar relacionada con la lectura a cada frame de Update() , puesto que entiendo(en mi supina ignorancia) que es la única diferencia entre las dos funciones...(¿Estoy equivocado?) El caso es que necesito que esta línea no se esté ejecutando contínuamente: no es una función principal, sino puntual (pero que debe estar disponible, evidentemente). ¿Alguien que me pueda ayudar  entender el por qué de esta doble respuesta? ¿Qué está pasando? ¡Muchas gracias!    
#8
A ver cómo explico esto (entiendo que será más fácil de lo que pienso, pero...) Tengo un grupo de arrays que me interesa tener relacionados entre sí (para simplificar lo dejaré en 2 variables)-string Variable 1 - int Variable 2Necesito hallar los números máximos de Variable 2. Usaré el índice de Variable2.Max para seleccionar el string de Variable1. (las variables van pareadas, vaya)De manera que hago un array dentro de la clase (no sé si es ésta la mejor manera de expresarlo, pero bueno...) y esto es lo que me queda:  using System.Collections;using System.Linq;[System.Serializable]public class MyPairs{public string variable1;public int variable2;} public class Script1 : Monobehaviour{public MyPairs [ ] objetoArray;} Hasta aquí, todo genial: puedo desplegar tantos array como quiera y es perfecto (creo) para lo que intento hacer. Con Debug.Log (objetoArray.variable1);  puedo determinar sin problemas el valor de cada una de las dos variables. Genial. El problema es que no encuentro la manera de aplicar la función Linq.Max a la variable 2, esto es: encontrar el valor máximo de variable 2 dentro de todo el array. La pregunta es: ¿Cómo lo hago? He escrito y buscado unas cuantas combinaciones, pero no consigo hacer que funcione... Lo que, en mi pobre entendimiento, sería medio-lógico:objetoArray.variable2.Max , pero Unity no reconoce esa construcción (ya había probado el .Max en algún que un array común)... ¿¿¿¿Ayuda, please???? Mil gracias!!
#9
General (Antiguo) / Variable única, múltiples GO
Febrero 03, 2016, 04:11:53 PM
Buenas!pregunta tonta de novato: Intento crear un menú sencillo de compra de objetos. El objetivo es evitar que se compre el mismo objeto dos veces (error, accidente).De esta manera, había pensado en hacer un bool que, simplemente, se activara "True" cuando el objeto había sido comprado.El problema es que, claro, la variable es única y se pondrá "True" con independencia del objeto que esté comprando, en lugar de utilizar la misma variable con valor independiente para cada objeto.¿Qué puedo hacer? Imagino que la solución es más que fácil, pero encuentro la manera...  Adjunto archivos del proyecto (es proyecto de prueba, con sólo dos scripts y tres botones) para que podáis verlo cómodamente. ¡Gracias!menu compra_prueba.7z
#10
Buenas... es sólo una pequeña duda... ¿Las "Coroutines" son específicas de Unity o existen en C# en general? Lo pregunto porque al buscar en Google todo me remite a Unity, y es que me parecen de una utilidad extrema... no tengo planes todavía de dar el salto a otro tipo de aplicaciones (soy novato y prefiero centrarme todavía en Unity), pero me da curiosidad, porque el gusanillo de intentar otro tipo de proyectos que no sean solo juegos me resulta cada día más atractivo...  
#11
¡Buenas a todos!
 
 
 
¡Menudo lío! Intento hacer una lista de int con un dato de varios prefab que tendrán -obviamente- sus propios valores.
 
 
 
En el script 1 (prefabs) tengo la variable:
 



   
      public int armas;
   

[/quote]
 
(sin más complicaciones).
 
En el script 2, que es el que debe devolver el número de armas totales:
 

    void Start () {
        List<int> myCollection = new List<int>();
 
    GameObject [] armerías = GameObject.FindGameObjectsWithTag("Armería");
    armas = world.GetComponent<Country>().armas;
foreach (GameObject armas in armerías )
                {
            myCollection.Add (armas);
                 }
 
int armasTotales= myCollection.Sum();
Debug.Log (myCollection[] + "/" + myCollection[1] );
Debug.Log (armasTotales);
}

 
 
 
El caso es que myCollection[0] y myCollection[1] me salen con el mismo valor, cuando deberían mostrar valores int diferentes en el debug.
 
 
 
Asumo -igual me equivoco- que lo que sucede es que está tomando como referencia el último GameObject que encontró y lo repite tantas veces como (armerías.Length) Siendo eso, precisamente, lo que intentaba resolver a partir del foreach,
 
 
 
¿Cómo hago, pues, para que la lista integre los diferentes valores (y no dé a todos los componentes el mismo valor?
 
 
 
Como siempre, ¡mil gracias!
#12
Buenas:
 
Tengo varios scripts con números de población (scripts clonados - prefabs) de diferentes paises. Intento recuperarlos todos en un script central.
 



   
       
   
   
      // creo el arrayGameObject [] worldPo*** = GameObject.FindGameObjectsWithTag("Country");
   
   
      // y ahora que? intento lo siguiente;
   
   
      po***tion = worldPo***.GetComponent<Country>();
   
   
       
   

[/quote]
 
 
 
pero cuando intento hacer un foreach accediendo a la variable que quiero de "Country" no me deja hacer-lo que entiendo que debería ser
 
algo parecido a:
 



   
       foreach (Country (po***tion.po***tion) in worldPo***) { }
   

[/quote]
 
 
 
evidentemenente, si po***tion = GetComponent<Country>(); retorna un null reference... estoy un poco perdido...
 
normalmente no tengo problemas para acceder a la variable de un solo script, pero esto de acceder a una variable de un script de GO no determinado (o determinado a traves de un .FindGameObjectsWithTag, según se vea ) me tiene un poco despistado. Llevo tres días buscando como resolver el enigma, pero sin resultados...
 
 
 
¿Qué puedo hacer (o dónde puedo encontrar información para resolver algo tan específico)?
 
 
 
Mil gracias!!
 
 
 
PD: ya podéis ir preparando la factura, que a día de hoy sois mis mejores profesores! Un saludazo y reitero mi agradecimiento!!!
#13
Hola!
 
Intento crear una instrucción que diga que cada vez que
 
            year ++
 
haga "x".
 
El problema del asunto es que no me sirve hacer un WaitForSeconds () a través de una corrutina, porque la variable no puede depender del tiempo (podría hacer un cálculo de cuánto tiempo se supone que tardaría en realizarse la función, pero no me parece la solución más adecuada), sino que es CADA VEZ QUE SE DA EL INCREMENTO (++, en ese frame) cuando quiero que haga la operación "x". 
 
 
Para clarificar un poco el asunto, intento que cada vez que se sucede un nuevo año (pasa de 2015 a 2016, por ejemplo) que haga tal o cual instrucción, para así evitar que cálculos innecesarios a cada frame.
 
 
¿Por dónde debería tirar? ¿Debería hacer un array con librerías System.Linq y hacer que haga una itinerancia a través de ese array? (ni por
asomo controlo Linq, pero he leído que funciona de manera más eficiente que los array genéricos y estoy -obviamente- dispuesto a aprender a manejarlos, aunque no estoy seguro de si es el camino correcto para este problemilla en concreto)
 
 
Mil gracias!!!
 
 
#14
Buenas, explico mi problema.
 
Resulta que estoy haciendo prefabs de botones, porque en el juego que estoy haciendo voy a necesitar como medio millar xD
 
El caso es que, después de implementar a un cubo (cuyo Mesh desactivo para dejar sólo visible el botón) el siguiente código
 

using UnityEngine;
using System.Collections;
 
public class boton_rotacionMenu : MonoBehaviour {
 
public GameObject button;
 
    public Texture boton;
 
    // Use this for initialization
    void Start () {
    
    }
    
    // Update is called once per frame
    void Update () {
  
     }
 
            void OnGUI ()
            {
        if (!boton) {
    Debug.LogError("Please assign a texture on the inspector");
    
}
        if (GUI.Button(new Rect(button.transform.position.x, button.transform.localPosition.z, button.transform.localScale.x, button.transform.localScale.z), boton))
                {
    Debug.Log("Clicked the button with an image");
                }
 }
}

 
resulta que, mientras que el eje X funciona casi perfectamente (sólo aparece un poco desviado, fácilmente corregible aplicándole un float que haga de offset), resulta que el eje Z del botón se comporta de manera INVERSA a cómo lo hace el gameObject de referencia.
 
Es decir, que si muevo el gameObject hacia arriba, el botón se desplaza hacia abajo y viceversa. He intentado corregir esto con una variable float que reste la posición de Z, pero aunque funciona, sólo lo hace parcialmente (tengo que especificar el nuevo valor de offset a cada vez mientras el juego está en "play", pues no queda fijado como si fuera un child).
 
 
 
¿Alguien sabe por qué sucede esto y cómo lo puedo solventar??
 
 
 
MIl gracias!
#15
General (Antiguo) / Problemilla con PREFABS
Mayo 20, 2015, 10:20:09 AM
Muy buenas!
 
Pues es que tengo un prefab con una serie de transforms. Quisiera poder añadir estos transform (son esferas trigger, spawnpoints) sin tener que convertir estas mismas en prefabs también... ¿Es esto posible? Unity no parece dejarme opción (ni arrastrando ni picando en la diana del array en el inspector, pues no sale ningún objeto (Asset) ) y la verdad es que es un coñazo porque significa que tengo que tener dos escenarios en uno (es decir, el que está en la pantalla para que yo pueda construir el escenario, y el que se instancia automáticamente con la creación de los prefabs - ¿¿¿cosa que además sospecho que no es lo más eficiente en según que casos???- )  Esto, además, supone un soberano coñazo a la hora de reajustar las ubicaciones de los spawnpoints...
 
¿Hay algún modo de sortear este problemilla o me la tengo que envainar???
 
 
Mil gracias, compañeros!!