UBES Academy

Guía de C# para Videojuegos

Material interactivo con ejemplos gamificados · UBES Academy

🎮 Unity & C# 📐 POO Completa ✍️ Ejercicios prácticos 🧠 Quiz por sección ⚡ Editor en vivo
📈 Tu progreso 0 de 15 pasos
📐 Convenciones y Buenas Prácticas
1
🐪camelCase
Convención para variables y campos privados

camelCase es la convención donde la primera palabra va en minúscula y cada palabra siguiente comienza con mayúscula, sin espacios. Se usa para variables locales, parámetros y campos privados.

int playerHealth = 100;
float movementSpeed = 5.5f;
string currentWeapon = "Espada Legendaria";
bool isGameOver = false;
Correcto: playerScore, enemyCount, isGameOver
Incorrecto: PlayerScore, enemy_count, isgameover

✍️ Ejercicio: Completa el código

Declara una variable camelCase para guardar la cantidad de vidas del jugador con valor 3, y otra para el nombre del nivel actual.

int = 3; string = "Nivel 1";

🧠 Quiz Rápido

2
🏛️PascalCase
Para clases, métodos públicos y propiedades

PascalCase es igual que camelCase pero la primera letra también va en mayúscula. Se usa para clases, métodos públicos, propiedades y enumeraciones.

public class EnemyController { }
public void TakeDamage(int damage) { }
public int MaxHealth { get; set; }
public enum GameState { Playing, Paused, GameOver }
💡
Regla fácil: ¿Es una clase o método? → PascalCase. ¿Es una variable o campo? → camelCase.

✍️ Ejercicio: Completa el código

Escribe el nombre correcto en PascalCase para una clase que controla al jugador y un método que le cura vida.

public class { } public void (int amount) { }

🧠 Quiz Rápido

3
🧹Código Limpio y Legible
Readability, Refactoring y Clean Code

El código limpio es aquel que cualquier programador puede leer y entender rápidamente. No solo tú ahora, sino tú mismo en 6 meses.

🔀 Antes vs Después — Toggle interactivo

void u(){if(h>0){h-=d;if(h<=0){d=true;}}}
void UpdatePlayerHealth()
{
  if (health > 0)
  {
    health -= damageReceived;
    if (health <= 0)
    {
      isDead = true;
    }
  }
}

♻️ Refactoring — Toggle interactivo

void Update()
{
  if (Input.GetKey(KeyCode.W)) transform.position += Vector3.forward * 5 * Time.deltaTime;
  if (Input.GetKey(KeyCode.S)) transform.position += Vector3.back * 5 * Time.deltaTime;
  if (Input.GetKey(KeyCode.A)) transform.position += Vector3.left * 5 * Time.deltaTime;
  if (Input.GetKey(KeyCode.D)) transform.position += Vector3.right * 5 * Time.deltaTime;
}
private float playerSpeed = 5f;

void Update()
{
  HandlePlayerMovement();
}

void HandlePlayerMovement()
{
  float horizontal = Input.GetAxis("Horizontal");
  float vertical   = Input.GetAxis("Vertical");
  Vector3 movement = new Vector3(horizontal, 0, vertical);
  transform.position += movement * playerSpeed * Time.deltaTime;
}
🎮
Principio DRY: Don't Repeat Yourself. Si copias y pegas el mismo código dos veces, esa es la señal de que necesitas una función.

🧠 Quiz Rápido

⚙️ Fundamentos de C#
4
📦Variables y Constantes
Guardar datos en el juego

Una variable es un contenedor que puede cambiar su valor durante el juego. Una constante guarda un valor que nunca cambia.

📦 Variables

int    playerScore  = 0;       // Puntos del jugador
float  playerHealth = 100.5f; // Vida decimal
string playerName   = "Héroe"; // Nombre del personaje
bool   hasKey       = false;  // ¿Tiene la llave?

// Cambian durante el juego:
playerScore  += 100; // Suma 100 puntos
playerHealth -= 25;  // Quita 25 de vida

🔒 Constantes

const float MAX_PLAYER_SPEED = 10f;
const int   MAX_HEALTH        = 100;
const int   LEVEL_COUNT       = 10;

📊 Tipos de Datos Principales

TipoDescripciónEjemplo en juego
intNúmeros enterosint lives = 3;
floatNúmeros decimalesfloat speed = 5.5f;
boolVerdadero / Falsobool isAlive = true;
stringTextostring weapon = "Espada";
charUn solo carácterchar grade = 'A';

✍️ Ejercicio: Completa el código

Declara una constante para la vida máxima (100) y una variable para la vida actual (75).

const MAX_HEALTH = 100; currentHealth = 75;

🧠 Quiz Rápido

5
🚦Condicionales (if-else)
Tomar decisiones en tu juego

Los condicionales permiten que tu código tome decisiones. Es como preguntarle al juego: "¿Si esto es verdad, haz esto; si no, haz aquello?"

// Sistema de vida
if (health <= 0)
{
  GameOver();
}
else if (health < 30)
{
  ShowLowHealthWarning();
}
else
{
  // El jugador está bien
}

// Sistema de puerta con llave
if (hasKey)
{
  OpenDoor();
  ShowMessage("¡Puerta abierta!");
}
else
{
  ShowMessage("Necesitas una llave");
}

✍️ Ejercicio: Completa el código

Completa este sistema de score: si el puntaje supera 1000, muestra "¡Récord!"; si no, muestra "Sigue intentando".

if (score 1000) { ShowMessage("¡Récord!"); } { ShowMessage("Sigue intentando"); }

🧠 Quiz Rápido

6
🔄Bucles: for, while, do-while
Repetir acciones en el juego

🔁 Bucle for — cuando sabes cuántas veces

// Crear 10 enemigos
for (int i = 0; i < 10; i++)
{
  Instantiate(enemyPrefab, spawnPosition, Quaternion.identity);
}

// Dar puntos combo
for (int combo = 1; combo <= 5; combo++)
{
  score += combo * 100; // 100, 200, 300, 400, 500
}

🔁 Bucle while — mientras algo sea verdad

// Temporizador
float timer = 10f;
while (timer > 0)
{
  timer -= Time.deltaTime;
  UpdateTimerDisplay(timer);
}

🔁 Bucle do-while — siempre ejecuta al menos una vez

// Menú: muestra al menos una vez
int option;
do
{
  ShowMenu();
  option = GetPlayerInput();
  ProcessOption(option);
} while (option != 0); // 0 = salir
⚠️
Cuidado con el while infinito: Asegúrate de que la condición eventualmente sea falsa, o el juego se congelará.

✍️ Ejercicio: Completa el código

Completa este bucle for que genera 5 power-ups en posiciones distintas.

for (int i = 0; i 5; ) { Instantiate(powerUpPrefab, GetSpawnPos(i), Quaternion.identity); }

🧠 Quiz Rápido

7
Operadores
Aritméticos, comparación, lógicos y asignación

➕ Aritméticos

int damage   = 10 + 5;  // Suma    = 15
int health   = 100 - 25; // Resta   = 75
int score    = 10 * 5;  // Mult    = 50
int lives    = 10 / 2;  // División= 5
int remainder= 10 % 3;  // Módulo  = 1

🔍 Comparación

if (playerHealth == 100) // Igual a
if (playerHealth != 0)   // Diferente de
if (playerHealth >  50)  // Mayor que
if (playerHealth <  30)  // Menor que
if (playerHealth >= 50)  // Mayor o igual
if (playerHealth <= 100) // Menor o igual

🔗 Lógicos

if (hasKey && doorLocked)  // AND: ambos verdaderos
if (isDay  || hasLantern)  // OR:  al menos uno
if (!isGameOver)           // NOT: invierte

📝 Asignación

score  = 100;  // Asignación simple
score  += 50; // score = score + 50
health -= 20; // health = health - 20
damage *= 2;  // damage = damage * 2

✍️ Ejercicio: Sistema de golpe crítico

Completa el sistema: si el golpe es crítico, el daño se duplica usando el operador de asignación correcto.

int baseDamage = 10; bool isCriticalHit = true; if (isCriticalHit) { baseDamage 2; // Daño x2 } enemyHealth baseDamage;

🧠 Quiz Rápido

🏗️ Programación Orientada a Objetos
8
🏠Clase y Objeto
El molde y las galletas

Una clase es el molde o plano. Un objeto es la instancia concreta creada a partir de ese molde. Si Player es el molde, jugador1 y jugador2 son los jugadores reales.

public class Player
{
  // Atributos (características)
  public string playerName;
  public int    health;
  public float  speed;

  // Métodos (comportamientos)
  public void Move() { /* mueve al jugador */ }
  public void TakeDamage(int damage) { health -= damage; }
}

// Crear objetos (instancias)
Player jugador1 = new Player();
jugador1.playerName = "Aragorn";
jugador1.health     = 100;

Player jugador2 = new Player();
jugador2.playerName = "Legolas";
jugador2.health     = 90;

✍️ Ejercicio: Crea una clase Weapon

Completa la declaración de la clase y crea un objeto espada con daño 50.

public Weapon { public int damage; public string weaponName; } Weapon sword = new (); sword.damage = 50;

🧠 Quiz Rápido

9
⚙️Métodos y Atributos
Comportamientos y características de los objetos

Los atributos definen las características (datos) de un objeto. Los métodos definen lo que puede hacer (acciones).

public class Enemy
{
  public int health = 50;

  // Sin parámetros, sin retorno
  public void Patrol()
  {
    Debug.Log("Enemigo patrullando...");
  }

  // Con parámetro, sin retorno
  public void TakeDamage(int damage)
  {
    health -= damage;
    if (health <= 0) Die();
  }

  // Sin parámetros, con retorno
  public bool IsAlive()
  {
    return health > 0;
  }

  // Con parámetros y retorno
  public int CalculateDamage(int baseDamage, float multiplier)
  {
    return (int)(baseDamage * multiplier);
  }
}

🧠 Quiz Rápido

10
🧬Herencia
Reutilizar y extender clases existentes

La herencia permite crear una clase hija que hereda todo de la clase padre y además puede agregar o modificar comportamientos.

// Clase padre
public class Enemy
{
  public int health = 50;
  public int damage = 10;
  public virtual void Attack() { Debug.Log("Ataque básico"); }
}

// Clase hija — hereda de Enemy
public class BossEnemy : Enemy
{
  public int armor = 20;

  public BossEnemy()
  {
    health = 200; // Sobreescribe valor heredado
    damage = 25;
  }

  public override void Attack() // Sobreescribe el método
  {
    Debug.Log("¡Ataque especial del jefe!");
  }
}

// Otra clase hija
public class FlyingEnemy : Enemy
{
  public float flyHeight = 5f;
  public void Fly() { Debug.Log("Volando a altura: " + flyHeight); }
}

✍️ Ejercicio: Crea una clase hija

Crea una clase ArmoredEnemy que herede de Enemy y sobreescriba el método Attack.

public class ArmoredEnemy Enemy { public void Attack() { Debug.Log("¡Golpe con armadura!"); } }

🧠 Quiz Rápido

11
🎭Polimorfismo
Muchas formas, un mismo método

El polimorfismo permite que objetos de distintas clases respondan diferente al mismo método. Literalmente "muchas formas".

public class Character
{
  public virtual void Attack() { Debug.Log("Ataque genérico"); }
}

public class Warrior : Character
{
  public override void Attack() { Debug.Log("¡Golpe con espada!"); }
}

public class Mage : Character
{
  public override void Attack() { Debug.Log("¡Bola de fuego!"); }
}

public class Archer : Character
{
  public override void Attack() { Debug.Log("¡Disparo de flecha!"); }
}

// USO: mismo método, resultados distintos
List<Character> party = new List<Character>();
party.Add(new Warrior());
party.Add(new Mage());
party.Add(new Archer());

foreach (Character character in party)
{
  character.Attack(); // Cada uno ataca diferente
}

🧠 Quiz Rápido

12
🔒Encapsulación
Proteger datos de modificaciones incorrectas

La encapsulación oculta los detalles internos y solo expone lo necesario. Evita que otros modifiquen datos de formas inesperadas.

public class Player
{
  public int health = 100; // ¡Peligro! Modificable libremente
}
// Desde cualquier parte:
player.health = -50;    // ¡Error! Vida negativa
player.health = 99999; // ¡Trampa!
public class Player
{
  private int health    = 100;
  private int maxHealth = 100;

  public int Health { get { return health; } }

  public void TakeDamage(int damage)
  {
    if (damage < 0) return;
    health -= damage;
    if (health < 0) health = 0;
  }

  public void Heal(int amount)
  {
    health += amount;
    if (health > maxHealth) health = maxHealth;
  }
}
// Uso correcto:
player.TakeDamage(30); // ✓
player.Heal(20);        // ✓
// player.health = -50; ✗ ERROR de compilación

🧠 Quiz Rápido

⚡ Editor Interactivo — Practica escribiendo código
💡
Cómo funciona: Escribe tu código en el editor, presiona ▶ Ejecutar y el sistema valida tu respuesta. El editor reconoce las variables, tipos y lógica que declaraste.
13
🖥️Editor: Variables y Condicionales
Escribe código y valida tu resultado

Declara las variables indicadas y escribe la condicional correcta. El sistema verificará tu código.

🎮 Variables y Condicionales UBES Editor
🎯 Tarea: Declara int playerHealth = 75; y un if que imprima "Vida baja" si health es menor a 30, o "Vida normal" si no.
🚀
Reto extra: Cambia el valor a 20 y vuelve a ejecutar. ¿Cambia el resultado?
14
🏗️Editor: Clases y Objetos
Crea una clase y usa sus métodos

Crea una clase con atributos y métodos. El sistema detecta tu clase e instancia.

🎮 Clases y Objetos UBES Editor
🎯 Tarea: Crea una clase Enemy con atributos health (int) y name (string). Crea un objeto con new Enemy() y asigna valores a sus atributos.
🚀
Reto extra: Agrega un método TakeDamage(int damage) a tu clase y llámalo en tu objeto.
15
🔄Editor: Bucles
Escribe bucles y ve su resultado

Escribe un bucle que genere salida. El editor simula la ejecución y te muestra el output.

🎮 Bucles y Output UBES Editor
🎯 Tarea: Escribe un bucle for que imprima "Enemigo #1", "Enemigo #2"... hasta "Enemigo #5" usando Debug.Log().
🚀
Reto extra: Modifica el bucle para imprimir 10 enemigos en vez de 5.
🎉🎮🚀

¡Felicitaciones, Programador!

Has completado la Guía Completa de C# para Videojuegos de UBES Academy.
¡Ahora tienes las bases para crear juegos increíbles en Unity!


© 2026 UBES Academy · Todos los derechos reservados

¿Te gustó esta guía?

Aprende esto y mucho más en UBES Academy

Clases en vivo de Videojuegos en Unity y Ciberseguridad para jóvenes desde los 10 años. Virtual, presencial o a domicilio. Primera clase gratis.

🎓 Clase de prueba gratis Ver programas →