Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

167
Vistas
Necesito ayuda para definir una arquitectura para mi juego de cartas en Unity

Actualmente estoy trabajando en un juego inspirado en Ratropolis en Unity, lo que significa que el jugador tendrá que jugar cartas de su mano para lograr ciertas acciones en el mundo, como conseguir algo de dinero o ese tipo de cosas.

No estoy seguro de cómo implementar esto, y estoy muy confundido por decir lo menos. Básicamente, hasta ahora había estado usando un objeto programable llamado CardData, que se parece a esto: (tenga en cuenta que la línea CardsEffect no estaba presente hasta ayer, y esto es lo que me confunde)

 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Serialization; [CreateAssetMenu] public class CardData : ScriptableObject { //This will contain all the cards information. public string cardName, description; public int moneyCost, natureCost, foodCost; public Texture2D texture; //this is for prototyping only, textures will be replaced by a prefab. public CardsEffect cardEffect; // CardsEffect is a public class that I created for my spells class to Inherit from. I am not sure about this tho }

Buscando en línea, vi que muchas personas recomendaban crear una clase pública que mantuviera los vacíos de los efectos, de modo que pudiera crear una clase para cada carta que heredara de ella. Así que esto es lo que hice:

 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; [System.Serializable] public class CardsEffect { private GameObject resourceController; public CardsEffect() { } public bool unplayable; [Header("When played")] public int moneyBonus; public int natureBonus; public int foodBonus; [Header("When drawn")] public int drawMoneyBonus; public int drawNatureBonus; public int drawFoodBonus; public void OnDraw() { } public void OnPlay() { } }

Pero me doy cuenta de que realmente no sé cómo usar esto. Básicamente, lo que estaba pensando era crear vacíos públicos en la clase CardsEffect con parámetros, como este para poder llamar fácilmente a los vacíos de las clases heredadas, pero no estoy seguro de que sea bueno.

 DrawCards(int cardsToDraw) { target player draws cardsToDraw cards; }

Además, no entiendo cómo implementar estas clases ya que no se heredan de MonoBehaviour, no puedo adjuntarlas a mi ScriptableObject y no puedo crear un CardsEffect usando los vacíos. Como puede ver, estoy muy confundido, y realmente agradecería algunos consejos al respecto.

Gracias por leerme, un saludo

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Mi sugerencia es separar los datos y la lógica del juego en diferentes clases. La clase lógica dice que CardCtrl hereda de MonoBehaviour y la clase de datos no. CardCtrl se adjunta al objeto del juego de cartas. Los datos de la tarjeta son solo instancias en la memoria. Se podría hacer referencia en CardCtrl .

Debe crear una clase DataManager para inicializar o cargar esas instancias de datos de tarjeta cuando sea necesario. No tengas miedo de crear demasiadas clases.

muestra sencilla:

 // put each class in a new `cs` script with proper name(same with class name). public class CardData { public int key; public int attack; public int cost; // other data you need } public class CardDataMgr: MonoBehaviour // attach this to a game object { Dictionary<int, CardData> dataDict = new Dictionary<int, CardData>(); // the int here is card data key private void Awake() { LoadData(); } public void LoadData() { // load from files or codes or server dataDict.Add(1, new CardData() { key = 1, attack = 100, cost = 100 }); // besure the keys are the same dataDict.Add(2, new CardData() { key = 2, attack = 100, cost = 100 }); } public CardData GetCardData(int key) { return dataDict[key]; } } public class CardCtrl: MonoBehaviour // attach this to the card prefab or card game object { int key; int cost; int attack; public void InitWithCardKey(CardDataMgr mgr, int key) // call this when you need a new Card, pass in the CardDataMgr in the scene(or you could make it into a singleton) { this.key = key; // take a record of key in case for future usage var data = mgr.GetCardData(key); this.cost = data.cost; this.attack = data.attack; } // following are other logic that you need public void OnDraw() { } public void OnKilled() { } }
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda