using UnityEngine; using System; public class pre...
作成日: 2025年3月2日
作成日: 2025年3月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]); }
}
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.
porque salta este error?
Esa excepción aparece cuando intentas invocar (usando (...)
) algo que en realidad no está declarado como método (por ejemplo, si es una propiedad o un campo). En tu caso, lo más probable es que demandaMP
y ofertaMP
estén definidos como propiedades o variables, no como métodos. Por eso el compilador se queja de que las estás “llamando” en lugar de leer su valor.
Por ejemplo, si en tus scripts demandaMercado
y ofertaMercado
tuvieran algo así:
csharppublic float demandaMP; public float ofertaMP;
o
csharppublic float[] demandaMP; public float[] ofertaMP;
en lugar de métodos como:
csharppublic float demandaMP(int i) public float ofertaMP(int i)
Entonces no podrías usar:
csharpdemandaMercado.demandaMP(i) // <-- Da error, no es un método
sino que tendrías que acceder a la propiedad o al arreglo, por ejemplo:
csharp// Si demandaMP es un arreglo: float demanda = DemandaMercado.demandaMP[i]; float oferta = OfertaMercado.ofertaMP[i]; // O si es una sola variable (no un array): float demanda = DemandaMercado.demandaMP; float oferta = OfertaMercado.ofertaMP;
Asegúrate de que lo que quieres hacer coincide con la firma del código al que llamas:
Si quisiste invocar un método con un índice como parámetro, la definición debería ser algo como:
csharppublic float demandaMP(int index) { // ... }
Si en lugar de un método demandaMP(i)
es un array, la forma correcta de acceder es con demandaMP[i]
.
Si es un simple campo o propiedad sin array, entonces no necesita ni paréntesis ni índices.
En resumen, corrige la definición de demandaMP
y ofertaMP
para que coincidan con lo que necesitas (métodos o propiedades) y corrige en tu código la forma de acceder a esos datos (con ()
o con []
), de modo que no haya conflicto.
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;
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]); }
}
asi son los scripts que contienen los arreglos
En tu script preciosMercado
estás haciendo algo como:
csharpfloat demanda = DemandaMercado.demandaMP(i); float oferta = OfertaMercado.ofertaMP(i);
Pero, según tus otros scripts (demandaMercado
y ofertaMercado
), demandaMP
y ofertaMP
son arreglos, no métodos. Por lo tanto, no puedes usar (...)
para invocarlos, sino que debes usar [...]
para acceder al elemento del array. En otras palabras:
csharpfloat demanda = DemandaMercado.demandaMP[i]; float oferta = OfertaMercado.ofertaMP[i];
Así evitarás el error de compilación. De forma resumida:
demandaMP
y ofertaMP
están declarados como float[]
.i
, debes usar demandaMP[i]
, no demandaMP(i)
.demandaMP
y ofertaMP
son miembros (arreglos), no funciones.