En aquest tema, aprendrem com els diferents Blueprints poden comunicar-se entre ells dins d'Unreal Engine. La comunicació entre Blueprints és essencial per crear comportaments complexos i interactius en els teus projectes. Explorarem diverses tècniques per aconseguir aquesta comunicació, incloent-hi la utilització de variables, funcions, esdeveniments i referències.
Objectius d'Aprenentatge
- Entendre la importància de la comunicació entre Blueprints.
- Aprendre a utilitzar variables i funcions per comunicar-se entre Blueprints.
- Utilitzar esdeveniments per enviar missatges entre Blueprints.
- Crear referències per accedir a altres Blueprints.
- Comunicació Bàsica amb Variables
1.1. Variables Globals
Les variables globals són accessibles des de qualsevol Blueprint. Aquestes variables es poden definir en el GameInstance o en altres Blueprints globals.
Exemple:
// Creem una variable global en el GameInstance UPROPERTY(BlueprintReadWrite, Category="Global Variables") int32 GlobalScore;
1.2. Variables d'Instància
Les variables d'instància són específiques d'un objecte i només són accessibles des d'aquest objecte.
Exemple:
// Creem una variable d'instància en un Blueprint d'actor UPROPERTY(BlueprintReadWrite, Category="Instance Variables") int32 Health;
- Comunicació amb Funcions
2.1. Funcions Públiques
Les funcions públiques poden ser cridades des d'altres Blueprints.
Exemple:
// Definim una funció pública en un Blueprint d'actor UFUNCTION(BlueprintCallable, Category="Communication") void UpdateHealth(int32 NewHealth);
2.2. Cridant Funcions des d'Altres Blueprints
Per cridar una funció d'un altre Blueprint, necessitem una referència a aquest Blueprint.
Exemple:
// Obtenim una referència a un altre Blueprint i cridem la seva funció AActor* TargetActor = GetWorld()->SpawnActor<AActor>(TargetActorClass); if (TargetActor) { TargetActor->UpdateHealth(100); }
- Comunicació amb Esdeveniments
3.1. Esdeveniments Personalitzats
Els esdeveniments personalitzats permeten enviar missatges entre Blueprints de manera asíncrona.
Exemple:
// Definim un esdeveniment personalitzat en un Blueprint UFUNCTION(BlueprintImplementableEvent, Category="Communication") void OnHealthChanged(int32 NewHealth);
3.2. Cridant Esdeveniments des d'Altres Blueprints
Podem cridar esdeveniments personalitzats des d'altres Blueprints de manera similar a les funcions.
Exemple:
// Cridem un esdeveniment personalitzat en un altre Blueprint AActor* TargetActor = GetWorld()->SpawnActor<AActor>(TargetActorClass); if (TargetActor) { TargetActor->OnHealthChanged(100); }
- Creant Referències entre Blueprints
4.1. Referències Directes
Les referències directes permeten accedir a altres Blueprints directament.
Exemple:
// Creem una referència directa a un altre Blueprint UPROPERTY(BlueprintReadWrite, Category="References") AActor* TargetActor;
4.2. Obtenint Referències en Temps d'Execució
Podem obtenir referències a altres Blueprints en temps d'execució utilitzant funcions com GetAllActorsOfClass
.
Exemple:
// Obtenim una referència a un altre Blueprint en temps d'execució TArray<AActor*> FoundActors; UGameplayStatics::GetAllActorsOfClass(GetWorld(), TargetActorClass, FoundActors); if (FoundActors.Num() > 0) { TargetActor = FoundActors[0]; }
Exercicis Pràctics
Exercici 1: Comunicació amb Variables
- Crea dos Blueprints d'actors:
ActorA
iActorB
. - Defineix una variable
Health
enActorA
. - Fes que
ActorB
pugui llegir i modificar la variableHealth
deActorA
.
Exercici 2: Comunicació amb Funcions
- Defineix una funció
UpdateScore
enActorA
que actualitzi una variableScore
. - Fes que
ActorB
cridi la funcióUpdateScore
deActorA
quan es produeixi un esdeveniment específic.
Exercici 3: Comunicació amb Esdeveniments
- Defineix un esdeveniment personalitzat
OnScoreUpdated
enActorA
. - Fes que
ActorB
cridi l'esdevenimentOnScoreUpdated
deActorA
quan es produeixi un esdeveniment específic.
Solucions
Solució Exercici 1
// ActorA.h UPROPERTY(BlueprintReadWrite, Category="Health") int32 Health; // ActorB.cpp AActor* ActorA = GetWorld()->SpawnActor<AActor>(ActorAClass); if (ActorA) { ActorA->Health = 100; }
Solució Exercici 2
// ActorA.h UFUNCTION(BlueprintCallable, Category="Score") void UpdateScore(int32 NewScore); // ActorB.cpp AActor* ActorA = GetWorld()->SpawnActor<AActor>(ActorAClass); if (ActorA) { ActorA->UpdateScore(50); }
Solució Exercici 3
// ActorA.h UFUNCTION(BlueprintImplementableEvent, Category="Score") void OnScoreUpdated(int32 NewScore); // ActorB.cpp AActor* ActorA = GetWorld()->SpawnActor<AActor>(ActorAClass); if (ActorA) { ActorA->OnScoreUpdated(50); }
Conclusió
La comunicació entre Blueprints és una habilitat fonamental per desenvolupar projectes complexos a Unreal Engine. Hem explorat diverses tècniques per aconseguir aquesta comunicació, incloent-hi l'ús de variables, funcions, esdeveniments i referències. Practica aquestes tècniques per millorar la interactivitat i la complexitat dels teus projectes. En el proper tema, aprofundirem en la creació d'objectes interactius utilitzant Blueprints.
Curs d'Unreal Engine
Mòdul 1: Introducció a Unreal Engine
- Què és Unreal Engine?
- Instal·lant Unreal Engine
- Navegant per la Interfície
- Creant el teu Primer Projecte
Mòdul 2: Conceptes Bàsics
Mòdul 3: Blueprints Intermedis
- Variables i Tipus de Dades
- Funcions i Esdeveniments
- Comunicació entre Blueprints
- Creant Objectes Interactius
Mòdul 4: Blueprints Avançats
Mòdul 5: Programació en C++ a Unreal Engine
- Configurant el teu Entorn de Desenvolupament
- Sintaxi Bàsica de C++
- Creant Classes en C++
- Integrant C++ amb Blueprints
Mòdul 6: Programació Avançada en C++
Mòdul 7: Temes Avançats
- Física i Col·lisió
- Renderització i Postprocessament
- Generació de Contingut Procedural
- Desenvolupament de Realitat Virtual