Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

266
Views
¿Cómo almaceno y llamo a una variable temporal en C#?

¡Disculpas de antemano! Principiante aquí. Cada vez uso más una característica como esta que voy a describir, para almacenar una variable temporal y recuperarla. Intenté buscarlo, pero no encontré una respuesta específicamente relacionada con mi problema.

Estoy tratando de hacer algo muy simple, una vez que entiendo cómo se hace, puedo aplicarlo a otros tipos (etc).

Digamos que quiero cambiar el color de una luz, pero almaceno la configuración de luz original en una variable, luego recupere esa configuración una vez que se agote el tiempo. Esto es para un juego en Unity.

 if (powerupEnabled) { CameraShake.instance.shakeDuration = 5; powerupTimer -= Time.deltaTime; snakeheadFire.SetActive(true); //lightIngame.intensity = 0.8f; Color original_color = lightIngame.color; // <<<< Trying to store original color set in game in variable lightIngame.color = Color.red; if (lightIngame != null) { // add the amount of time that has passed since last frame timeElapsed += Time.deltaTime; // if the amount of time passed is greater than or equal to the delay if (timeElapsed >= delay) { // reset the time elapsed timeElapsed = 0; // toggle the light ToggleLight(); } } if (powerupTimer <= 0) { lightIngame.color = original_color; // <<<< Trying to restore original color set in game from variable CameraShake.instance.shakeDuration = 0; lightIngame.intensity = 1.12f; print("Timer stopped!"); powerupTimer = 5f; snakeheadFire.SetActive(false); powerupEnabled = false; } }

Así que básicamente probé Color original_color = lightIngame.color, pero una vez que recuperé el color original, la luz no cambiará a su configuración original. Las dos líneas (cambios de color) se referencian con '<<<<'

¿Qué me estoy perdiendo?

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

La variable temporal se crea en cada cuadro, si esa función ejecuta cada cuadro. Necesita una variable que pueda sobrevivir hasta que se agote su powerupTimer .

Sugiero esto:

 private Color temp_value; // this lives in the class, not in the function. void Update() { if (powerupEnabled) { // do stuff if (powerupTimer <= 0) { setPowerupState(false); // disable powerup } } } void setPowerupState(bool enabled) { powerupEnabled = enabled; if(enabled) temp_value = lightIngame.color; // store the original color once, not every frame. else lightIngame.color = temp_value; // restore the saved value. }
over 4 years ago · Santiago Trujillo Report

0

Esta respuesta ya proporciona una explicación y una posible solución.

Sin embargo, podría evitar la variable local por completo al no procesar esto en Update cada cuadro sino al usar una Rutina donde las variables locales existen durante toda la vida útil de esa rutina:

 void Update() { if (powerupEnabled) { // Make sure to start the routine only once powerupEnabled = false; StartCoroutine(PowerUpRoutine()); } } private IEnumerator PowerUpRoutine() { CameraShake.instance.shakeDuration = 5; snakeheadFire.SetActive(true); var original_color = lightIngame.color; lightIngame.color = Color.red; var powerupTimer = 5f; var timeElapsed = 0f; while(powerupTimer > 0 && lightIngame) { // add the amount of time that has passed since last frame timeElapsed += Time.deltaTime; // if the amount of time passed is greater than or equal to the delay if (timeElapsed >= delay) { // reset the time elapsed timeElapsed = 0; // toggle the light ToggleLight(); } // This tells Unity to "pause" this routine, render this frame // and continue from here in the next frame yield return null; powerupTimer -= Time.deltaTime; } lightIngame.color = original_color; CameraShake.instance.shakeDuration = 0; lightIngame.intensity = 1.12f; print("Timer stopped!"); snakeheadFire.SetActive(false); }
over 4 years ago · Santiago Trujillo Report

0

C# tiene dos tipos diferentes de objetos: tipos de valor y tipos de referencia. Los tipos de valor son tipos simples, como int, bool, double, etc.

En su mayor parte, todas las demás clases o clases más complejas son tipos de referencia, lo que significa que cuando asigna una variable a otra, en lugar de copiar el objeto, C# solo asignará la dirección de memoria del objeto.

Esto significa que, cuando llamas a Color original_color = lightIngame.color; , C# asignará la referencia de objeto de lightIngame.color a su variable original_color. El valor no se copia, pero ambas variables apuntan al mismo objeto.

Cuando asignas un nuevo valor a lightIngame.color después, estás cambiando el valor de lightIngame.color y original_color al mismo tiempo, ya que ambos apuntan al mismo objeto.

Para solucionar esto, debe crear una copia de lightIngame.color al guardarlo, por ejemplo, a través de constructores de copias.

Este no es un problema específico de Unity, sino un hecho general sobre cómo funciona C#.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!