Channel alfa pulsando -- # campo con unity3d camp codereview Relacionados El problema

Pulsing Alpha Channel


6
vote

problema

Español

El siguiente script hace un pulso de imagen en la unidad fluctuando su canal alfa. Sin embargo, siento que hay un gran código duplicado en el método de actualización. ¿Cómo puedo limpiar ese código para que no se repita con + -, verdadero falso, etc.?

  doDamage()3  
Original en ingles

The following script makes an image pulse in Unity by fluctuating its alpha channel. However, I feel like there is a lot of duplicate code in the update method. How can I clean up that code to have it not repeat itself with +-, true false, etc.?

using UnityEngine; using UnityEngine.UI;  [RequireComponent(typeof(Image))] public class Pulse : MonoBehaviour {     private Image image;      [Tooltip("How long in seconds it takes to complete a pulse")]     [SerializeField]     [Range(0.0f, 60.0f)]     private float time = 2.0f;      [Tooltip("Minimum alpha to pulse to")]     [SerializeField]     [Range(0.0f, 1.0f)]     private float minAlpha = 0.0f;      [Tooltip("Maximum alpha to pulse to")]     [SerializeField]     [Range(0.0f, 1.0f)]     private float maxAlpha = 1.0f;      private bool alphaIncreasing = false;      private void Awake()     {         image = GetComponent<Image>();     }      void Update()     {         var color = image.color;         float alphaChange = Time.deltaTime / time / 2.0f;         if (alphaIncreasing)         {             color.a += alphaChange;             if (color.a >= maxAlpha)             {                 color.a = maxAlpha;                 alphaIncreasing = false;             }         }         else         {             color.a -= alphaChange;             if (color.a <= minAlpha)             {                 color.a = minAlpha;                 alphaIncreasing = true;             }         }         image.color = color;     } } 
     

Lista de respuestas

1
 
vote
vote
La mejor respuesta
 

Podría usar el crossfadealpha método del componente de la imagen para Cambiando el alfa. Ha sido diseñado para este propósito.

  BOARDLENGTH -> BOARD_LENGTH BOARDHEIGHT -> BOARD_HEIGHT 9  

algunos consejos adicionales:

Nunca cree un objeto dentro ship.show(board, hasprevious=False) HERE^ 0 bucle. Me refiero a este ship.show(board, hasprevious=False) HERE^ 1 . Al hacerlo, está asignando memoria (en montón) cada cuadro. Esto es muy malo .

Trate de minimizar el cálculo al almacenar su valor y reutilizarlo una y otra vez. Puede mover esta parte ship.show(board, hasprevious=False) HERE^ 2 a ship.show(board, hasprevious=False) HERE^ 3 . Pero, por supuesto, debe declarar ship.show(board, hasprevious=False) HERE^ 4 como una variable de miembro de clase, por lo que se puede acceder al interior ship.show(board, hasprevious=False) HERE^ 5 .

Intenta dar nombres más significativos. La legibilidad es muy importante. En este caso, como puede ver en mi código, cambié ship.show(board, hasprevious=False) HERE^ 6 a ship.show(board, hasprevious=False) HERE^ 7 , porque ofrece la intención más claramente.

 

You could use the CrossFadeAlpha method of the Image component for changing the alpha. It's been design for this purpose.

using UnityEngine; using UnityEngine.UI; using System.Collections;  public class Pulse : MonoBehaviour {     Image image;      [Tooltip("How long in seconds it takes to complete a pulse")]     [SerializeField] [Range(0, 2)] float duration = 2.0f;      [Tooltip("Minimum alpha to pulse to")]     [SerializeField] [Range(0.0f, 1.0f)] float minAlpha = 0.0f;      [Tooltip("Maximum alpha to pulse to")]     [SerializeField] [Range(0.0f, 1.0f)] float maxAlpha = 1.0f;      IEnumerator Start ()     {         image = GetComponent<Image> ();          while (true) {             image.CrossFadeAlpha(minAlpha, duration, false);             yield return new WaitForSeconds (duration);             image.CrossFadeAlpha(maxAlpha, duration, false);             yield return new WaitForSeconds (duration);         }     } } 

Some extra tips:

Never create an object inside Update() loop. I'm referring to this var color = image.color;. By doing so, you're allocating memory(on heap) every single frame. This is very bad.

Try to minimize the computation by storing its value and reusing it over and over. You could move this part float alphaChange = Time.deltaTime / time / 2.0f; to Awake(). But of course, you need to declare alphaChange as a class member variable, so it can be accessed inside Update().

Try giving more meaningful names. Readability is very important. In this case, as you can see in my code, I changed time to duration, because it delivers the intention more clearly.

 
 
4
 
vote

Todo puede ser controlado por un límite cambiante.

El (límite 2 * - 1) da como resultado 1 para el límite 1 o -1 para el límite 0 controlar si está aumentando o disminuyendo.

color.a * firma y gt; = limite si límite = 1 y color.a & gt; 1 o límite = 0 y color.a & lt; 0

y maxalpha - límite es 1 si el límite es 0 o 0 si el límite es 1

Eliminar

  private float minAlpha = 0.0f;  private bool alphaIncreasing = false;   

Agregar

  private float limit = 0.0f;   

Nuevo código de actualización.

  void Update() {     var color = image.color;     float alphaChange = Time.deltaTime / time / 2.0f;     var sign = 2 * limit - 1;     color.a += sign * alphaChange;     if (color.a * sign >= limit)     {         color.a = limit;         limit = maxAlpha - limit;     }     image.color = color; }   
 

Everything can be controlled by a changing limit.

The (2 * limit - 1) results in either 1 for limit 1 or -1 for limit 0 controlling whether you are increasing or decreasing.

color.a * sign >= limit if limit = 1 and color.a > 1 or limit = 0 and color.a < 0

and maxAlpha - limit is either 1 if limit is 0 or 0 if limit is 1

Remove

private float minAlpha = 0.0f;  private bool alphaIncreasing = false; 

Add

private float limit = 0.0f; 

New Update code.

void Update() {     var color = image.color;     float alphaChange = Time.deltaTime / time / 2.0f;     var sign = 2 * limit - 1;     color.a += sign * alphaChange;     if (color.a * sign >= limit)     {         color.a = limit;         limit = maxAlpha - limit;     }     image.color = color; } 
 
 

Relacionados problema

7  Servidor de autenticación TCP y cliente  ( Tcp authentication server and client ) 
Esta es la primera vez que trato con C #, ya que estoy acostumbrado a los sockets de Java, así que quiero su revisión completa y cualquier cosa que crea que p...

4  Creando un efecto de mampostería con rectángulos de altura variables  ( Creating a masonry effect with varying height rectangles ) 
Se utiliza lo siguiente para crear un efecto de mampostería con rectángulos de altura variables. ¿Cómo puedo simplificar y hacer esto más elegante en la unida...

3  Acelerando el proceso de obtención de datos  ( Speeding up the process of obtaining data ) 
He creado este script para obtener datos de los gráficos en línea, desde MonavisaxmlData. Me preguntaba si había una manera de obtener los datos más rápidos. ...

1  Hacer los métodos de base de datos de C # Unity Script más reutilizables y concisos  ( Make c unity script database methods more re usable and concise ) 
Tengo un archivo C #, que hace algunas modificaciones en la pantalla (cambia el texto en la interfaz de usuario) pero tengo algunas dudas: ¿Cómo puedo reut...

6  Girando un personaje boca abajo y viceversa  ( Rotating a character upside down and vice versa ) 
Tengo una tarea bastante sencilla, pero me resulta difícil averiguar cómo mejorarlo. El código es bastante sencillo, pero bastante malo. Hay algunas aclaracio...

3  Método para obtener posiciones de trozos adyacentes  ( Method for obtaining adjacent chunk positions ) 
Actualmente estoy en proceso de hacer un juego basado en azulejos 2D. Este juego tiene un mundo "infinito" que puede ser atravesado y modificado según sea nec...

4  Generación de mapa simple de unidad  ( Unity simple map generation ) 
Estoy tratando de generar un mapa simple como este. Todo funciona como quiero, pero soy nuevo para programar. ¿Es una buena manera de hacer algo como esto? Y ...

1  ¿La verificación para el Core.Instance.islocalplayer dos veces en mi método constituye un mal diseño?  ( Does checking for the core instance islocalplayer twice in my method constitute ) 
He estado escribiendo algún código para mi proyecto Unity, donde estoy conectando a los jugadores a un juego y agregándolos a un diccionario, que está en una ...

2  Unity Post / Get / Check www Solicitudes con éxito CallBack y error de devolución de llamada  ( Unity post get check www requests with success callback and error callbacks ) 
Esta es una clase I construida para manejar las solicitudes posteriores a la URL, pero también verifique la conexión y proporcione diferentes devoluciones de ...

2  Patrón abstracto de fábrica para implementar adtetworks en múltiples plataformas [cerradas]  ( Abstract factory pattern for implementing adnetworks on multiple platforms ) 
cerrado. Esta pregunta es off-topic . Actualmente no está aceptando respuestas. ¿Quieres ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos