using UnityEngine; public class sistemaInterno : ...
作成日: 2025年3月2日
作成日: 2025年3月2日
using UnityEngine;
public class sistemaInterno : MonoBehaviour
{
public ciclos scriptCiclos;
public recursos scriptRecursos;
textpublic ofertaMercado scriptOfertaMercado; public demandaMercado scriptDemandaMercado; public preciosMercado scriptPreciosMercado; void OnEnable() { scriptCiclos.onCicloCompleto += VenderRecursos; } void OnDisable() { scriptCiclos.onCicloCompleto -= VenderRecursos; } private void VenderRecursos() { int cantidadMP1 = scriptRecursos.mP1; float precioMP1 = scriptPreciosMercado.precioFinalMP1; float dineroMP1 = precioMP1 * cantidadMP1; scriptRecursos.dinero += dineroMP1; scriptRecursos.mP1 = 0; Debug.Log($"[VentaRecursos] Vendido {cantidadMP1} de Grano a {precioMP1:0.00}. " + $"Dinero obtenido: {dineroMP1}. Dinero total: {scriptRecursos.dinero}"); int cantidadMP2 = scriptRecursos.mP2; float precioMP2 = scriptPreciosMercado.precioFinalMP2; float dineroMP2 = precioMP2 * cantidadMP2; scriptRecursos.dinero += dineroMP2; scriptRecursos.mP2 = 0; Debug.Log($"[VentaRecursos] Vendido {cantidadMP2} de Hortalizas a {precioMP2:0.00}. " + $"Dinero obtenido: {dineroMP2}. Dinero total: {scriptRecursos.dinero}"); int cantidadMP3 = scriptRecursos.mP3; float precioMP3 = scriptPreciosMercado.precioFinalMP3; float dineroMP3 = precioMP3 * cantidadMP3; scriptRecursos.dinero += dineroMP3; scriptRecursos.mP3 = 0; Debug.Log($"[VentaRecursos] Vendido {cantidadMP3} de Frutas a {precioMP3:0.00}. " + $"Dinero obtenido: {dineroMP3}. Dinero total: {scriptRecursos.dinero}"); }
}
modifica este script que estaba usando para que sea el GameManager que, cada fin de ciclo, active a los demas scripts (demanda, oferta, precios) y ademas cambie lo producido por el jugador por dinero (contenido en el script recursos. Algunas cosas ya no sirven por los cambios que hice en los otros scripts. Pego a continuacion los otros scripts para que los tengas en cuenta:
using UnityEngine;
public class demandaMercado : MonoBehaviour
{
public float poblacionTotal = 50f;
public float minDelta3 = -10f;
public float maxDelta3 = 10f;
textpublic float[] demandaMP = new float[9]; public float[] consBaseMP = new float[9] { 0.75f, 0.70f, 0.60f, 0.00f, 0.00f, 0.00f, 0.00f, 0.00f, 0.00f }; void start() { for (int i = 0; i < demandaMP.Length; i++) { demandaMP[i] = consBaseMP[i] * poblacionTotal; } } public void CalcularDemanda() { float delta3 = Random.Range(minDelta3, maxDelta3); poblacionTotal += delta3; if (poblacionTotal < 0) poblacionTotal = 0; for (int i = 0; i < demandaMP.Length; i++) { float consumidores = consBaseMP[i] * poblacionTotal; float nuevaDemanda = consumidores; if (nuevaDemanda < 0) nuevaDemanda = 0; demandaMP[i] = nuevaDemanda; } Debug.Log(">>> DEMANDA RECALCULADA. " + "\nPoblación = " + poblacionTotal + "\nDemanda Grano = " + demandaMP[0] + "\nDemanda Hortaliza = " + demandaMP[1] + "\nDemanda Fruta = " + demandaMP[2]); }
}
using UnityEngine;
public class ofertaMercado : MonoBehaviour
{
public recursos scriptRecursos;
textpublic float[] ofertaMP = new float[9]; // producción base de los NPCs public float[] prodBaseNPC1MP = new float[9] { 12, 3, 1, 0, 0, 0, 0, 0, 0 }; public float[] prodBaseNPC2MP = new float[9] { 6, 9, 2, 0, 0, 0, 0, 0, 0 }; public float[] prodBaseNPC3MP = new float[9] { 18, 6, 3, 0, 0, 0, 0, 0, 0 }; // variación en la produccón public float[] varProdNPC1MP = new float[9] { 12, 3, 1, 0, 0, 0, 0, 0, 0 }; public float[] varProdNPC2MP = new float[9] { 6, 9, 2, 0, 0, 0, 0, 0, 0 }; public float[] varProdNPC3MP = new float[9] { 18, 6, 3, 0, 0, 0, 0, 0, 0 }; // producción total de los NPCs public float[] produccionNPC1MP = new float[9]; public float[] produccionNPC2MP = new float[9]; public float[] produccionNPC3MP = new float[9]; public void CalcularOferta() { for (int i = 0; i < 9; i++) { float delta1 = Random.Range(-varProdNPC1MP[i], varProdNPC1MP[i]); produccionNPC1MP[i] = prodBaseNPC1MP[i] + delta1; if (produccionNPC1MP[i] < 0) produccionNPC1MP[i] = 0; float delta2 = Random.Range(-varProdNPC2MP[i], varProdNPC2MP[i]); produccionNPC2MP[i] = prodBaseNPC2MP[i] + delta2; if (produccionNPC2MP[i] < 0) produccionNPC2MP[i] = 0; float delta3 = Random.Range(-varProdNPC3MP[i], varProdNPC3MP[i]); produccionNPC3MP[i] = prodBaseNPC3MP[i] + delta3; if (produccionNPC3MP[i] < 0) produccionNPC3MP[i] = 0; } int[] prodJugadorMP = new int[] { scriptRecursos.mP1, scriptRecursos.mP2, scriptRecursos.mP3, scriptRecursos.mP4, scriptRecursos.mP5, scriptRecursos.mP6, scriptRecursos.mP7, scriptRecursos.mP8, scriptRecursos.mP9 }; for (int i = 0; i < 9; i++) { ofertaMP[i] = produccionNPC1MP[i] + produccionNPC2MP[i] + produccionNPC3MP[i] + prodJugadorMP[i]; } Debug.Log(">>>OFERTA RECALCULADA. " + "\nGrano = " + ofertaMP[0] + "\nHortalizas = " + ofertaMP[1] + "\nFruta = " + ofertaMP[2]); }
}
using UnityEngine;
using System;
public class preciosMercado : MonoBehaviour
{
public demandaMercado DemandaMercado;
public ofertaMercado OfertaMercado;
textpublic float alfa = 0.1f; public float[] precioBase = new float[9] { 1f, 3f, 5f, 0f, 0f, 0f, 0f, 0f, 0f }; public float[] precioMercado = new float[9]; public void CalcularPreciosMP() { for (int i = 0; i < precioBase.Length; i++) { float demanda = DemandaMercado.demandaMP(i); float oferta = OfertaMercado.ofertaMP(i); float factor = 1f + alfa * (demanda - oferta); if (factor < 0) factor = 0; precioMercado[i] = precioBase[i] * factor; } Debug.Log("PRECIOS FINALES: " + "\nGrano = " + precioMercado[0] + "\nHortalizas = " + precioMercado[1] + "\nFrutas = " + precioMercado[2]); }
}
(tambien hay errores en el script de precios, si puedes corrigelos):
Assets\Scripts\inicio1\sistemaEconomico\mercado\preciosMercado.cs(17,44): error CS1955: Non-invocable member 'demandaMercado.demandaMP' cannot be used like a method.
Assets\Scripts\inicio1\sistemaEconomico\mercado\preciosMercado.cs(18,42): error CS1955: Non-invocable member 'ofertaMercado.ofertaMP' cannot be used like a method..
IMPORTANTE, SCRIPTS DE CICLOS Y RECURSOS:
using UnityEngine;
using System.Collections;
using System;
public class ciclos : MonoBehaviour
{
// ciclo productivo
textpublic event Action onCicloCompleto; public float cicloProductivo = 30f; public int ciclosTotales = 0; private Coroutine cicloCorrutina; void Start() { cicloCorrutina = StartCoroutine(ciclosContador()); } IEnumerator ciclosContador() { while (true) { yield return new WaitForSeconds(cicloProductivo); ciclosTotales += 1; Debug.Log("Ciclo completado. Ciclos totales: " + ciclosTotales); onCicloCompleto.Invoke(); } } void OnDisable() { StopCoroutine(cicloCorrutina); }
}
using UnityEngine;
public class recursos : MonoBehaviour
{
// materias primas
public int mP1 = 0;
public int mP2 = 0;
public int mP3 = 0;
public int mP4 = 0;
public int mP5 = 0;
public int mP6 = 0;
public int mP7 = 0;
public int mP8 = 0;
public int mP9 = 0;
textpublic int capacidadMP1 = 0; public int capacidadMP2 = 0; public int capacidadMP3 = 0; // bienes manufacturados public int bM1 = 0; public int bM2 = 0; public int bM3 = 0; public int bM4 = 0; public int bM5 = 0; public int bM6 = 0; // puntuación total del jugador public float dinero = 0f; public float conocimiento = 0f; public float fuerzaMilitar = 0f; // incremento de materias primas public void aumentarMP1(int cantidad) { mP1 = Mathf.Min(mP1 + cantidad, capacidadMP1); Debug.Log("Granos totales = " + mP1 + " / " + capacidadMP1); } public void aumentarMP2(int cantidad) { mP2 = Mathf.Min(mP2 + cantidad, capacidadMP2); Debug.Log("Hortalizas totales = " + mP2 + " / " + capacidadMP2); } public void aumentarMP3(int cantidad) { mP3 = Mathf.Min(mP3 + cantidad, capacidadMP3); Debug.Log("Frutas totales = " + mP3 + " / " + capacidadMP3); }
}
A continuación tienes un ejemplo de cómo podrías refactorizar tu antiguo sistemaInterno para que funcione como un “GameManager”. Este se suscribe al evento de fin de ciclo, llama a los métodos de cálculo de demanda, oferta y precios, y finalmente vende los recursos del jugador.
sistemaInterno)csharpusing UnityEngine; public class GameManager : MonoBehaviour { public ciclos scriptCiclos; public recursos scriptRecursos; public demandaMercado scriptDemandaMercado; public ofertaMercado scriptOfertaMercado; public preciosMercado scriptPreciosMercado; private void OnEnable() { // Nos suscribimos al evento para que, cuando termine el ciclo, // se ejecuten las acciones del mercado y la venta de recursos. scriptCiclos.onCicloCompleto += OnCicloCompleto; } private void OnDisable() { scriptCiclos.onCicloCompleto -= OnCicloCompleto; } private void OnCicloCompleto() { // 1) Recalcular Demanda scriptDemandaMercado.CalcularDemanda(); // 2) Recalcular Oferta scriptOfertaMercado.CalcularOferta(); // 3) Calcular Precios de mercado scriptPreciosMercado.CalcularPreciosMP(); // 4) Vender los recursos del jugador VenderRecursos(); } private void VenderRecursos() { // Vender MP1 (Grano) int cantidadMP1 = scriptRecursos.mP1; float precioMP1 = scriptPreciosMercado.precioMercado[0]; float dineroMP1 = precioMP1 * cantidadMP1; scriptRecursos.dinero += dineroMP1; scriptRecursos.mP1 = 0; Debug.Log($"[Venta] {cantidadMP1} Grano a {precioMP1:0.00} = {dineroMP1}. Dinero total: {scriptRecursos.dinero}"); // Vender MP2 (Hortalizas) int cantidadMP2 = scriptRecursos.mP2; float precioMP2 = scriptPreciosMercado.precioMercado[1]; float dineroMP2 = precioMP2 * cantidadMP2; scriptRecursos.dinero += dineroMP2; scriptRecursos.mP2 = 0; Debug.Log($"[Venta] {cantidadMP2} Hortalizas a {precioMP2:0.00} = {dineroMP2}. Dinero total: {scriptRecursos.dinero}"); // Vender MP3 (Frutas) int cantidadMP3 = scriptRecursos.mP3; float precioMP3 = scriptPreciosMercado.precioMercado[2]; float dineroMP3 = precioMP3 * cantidadMP3; scriptRecursos.dinero += dineroMP3; scriptRecursos.mP3 = 0; Debug.Log($"[Venta] {cantidadMP3} Frutas a {precioMP3:0.00} = {dineroMP3}. Dinero total: {scriptRecursos.dinero}"); } }
preciosMercadoEn tu script de precios, la principal corrección es usar demandaMP[i] y ofertaMP[i] en lugar de tratarlos como métodos. Quedaría así:
csharpusing UnityEngine; public class preciosMercado : MonoBehaviour { public demandaMercado DemandaMercado; public ofertaMercado OfertaMercado; public float alfa = 0.1f; // Precios bases public float[] precioBase = new float[9] { 1f, 3f, 5f, 0f, 0f, 0f, 0f, 0f, 0f }; // Precios que se recalculan public float[] precioMercado = new float[9]; public void CalcularPreciosMP() { for (int i = 0; i < precioBase.Length; i++) { float demanda = DemandaMercado.demandaMP[i]; float oferta = OfertaMercado.ofertaMP[i]; float factor = 1f + alfa * (demanda - oferta); if (factor < 0) factor = 0; precioMercado[i] = precioBase[i] * factor; } Debug.Log("PRECIOS FINALES: " + "\nGrano = " + precioMercado[0] + "\nHortalizas = " + precioMercado[1] + "\nFrutas = " + precioMercado[2]); } }
demandaMercado, asegúrate de que el método sea void Start() con S mayúscula (Unity lo requiere para que se ejecute automáticamente).mP4, mP5, etc.) según la cantidad de tipos de materias primas que realmente necesites transformar en dinero.sistemaInterno) en lugar de GameManager, simplemente cambia la cabecera de la clase y el nombre de archivo, pero la lógica interna es la misma.Con estos cambios, tu “GameManager” (antes sistemaInterno) se encargará de orquestar el flujo al final de cada ciclo: recalculando la Demanda, la Oferta, actualizando Precios y, por último, vendiendo automáticamente lo producido por el jugador.