Estoy tratando de extraer una gran cantidad de código en mi programa y encontré un problema.
Esta es mi función para extraer un proceso de fundición:
public IEnumerator Smelting(Button button, Image bar, BigDouble material, BigDouble output) { button.interactable = false; float t = 0f; while (t <= 1f) { bar.fillAmount = t; t += Time.deltaTime / 4; yield return null; } bar.fillAmount = 0; //saveLoadHandler.data.copperBar += smeltingHandler.smeltCopperOreOutput; material += output; button.interactable = true; } Mi problema ahora es que quiero agregar la salida al material con: material += output . El comando anterior muestra cómo se ven estos parámetros.
Entonces parece que en este caso el material no se asigna correctamente.
No quiero ir por el camino if(type = copper){copper += output } else if(type = iron)...
¿Hay una solución para eso?
¡Gracias por adelantado!
si BigDouble es como un double normal, es un tipo de valor y, por lo tanto, se pasa por valor a su método. Puede agregar la palabra clave ref para pasarla por referencia:
public IEnumerator Smelting(Button button, Image bar, ref BigDouble material, BigDouble output)Sin embargo, los iteradores no pueden tener argumentos de referencia, por lo que otra solución podría ser pasar un delegado al método cuyo trabajo es incrementar algo.
public IEnumerator Smelting(Button button, Image bar, Action<BigDouble> incrementMaterial, BigDouble output) { .... incrementMaterial(output); // instead of material += output .... }y luego la persona que llama:
StartCoroutine(smeltingCore.Smelting( smeltCopperOreButton, smeltCopperOreBar, amount => saveLoadHandler.data.copperBar += amount, smeltingHandler.smeltCopperOreOutput)); Por supuesto, en este punto solo está pasando output para usarla en el delegado para que pueda simplificar ambos:
public IEnumerator Smelting(Button button, Image bar, Action incrementMaterial) { .... incrementMaterial(); .... }y
StartCoroutine(smeltingCore.Smelting( smeltCopperOreButton, smeltCopperOreBar, () => saveLoadHandler.data.copperBar += smeltingHandler.smeltCopperOreOutput ));