Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Pregunta retórica

Iniciado por Tizon, Noviembre 23, 2015, 09:48:43 PM

Tema anterior - Siguiente tema
Hola a todos.Hace poco que ando trasteando con Unity, y gracias a este foro estoy aprendiendo mucho y deprisa (una pequeña parte de lo que me queda, eso si). Vengo del C++ (Sin visual) y gracias a este foro he descubierto lo mucho que ha progresado el mundo de la programación (Que maravilla la serialización, por ejemplo, fácil y rápido. Antes lo teníamos que hacer eso a mano, abriendo el fichero y escribiendo o leyendo línea a línea)Bueno, no voy a entreteneros con mis historietas del abuelo cebolleta. El caso es que estoy con una clase que tendrá decenas de objetos, pero quiero que cada uno sea diferente en su comportamiento, la forma y momento de activarse, y los efectos que causa, pero la gracia es que han de ser todos de una misma clase, no quiero crear clases diferentes. Bien, en un principio me había planteado la solución clásica, hacer que los parámetros que condicionen los diferentes comportamientos, sean variables de la clase para que en cada objeto sea diferente y ahí en las funciones adecuadas, meter un montón de sentencias if case etc anidados hasta el infinito para tratar cada uno de los posibles comportamientos. Ahora bien, trasteando en diversos juegos que tengo, me doy cuenta que muchos de ellos meten el código del comportamiento directamente en unos archivos externos, que leen al ejecutar. Entonces se me ocurre la pregunta interesante, es posible que este código sea leído como una cadena o varias cadenas y que exista una función que permita la ejecución de este código, o bien existe un maravilloso método que permite ejecutar o sobreescribir funciones de la clase, o bien una forma aún más elegante de hacer esto? O simplemente veo esto tan evolucionado que se me va la pelota haciendo cábalas sobre las cosas que aún desconozco y como podría funcionar y lo único que hacen es hacer servir el método clásico sólo que han elaborado un sistema "interprete" con if case anidados, tan elaborado que les permite cargar desde una cadena y así ahorrar variables?Muchas gracias a todos por leerme y perdón por el tocho.

No entendi muy bien, pero en este caso no te serviria herencia?

Si fuera herencia sería otra clase, no?Copio por ejemplo un trozo de uno de los archivos, hay opciones mucho más extensas que controlan muchos comportamientos. Como ves, el código esta en el archivo, la clase lo lee y lo asume en su comportamiento, de tal modo que si lo cambias, cambia el comportamiento del objeto. Perdón si no es muy claro, pero no es código extrictamente hablando.#    option = {
#        name = EVTOPTA38000 # Go to the moneylenders - Favorable terms
#        tooltip_info = stewardship
#        trigger = {
#            stewardship = 8
#        }
#        wealth = 200
#        character_event = { id = 38001 days = 1825 tooltip = EVTTOOLTIP38001 }
#        set_character_flag = loan_taken
#        clr_character_flag = loan_refused
#    }

Entiendo, y si por cada variable  instancias la clase pero pasandole como parametros estos valores que contienen los archivos?

Noviembre 24, 2015, 08:53:48 PM #4 Ultima modificación: Noviembre 24, 2015, 08:55:01 PM por kaito
[quote author=Tizon" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="34502" data-ipsquote-contentcommentid="123978 date=1448312441]...el código esta en el archivo, la clase lo lee ...[/quote]Y crea un objeto.Es como si serializaras una clase y la guardaras en un archivo de texto.Pero al guardar varios tipo de objetos, especifica el nombre del objeto y de sus miembros, por ejemplo el objeto character_event, esta formado por las variables id, days y tooltip. Y a su vez, character_event forma parte de otro objeto(clase).

[quote author=Tizon" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="34502" data-ipsquote-contentcommentid="123978">Si fuera herencia sería otra clase, no?Copio por ejemplo un trozo de uno de los archivos, hay opciones mucho más extensas que controlan muchos comportamientos. Como ves, el código esta en el archivo, la clase lo lee y lo asume en su comportamiento, de tal modo que si lo cambias, cambia el comportamiento del objeto. Perdón si no es muy claro, pero no es código extrictamente hablando.#    option = {
#        name = EVTOPTA38000 # Go to the moneylenders - Favorable terms
#        tooltip_info = stewardship
#        trigger = {
#            stewardship = 8
#        }
#        wealth = 200
#        character_event = { id = 38001 days = 1825 tooltip = EVTTOOLTIP38001 }
#        set_character_flag = loan_taken
#        clr_character_flag = loan_refused
#    }[/quote]Creo que hablas del scripting del The Clausewitz Engine del Crusader Kings II?Se cambia para realizar modding. Tienes todas las referencias al código en:http://www.ckiiwiki.com/Event_modding" rel="external nofollow date=1448312441]http://www.ckiiwiki.com/Event_modding

Creo que el quiere algo como, una clase genérica fruta, que tengas métodos como cortar, explotar, pero dependiendo de que fruta los métodos tengan diferentes comportamientos, a lo que yo decanto por utilizar métodos virtuales.creas un clase fruta, con los parámetros de toda fruta y luego los métodos virtuales que quieres sobrescribir 
 
public class fruta
{
    private int Diametro;
     
    public virtual void Cortar()
    {
        Debug.log("Fruta Cortada");
    }
}
para poder sobrescribir el método Cortar, entonces deberías utilizar la palabra reservada override.Creamos una Clase Manzana, que herede de Fruta y Sobrescribimos el método Cortar.
public class Manzana:fruta
{
    public override void Cortar()
    {
        Debug.log("Se Corto la Manzana");
        //Si quieres llamar el metodo que se encuentra dentro de fruta usas Base
        Base.Cortar();
    }
}
Espero te sirva.. PD: lo escribí todo en el foro pueden existir errores, Suerte!

[quote author=kaito" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="34502" data-ipsquote-contentcommentid="124049 date=1448394828]Y crea un objeto.Es como si serializaras una clase y la guardaras en un archivo de texto.Pero al guardar varios tipo de objetos, especifica el nombre del objeto y de sus miembros, por ejemplo el objeto character_event, esta formado por las variables id, days y tooltip. Y a su vez, character_event forma parte de otro objeto(clase).[/quote]Uopsssss... Pues es verdad... Lo estudiaré desde esa perspectiva... Muy bien visto. Así veré más claro como hacer algo similar. Muchas gracias!!!
[quote author=iRobb" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="34502" data-ipsquote-contentcommentid="124052">Creo que hablas del scripting del The Clausewitz Engine del Crusader Kings II?Se cambia para realizar modding. Tienes todas las referencias al código en:http://www.ckiiwiki.com/Event_modding date=1448397225]http://www.ckiiwiki.com/Event_modding[/quote]Exacto, Muy bien visto. Se que es un motor particular de Paradox, Yo quiero hacer un producto similar en cuanto a enfoque (No en cuanto a calidad y extensión, que más quisiera, quizá algún día muy muy lejano, me queda mucho por aprender) pero he visto que muchas otras compañías usan sistemas similares, y mi pregunta es, ya que estoy encarando esta parte, igual que he descubierto la serialización que antes era algo que teníamos que hacer a mano, si hubiera alguna facilidad que desconozco que permitiera hacer algo ligeramente similar, sin tener que programar en la clase todas y cada una de las posibles relaciones, variables, etc... Me parece mucho más eficiente como lo hacen ellos y mucho más flexible y dinámico. Quiero decir, desde estos archivos puedes crear nuevas provincias, naciones, eventos, personajes, unidades militares, tipos de edificios, y todo ello puedes programar que dependa de otros elementos, si están activos o no, su nivel, y a su vez que activen otros elementos o flags de otras clases... Si tienes que prever todo eso en el diseño de la clase, tienes que añadir docenas de variables, que seguramente en la mayoría de los casos no usarás. Si puedes invocar un código, un trigger, un msgmap o similar, es mucho más flexible y te evitas esas variables que sólo servirán para unos pocos objetos de esa clase... Y lo que no quiero es programar un motor, jajajajajajajaja... 
[quote author=francoe1" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="34502" data-ipsquote-contentcommentid="124054">Creo que el quiere algo como, una clase genérica fruta, que tengas métodos como cortar, explotar, pero dependiendo de que fruta los métodos tengan diferentes comportamientos, a lo que yo decanto por utilizar métodos virtuales.creas un clase fruta, con los parámetros de toda fruta y luego los métodos virtuales que quieres sobrescribir 
 
public class{
    private int Diametro;
     
    public virtual void Cortar()
    {
        Debug.log("Fruta Cortada");
    }
}
para poder sobrescribir el método Cortar, entonces deberías utilizar la palabra reservada override.Creamos una Clase Manzana, que herede de Fruta y Sobrescribimos el método Cortar.
public class Manzana:fruta
{
    public override void Cortar()
    {
        Debug.log("Se Corto la Manzana");
        //Si quieres llamar el metodo que se encuentra dentro de fruta usas Base
        Base.Cortar();
    }
}
Espero te sirva.. PD: lo escribí todo en el foro pueden existir errores, Suerte![/quote]Si, había pensado en algo similar, pero eso me obligaría a convertir lo que he considerado como objetos en clases heredadas, de esa forma perdería la flexibilidad que el sistema de Paradox o Ageod tienen. Nada, sólo era curiosidad, como con cada cosa que aprendo de Unity descubro que hay tres o cuatro más que ignoro, pensé que quizá habría una forma de meter código y que después fuera interpretado o alguna cosa similar... Gracias a todos por vuestras respuestas!!!

[quote author=Tizon" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="34502" data-ipsquote-contentcommentid="124090"> Uopsssss... Pues es verdad... Lo estudiaré desde esa perspectiva... Muy bien visto. Así veré más claro como hacer algo similar. Muchas gracias!!! Exacto, Muy bien visto. Se que es un motor particular de Paradox, Yo quiero hacer un producto similar en cuanto a enfoque (No en cuanto a calidad y extensión, que más quisiera, quizá algún día muy muy lejano, me queda mucho por aprender) pero he visto que muchas otras compañías usan sistemas similares, y mi pregunta es, ya que estoy encarando esta parte, igual que he descubierto la serialización que antes era algo que teníamos que hacer a mano, si hubiera alguna facilidad que desconozco que permitiera hacer algo ligeramente similar, sin tener que programar en la clase todas y cada una de las posibles relaciones, variables, etc... Me parece mucho más eficiente como lo hacen ellos y mucho más flexible y dinámico. Quiero decir, desde estos archivos puedes crear nuevas provincias, naciones, eventos, personajes, unidades militares, tipos de edificios, y todo ello puedes programar que dependa de otros elementos, si están activos o no, su nivel, y a su vez que activen otros elementos o flags de otras clases... Si tienes que prever todo eso en el diseño de la clase, tienes que añadir docenas de variables, que seguramente en la mayoría de los casos no usarás. Si puedes invocar un código, un trigger, un msgmap o similar, es mucho más flexible y te evitas esas variables que sólo servirán para unos pocos objetos de esa clase... Y lo que no quiero es programar un motor, jajajajajajajaja... Si, había pensado en algo similar, pero eso me obligaría a convertir lo que he considerado como objetos en clases heredadas, de esa forma perdería la flexibilidad que el sistema de Paradox o Ageod tienen. Nada, sólo era curiosidad, como con cada cosa que aprendo de Unity descubro que hay tres o cuatro más que ignoro, pensé que quizá habría una forma de meter código y que después fuera interpretado o alguna cosa similar... Gracias a todos por vuestras respuestas!!! [/quote]Hombre yo le pegaría un ojo al lenguaje de scripting LUA:http://www.lua.org/start.html" rel="external nofollow date=1448479156]http://www.lua.org/start.htmlSe ha utlizado en muchos juegos para la IA

Noviembre 30, 2015, 08:01:52 PM #9 Ultima modificación: Noviembre 30, 2015, 08:03:00 PM por Tizon
Gracias @iRobb Tiene buena pinta, le pegaré un ojo, pero C++, no es compatible con Unity, no? 

usas C# que se le parece un tanto

[quote author=Tizon" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="34502" data-ipsquote-contentcommentid="124349">Gracias http://unityspain.com/profile/27231-irobb/?do=hovercard" data-mentionid="27231" href="<___base_url___>/profile/27231-irobb/">@iRobb Tiene buena pinta, le pegaré un ojo, pero C++, no es compatible con Unity, no? [/quote]Hoy en día ya solo se destilan los lenguajes de desarrollo "managed" para evitar problemas en la gestión de la memoria o malintencionados que provoquen overflows.Yo también provengo de C++ y verás que con C# te vas a sentir muy cómodo. Ha ido evolucionando mucho en los últimos años. Eso sí, olvídate de punteros, memcpy's, herencia múltiple (solamente si es una Clase + Interface) o de tener que asignar memoria (o instanciar) antes de copiar una cadena :D

[quote author=iRobb date=1448932153" data-ipsquote="" data-cite="iRobb">Hoy en día ya solo se destilan los lenguajes de desarrollo "managed" para evitar problemas en la gestión de la memoria o malintencionados que provoquen overflows.Yo también provengo de C++ y verás que con C# te vas a sentir muy cómodo. Ha ido evolucionando mucho en los últimos años. Eso sí, olvídate de punteros, memcpy's, herencia múltiple (solamente si es una Clase + Interface) o de tener que asignar memoria (o instanciar) antes de copiar una cadena [/quote]Si la verdad es que en principio uno se adapta bien, es todo como más intuitivo y haces las cosas de un modo más directo. Luego cuando profundizas, es cuando te surgen las dudas tontas como la que preguntaré ahora, que es tan básica que no entiendo como se me ha pasado... Seguro que he leído sobre ello o he visto algún ejemplo pero lo he dado por sobreentendido o algo, que ahora que necesito hacerlo, no tengo idea, ya no de como hacerlo, sino siquiera de por dónde buscar. Creo un nuevo hilo para esta consulta, que así seguro que servirá para alguien más que provenga de C+ o algún lenguaje similar y le sirva la respuesta... Espero no hacer el tonto preguntando algo absurdo... :)

[quote author=Tizon" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="34502" data-ipsquote-contentcommentid="124375">Si, la raíz común es el C, lo que me gustaría saber es si puedo aprovechar el LUA para un juego en Unity... Estaría estupendo aunque tuviera que dedicarle horas a estudiarlo.Si la verdad es que en principio uno se adapta bien, es todo como más intuitivo y haces las cosas de un modo más directo. Luego cuando profundizas, es cuando te surgen las dudas tontas como la que preguntaré ahora, que es tan básica que no entiendo como se me ha pasado... Seguro que he leído sobre ello o he visto algún ejemplo pero lo he dado por sobreentendido o algo, que ahora que necesito hacerlo, no tengo idea, ya no de como hacerlo, sino siquiera de por dónde buscar. Creo un nuevo hilo para esta consulta, que así seguro que servirá para alguien más que provenga de C+ o algún lenguaje similar y le sirva la respuesta... Espero no hacer el tonto preguntando algo absurdo... [/quote]https://www.assetstore.unity3d.com/en/#!/content/391" rel="external nofollow date=1448973367]https://www.assetstore.unity3d.com/en/#!/content/391Hay muchas maneras de integrarlo sin problemas 

[quote author=iRobb" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="34502" data-ipsquote-contentcommentid="124385">https://www.assetstore.unity3d.com/en/#!/content/391">https://www.assetstore.unity3d.com/en/#!/content/391Hay muchas maneras de integrarlo sin problemas [/quote]Pues perfecto, entonces. Ya sé a qué voy a dedicar estos 4 días... :D

Etiquetas: