using UnityEngine; using System; public class pre...

Criado em: 2 de março de 2025

Respondido usando O1 por Chat01

Pergunta

using UnityEngine;
using System;

public class preciosMercado : MonoBehaviour
{
public demandaMercado DemandaMercado;
public ofertaMercado OfertaMercado;

text
public 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?

Pensamento

Adjusting code for accuracy

I’m examining the Unidad method syntax and identifying a method definition as a property. This adjustment aligns with Unity's method signature.

Identifying the issue

OK, let me see. The error indicates that "demandaMercado.demandaMP" is a property, not a method. This might be a conflict in its definition or with the names of "demandaMP" and "demandaMercado".

Reasoned about method invocation error for 6 seconds

Resposta

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í:

csharp
public float demandaMP; public float ofertaMP;

o

csharp
public float[] demandaMP; public float[] ofertaMP;

en lugar de métodos como:

csharp
public float demandaMP(int i) public float ofertaMP(int i)

Entonces no podrías usar:

csharp
demandaMercado.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:

    csharp
    public 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.

Pergunta

using UnityEngine;

public class ofertaMercado : MonoBehaviour
{
public recursos scriptRecursos;

text
public 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;

text
public 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

Pensamento

Reasoned for a couple of seconds

Resposta

En tu script preciosMercado estás haciendo algo como:

csharp
float 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:

csharp
float demanda = DemandaMercado.demandaMP[i]; float oferta = OfertaMercado.ofertaMP[i];

Así evitarás el error de compilación. De forma resumida:

  1. demandaMP y ofertaMP están declarados como float[].
  2. Para obtener un elemento en el índice i, debes usar demandaMP[i], no demandaMP(i).
  3. El error "Non-invocable member 'X' cannot be used like a method" aparece porque el compilador detecta que demandaMP y ofertaMP son miembros (arreglos), no funciones.

Compartilhar esta Q&A