Jump to content
Sign in to follow this  
agustin9594

Es posible hacer esto? (SOLUCIONADO)

Recommended Posts

public enum Parts { BarrelID, MagazineID, StockID, ScopeID, GripID, SupressorID, AccesoryID, LaserID }
        public Parts parts;

        public int exampleInt;

        public int BarrelID;
        public int MagazineID;
        public int StockID;
        public int ScopeID;
        public int GripID;
        public int SupressorID;
        public int AccesoryID;
        public int LaserID;
        public bool AllowAltIks;

        private void Awake()
        {
            exampleInt = parts;
        }

Lo que intento hacer es igualar exampleInt a uno de los Int de abajo (el que yo elija desde el Enum en el inspector, esto es un ScriptableObject) ¿Hay alguna forma de hacer esto?

Edited by agustin9594

Share this post


Link to post
Share on other sites

Ummm, indenta bien ese código, he estado un rato pensando que estabas añadiendo esos métodos a la enumeración, cuando supongo que son parte de una clase (MonoBehavior) ;-).

Para obtener el valor entero asociado a una enumeración puedes hacer un typecast a entero. Si parts no ha sido definido, el valor será 0.
 

        private void Awake()
        {
            exampleInt = (int) parts;
        }

 

Echa un ojo a la referencia de las enums en C#, en la sección "Conversion'.

 

Edited by J Montes

Share this post


Link to post
Share on other sites

Recuerda que puede asignar un valor numérico a las enumeraciones. 

public enum Parts { BarrelID= 100, MagazineID = 300, StockID = 120, ScopeID, GripID, SupressorID, AccesoryID, LaserID }

Ahora si el valor de los campos enteros cambiara (creo es el caso) lo mejor sería trabajar ExampleInt como una propiedad.

public int ExampleInt => switch(parts) { case BarrelID: return BarrelID; case MagazineID: return MagazineID; } return 0;

 

Share this post


Link to post
Share on other sites
1 hour ago, francoe1 said:

Recuerda que puede asignar un valor numérico a las enumeraciones. 


public enum Parts { BarrelID= 100, MagazineID = 300, StockID = 120, ScopeID, GripID, SupressorID, AccesoryID, LaserID }

Ahora si el valor de los campos enteros cambiara (creo es el caso) lo mejor sería trabajar ExampleInt como una propiedad.


public int ExampleInt => switch(parts) { case BarrelID: return BarrelID; case MagazineID: return MagazineID; } return 0;

 

 

1 hour ago, J Montes said:

Ummm, indenta bien ese código, he estado un rato pensando que estabas añadiendo esos métodos a la enumeración, cuando supongo que son parte de una clase (MonoBehavior) ;-).

Para obtener el valor entero asociado a una enumeración puedes hacer un typecast a entero. Si parts no ha sido definido, el valor será 0.
 


        private void Awake()
        {
            exampleInt = (int) parts;
        }

 

Echa un ojo a la referencia de las enums en C#, en la sección "Conversion'.

 

Gracias a ambos por responder, pero ahora tengo la siguiente duda.

Sé que debo usar esto para cambiar el valor de los int en el enum (me refiero a estos: public enum Parts { BarrelID, MagazineID }):

  • Parts part1 = (Parts) 1; //part1 is now "MagazineID"
  • Parts part2 = (Parts) exampleInt; //convert exampleInt back to a Parts

Pero no entiendo cómo elegir cuál int cambiar, lo que quiero hacer es más o menos así:

  • parts.BarrelID = exampleInt2;
  • parts.MagazineID = exampleInt3;
Edited by agustin9594

Share this post


Link to post
Share on other sites
11 minutes ago, agustin9594 said:

 

Gracias a ambos por responder, pero ahora tengo la siguiente duda.

Sé que debo usar esto para cambiar el valor de los int en el enum (me refiero a estos: public enum Parts { BarrelID, MagazineID }):

  • Parts part1 = (Parts) 1; //part1 is now "MagazineID"
  • Parts part2 = (Parts) exampleInt; //convert exampleInt back to a Parts

Pero no entiendo cómo elegir cuál int cambiar, lo que quiero hacer es más o menos así:

  • parts.BarrelID = exampleInt2;
  • parts.MagazineID = exampleInt3;

Justamente es lo que te pase. 

Converti ExampleInt en una propiedad e implementa el "GET".

Share this post


Link to post
Share on other sites
9 minutes ago, agustin9594 said:

 

Gracias a ambos por responder, pero ahora tengo la siguiente duda.

Sé que debo usar esto para cambiar el valor de los int en el enum (me refiero a estos: public enum Parts { BarrelID, MagazineID }):

  • Parts part1 = (Parts) 1; //part1 is now "MagazineID"
  • Parts part2 = (Parts) exampleInt; //convert exampleInt back to a Parts

Pero no entiendo cómo elegir cuál int cambiar, lo que quiero hacer es más o menos así:

  • parts.BarrelID = exampleInt2;
  • parts.MagazineID = exampleInt3;

Si Parts (con mayúscula) es una enumeración, entiendo que parts (en minúscula) es una variable, una instancia de ese enum.

Si te refieres a asignar BarrelID de la enumeración ¿para qué querrías reasignar un valor a los miembros de la enumeración? No se puede, ya que son constantes. Las enumeraciones sirven sólo para asociar nombres a números.

Si te estabas refiriendo a las propiedades .BarrelID del GameObject... eliges cuál cambiar con el código claro, pero llegados a este punto yo no tengo claro lo que quieres hacer. No le des más vueltas. Deja tu enumeración con constantes, y todo lo que tenga que cambiar déjalo como variables en tu GameObject (propiedades o campos, da igual).

Pero para empezar, una sugerencia: los miembros de tu enumeración y de tu GameObjecto tienen el mismo nombre. Esto es "raro". Busca un nombre más significativo para unos o para otros, o explícanos mejor qué significan esos IDs y qué GameObject estás modificando y cuál es tu objetivo.

Share this post


Link to post
Share on other sites
1 hour ago, francoe1 said:

Justamente es lo que te pase. 

Converti ExampleInt en una propiedad e implementa el "GET".

Tenés algún tutorial o algún post donde se explique cómo hacer eso? Intenté poner esto como me dijiste vos:

public int ExampleInt => switch(parts) { case BarrelID: return BarrelID; case MagazineID: return MagazineID; } return 0;

pero se subraya todo de rojo y me dice que el término switch no es válido en una clase, una estructura o una declaración de miembro de interfaz.

1 hour ago, J Montes said:

Si Parts (con mayúscula) es una enumeración, entiendo que parts (en minúscula) es una variable, una instancia de ese enum.

Si te refieres a asignar BarrelID de la enumeración ¿para qué querrías reasignar un valor a los miembros de la enumeración? No se puede, ya que son constantes. Las enumeraciones sirven sólo para asociar nombres a números.

Si te estabas refiriendo a las propiedades .BarrelID del GameObject... eliges cuál cambiar con el código claro, pero llegados a este punto yo no tengo claro lo que quieres hacer. No le des más vueltas. Deja tu enumeración con constantes, y todo lo que tenga que cambiar déjalo como variables en tu GameObject (propiedades o campos, da igual).

Pero para empezar, una sugerencia: los miembros de tu enumeración y de tu GameObjecto tienen el mismo nombre. Esto es "raro". Busca un nombre más significativo para unos o para otros, o explícanos mejor qué significan esos IDs y qué GameObject estás modificando y cuál es tu objetivo.

Necesito reasignar los valores de los miembros de la enumeración para hacer básicamente esto:

Pero debo aclarar que no me sirven public ints normales, necesito usar los de la enumeración para poder cambiar qué parte del arma cambia cada propiedad de manera independiente. La razón por la que lo quiero hacer así es porque son muchas armas con muchas partes intercambiables cada una y no todas cambian la misma propiedad con la misma parte, por lo que de otra forma debería escribir decenas de líneas de código

public enum Parts { BarrelID = 0, MagazineID = 0, StockID = 0, ScopeID = 0, GripID = 0, SupressorID = 0, AccesoryID = 0, LaserID = 0 }

public Parts parts;



public int gunDamage;

public int gunClipSize;

public int gunRecoil;



public void ChangeGunDamage() // Change the type of barrel / magazine / etc

{

     (int) parts++; // Each barrel / magazine / etc has its own id

     switch ( (int) parts) // I choose what type of part change the propety

          {

               case 0:

                    gunDamage = 10;

                    break;

               case 1:

                    gunDamage = 20;

                    break;

               case 2:

                    gunDamage = 30;

                    break;

          }

}



public void ChangeGunClipSize()

{

     (int) parts++;

     switch ( (int) parts)

          {

               case 0:

                    gunClipSize = 10;

                    break;

               case 1:

                    gunClipSize = 20;

                    break;

               case 2:

                    gunClipSize = 30;

                    break;

          }

}

 

Edited by agustin9594
Usar etiquetas de código.

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...