using UnityEngine; public class activarEdificios ...

Creado el: 22 de febrero de 2025

Respondido usando O1 por Chat01

Pregunta

using UnityEngine;

public class activarEdificios : MonoBehaviour
{
public GameObject edificio1;
public GameObject edificio2;
public GameObject edificio3;

text
public edificios contadorEdificios; public edData datosEdificios; public void InstantiateOnClick1() { Instantiate(edificio1, Vector3.zero, Quaternion.identity); contadorEdificios.añadirEdificio1(1); datosEdificios.AñadirPanel1(); } public void InstantiateOnClick2() { Instantiate(edificio2, Vector3.zero, Quaternion.identity); contadorEdificios.añadirEdificio2(1); datosEdificios.AñadirPanel2(); } public void InstantiateOnClick3() { Instantiate(edificio3, Vector3.zero, Quaternion.identity); contadorEdificios.añadirEdificio3(1); datosEdificios.AñadirPanel3(); }

}


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;

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

}


Como le hago para que el script activarEdificios solo instancie el edificio si se tiene x cantidad de dinero contenido en el script recursos, y luego se reste esa cantidad del script recursos, como si se "comprara". Por ejemplo, para el edificio 1 se necesita 1000 de dinero, para el edificio 2 es 2000, y asi

Pensamiento

Setting the scene

I’m setting up a Unity C# script to ensure buildings are instantiated only when the user has enough money to cover the cost. This involves checking the current resources before moving forward with the instantiation.

Reasoned for a few seconds

Respuesta

Para lograr este comportamiento, lo que necesitas es:

  1. Tener una referencia al script recursos en tu script activarEdificios.
  2. Comprobar si hay suficiente dinero antes de instanciar un edificio.
  3. Descontar la cantidad de dinero correspondiente inmediatamente después de la compra.

A continuación, un ejemplo de cómo podrías modificar tu script activarEdificios para lograr esto:

csharp
using UnityEngine; public class activarEdificios : MonoBehaviour { public GameObject edificio1; public GameObject edificio2; public GameObject edificio3; // Referencia a los scripts que ya tienes public edificios contadorEdificios; public edData datosEdificios; // **Nuevo**: Referencia al script "recursos" donde está la variable "dinero" public recursos scriptRecursos; // **Costos** de cada tipo de edificio (puedes editarlos desde el Inspector) public float costoEdificio1 = 1000f; public float costoEdificio2 = 2000f; public float costoEdificio3 = 3000f; public void InstantiateOnClick1() { // Verificamos si el jugador tiene suficiente dinero para el Edificio 1 if (scriptRecursos.dinero >= costoEdificio1) { // Restamos el costo scriptRecursos.dinero -= costoEdificio1; // Instanciamos el edificio Instantiate(edificio1, Vector3.zero, Quaternion.identity); // Llamamos a los métodos que ya usabas contadorEdificios.adirEdificio1(1); datosEdificios.adirPanel1(); } else { Debug.Log("No tienes suficiente dinero para comprar el Edificio 1."); } } public void InstantiateOnClick2() { if (scriptRecursos.dinero >= costoEdificio2) { scriptRecursos.dinero -= costoEdificio2; Instantiate(edificio2, Vector3.zero, Quaternion.identity); contadorEdificios.adirEdificio2(1); datosEdificios.adirPanel2(); } else { Debug.Log("No tienes suficiente dinero para comprar el Edificio 2."); } } public void InstantiateOnClick3() { if (scriptRecursos.dinero >= costoEdificio3) { scriptRecursos.dinero -= costoEdificio3; Instantiate(edificio3, Vector3.zero, Quaternion.identity); contadorEdificios.adirEdificio3(1); datosEdificios.adirPanel3(); } else { Debug.Log("No tienes suficiente dinero para comprar el Edificio 3."); } } }

Pasos importantes:

  • En el Inspector, arrastra tu objeto (que contiene el script recursos) al campo scriptRecursos.
  • Ajusta los valores de costoEdificioX en el Inspector según tus necesidades (por ejemplo, 1000, 2000, 3000).
  • Asegúrate de que tu variable dinero en el script recursos sea lo suficientemente grande como para permitir la compra de los edificios (para tus pruebas iniciales).

Con esto, antes de instanciar el edificio, compruebas si el jugador tiene suficiente dinero; si lo tiene, se “compra” (restando esa cantidad de recursos.dinero) y luego se instancia el edificio. Si no, mostrarás un mensaje de que no tiene el dinero suficiente.

Compartir este Q&A