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:
ActorAiActorB. - Defineix una variable
HealthenActorA. - Fes que
ActorBpugui llegir i modificar la variableHealthdeActorA.
Exercici 2: Comunicació amb Funcions
- Defineix una funció
UpdateScoreenActorAque actualitzi una variableScore. - Fes que
ActorBcridi la funcióUpdateScoredeActorAquan es produeixi un esdeveniment específic.
Exercici 3: Comunicació amb Esdeveniments
- Defineix un esdeveniment personalitzat
OnScoreUpdatedenActorA. - Fes que
ActorBcridi l'esdevenimentOnScoreUpdateddeActorAquan 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
