En aquest tema, explorarem conceptes avançats de C# que són especialment útils per al desenvolupament de jocs en Unity. Aquests conceptes inclouen delegats, esdeveniments, expressions lambda, LINQ i patrons de disseny. Aquests elements permeten escriure codi més eficient, modular i mantenible.
Índex del Tema
- Delegats
- Esdeveniments
- Expressions Lambda
- LINQ (Language Integrated Query)
- Patrons de Disseny
- Delegats
Què és un Delegat?
Un delegat és un tipus que representa referències a mètodes amb una signatura específica. Els delegats són útils per passar mètodes com a arguments a altres mètodes.
Exemple de Delegat
// Definició d'un delegat public delegate void MyDelegate(string message); public class DelegateExample { // Mètode que coincideix amb la signatura del delegat public void PrintMessage(string message) { Debug.Log(message); } public void Start() { // Instanciació del delegat MyDelegate del = PrintMessage; // Crida al mètode a través del delegat del("Hola, món!"); } }
Explicació
- Definició del Delegat:
public delegate void MyDelegate(string message);
- Mètode que Coincideix amb la Signatura:
PrintMessage
- Instanciació i Ús del Delegat:
MyDelegate del = PrintMessage;
idel("Hola, món!");
- Esdeveniments
Què és un Esdeveniment?
Els esdeveniments permeten que una classe notifiqui a altres classes quan alguna cosa succeeix. Els esdeveniments es basen en delegats.
Exemple d'Esdeveniment
public class EventExample { // Definició d'un delegat per a l'esdeveniment public delegate void MyEventHandler(string message); // Definició de l'esdeveniment public event MyEventHandler OnMessage; public void TriggerEvent(string message) { // Comprovació i invocació de l'esdeveniment if (OnMessage != null) { OnMessage(message); } } } public class EventListener { public void Start() { EventExample example = new EventExample(); // Subscripció a l'esdeveniment example.OnMessage += HandleMessage; example.TriggerEvent("Esdeveniment activat!"); } // Mètode que maneja l'esdeveniment public void HandleMessage(string message) { Debug.Log(message); } }
Explicació
- Definició del Delegat i Esdeveniment:
public delegate void MyEventHandler(string message);
ipublic event MyEventHandler OnMessage;
- Subscripció a l'Esdeveniment:
example.OnMessage += HandleMessage;
- Invocació de l'Esdeveniment:
OnMessage(message);
- Expressions Lambda
Què és una Expressió Lambda?
Les expressions lambda són una manera concisa d'escriure mètodes anònims utilitzant la sintaxi =>
.
Exemple d'Expressió Lambda
public class LambdaExample { public void Start() { // Expressió lambda que imprimeix un missatge System.Action<string> printMessage = message => Debug.Log(message); printMessage("Hola des de lambda!"); } }
Explicació
- Definició de l'Expressió Lambda:
message => Debug.Log(message);
- Ús de l'Expressió Lambda:
printMessage("Hola des de lambda!");
- LINQ (Language Integrated Query)
Què és LINQ?
LINQ és un conjunt de mètodes que permeten realitzar operacions de consulta sobre col·leccions de dades de manera similar a SQL.
Exemple de LINQ
using System.Linq; public class LINQExample { public void Start() { int[] numbers = { 1, 2, 3, 4, 5, 6 }; // Ús de LINQ per filtrar números parells var evenNumbers = numbers.Where(n => n % 2 == 0); foreach (var num in evenNumbers) { Debug.Log(num); } } }
Explicació
- Definició de la Col·lecció:
int[] numbers = { 1, 2, 3, 4, 5, 6 };
- Ús de LINQ per Filtrar:
var evenNumbers = numbers.Where(n => n % 2 == 0);
- Iteració sobre el Resultat:
foreach (var num in evenNumbers)
- Patrons de Disseny
Què és un Patró de Disseny?
Els patrons de disseny són solucions generals reutilitzables per a problemes comuns en el disseny de programari.
Exemple de Patró Singleton
El patró Singleton assegura que una classe només tingui una instància i proporciona un punt d'accés global a aquesta instància.
public class SingletonExample { private static SingletonExample instance; // Constructor privat per evitar la instanciació directa private SingletonExample() { } public static SingletonExample Instance { get { if (instance == null) { instance = new SingletonExample(); } return instance; } } public void PrintMessage() { Debug.Log("Singleton instance"); } }
Explicació
- Instància Estàtica:
private static SingletonExample instance;
- Constructor Privat:
private SingletonExample() { }
- Propietat per Accedir a la Instància:
public static SingletonExample Instance
Exercicis Pràctics
Exercici 1: Delegats i Esdeveniments
- Crea un delegat que accepti dos enters i retorni la seva suma.
- Defineix un esdeveniment que utilitzi aquest delegat.
- Escriu una classe que es subscrigui a l'esdeveniment i imprimeixi el resultat de la suma.
Solució
public delegate int SumDelegate(int a, int b); public class EventSumExample { public event SumDelegate OnSum; public void TriggerSum(int a, int b) { if (OnSum != null) { int result = OnSum(a, b); Debug.Log("Resultat de la suma: " + result); } } } public class SumListener { public void Start() { EventSumExample example = new EventSumExample(); example.OnSum += Sum; example.TriggerSum(3, 4); } public int Sum(int a, int b) { return a + b; } }
Exercici 2: Expressions Lambda i LINQ
- Crea una llista de números enters.
- Utilitza una expressió lambda per filtrar els números que són més grans que 5.
- Imprimeix els números filtrats.
Solució
using System.Collections.Generic; using System.Linq; public class LambdaLINQExample { public void Start() { List<int> numbers = new List<int> { 1, 2, 3, 6, 7, 8 }; var filteredNumbers = numbers.Where(n => n > 5); foreach (var num in filteredNumbers) { Debug.Log(num); } } }
Conclusió
En aquest tema, hem explorat conceptes avançats de C# que són molt útils per al desenvolupament de jocs en Unity. Hem après sobre delegats, esdeveniments, expressions lambda, LINQ i patrons de disseny. Aquests conceptes ens permeten escriure codi més eficient i mantenible. En el proper tema, aprofundirem en les coroutines i la programació asíncrona en Unity.
Curs de Unity
Mòdul 1: Introducció a Unity
- Introducció a Unity i Instal·lació
- Visió General de la Interfície de Unity
- Creant el Teu Primer Projecte
- Objectes de Joc Bàsics i Components
Mòdul 2: Programació Bàsica en Unity
- Introducció a C# per a Unity
- Creant i Adjuntant Scripts
- Entenent MonoBehaviour
- Gestió Bàsica d'Entrades
Mòdul 3: Treballant amb Actius
- Important i Gestionant Actius
- Utilitzant la Botiga d'Actius
- Creant i Utilitzant Prefabs
- Animació Bàsica
Mòdul 4: Física i Col·lisions
- Introducció a la Física de Unity
- Rigidbody i Col·liders
- Detecció Bàsica de Col·lisions
- Utilitzant Materials de Física
Mòdul 5: Interfície d'Usuari (UI)
- Introducció a la UI de Unity
- Creant i Personalitzant Elements de UI
- Gestió d'Esdeveniments de UI
- Creant Menús i HUDs
Mòdul 6: Àudio en Unity
- Introducció a l'Àudio en Unity
- Important i Utilitzant Clips d'Àudio
- Programació Bàsica d'Àudio
- Àudio 3D i So Espacial
Mòdul 7: Programació Avançada
- Conceptes Avançats de C# per a Unity
- Coroutines i Programació Asíncrona
- Objectes Scriptables
- Editors Personalitzats i Gizmos
Mòdul 8: Física Avançada i IA
- Tècniques Avançades de Física
- Pathfinding i Navegació
- Programació Bàsica d'IA
- Màquines d'Estats i Arbres de Comportament
Mòdul 9: Optimització i Rendiment
- Tècniques de Perfilat i Optimització
- Gestió de Memòria
- Reduint Draw Calls
- Optimitzant Física i Col·lisions