En aquest tema, aprendrem a crear classes en C++ dins d'Unreal Engine. Les classes són fonamentals per a la programació orientada a objectes i ens permeten encapsular dades i funcionalitats en una sola entitat. A Unreal Engine, les classes en C++ són essencials per crear actors, components i altres elements del joc.
Objectius
- Entendre la sintaxi bàsica per crear classes en C++.
- Aprendre a definir propietats i mètodes dins d'una classe.
- Integrar classes C++ amb l'editor d'Unreal Engine.
- Crear una classe d'actor personalitzada.
- Creant una Classe Bàsica
1.1. Definició de la Classe
Una classe en C++ es defineix utilitzant la paraula clau class seguida del nom de la classe. Aquí teniu un exemple bàsic:
// MyActor.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"
UCLASS()
class MYPROJECT_API AMyActor : public AActor
{
GENERATED_BODY()
public:
// Constructor
AMyActor();
protected:
// Funció que es crida quan el joc comença o quan l'actor es genera
virtual void BeginPlay() override;
public:
// Funció que es crida cada frame
virtual void Tick(float DeltaTime) override;
};1.2. Implementació de la Classe
Després de definir la classe en el fitxer de capçalera (.h), hem d'implementar les seves funcions en el fitxer de codi (.cpp):
// MyActor.cpp
#include "MyActor.h"
// Constructor
AMyActor::AMyActor()
{
// Establir que aquest actor es cridi cada frame
PrimaryActorTick.bCanEverTick = true;
}
void AMyActor::BeginPlay()
{
Super::BeginPlay();
// Codi d'inicialització
}
void AMyActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
// Codi que s'executa cada frame
}
- Propietats i Mètodes
2.1. Afegint Propietats
Les propietats són variables membres de la classe. Podem afegir propietats a la nostra classe AMyActor de la següent manera:
// MyActor.h
UCLASS()
class MYPROJECT_API AMyActor : public AActor
{
GENERATED_BODY()
public:
AMyActor();
protected:
virtual void BeginPlay() override;
public:
virtual void Tick(float DeltaTime) override;
// Propietat de tipus float
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="My Properties")
float MyFloatProperty;
};2.2. Afegint Mètodes
Els mètodes són funcions membres de la classe. Podem afegir mètodes a la nostra classe AMyActor de la següent manera:
// MyActor.h
UCLASS()
class MYPROJECT_API AMyActor : public AActor
{
GENERATED_BODY()
public:
AMyActor();
protected:
virtual void BeginPlay() override;
public:
virtual void Tick(float DeltaTime) override;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="My Properties")
float MyFloatProperty;
// Mètode personalitzat
UFUNCTION(BlueprintCallable, Category="My Methods")
void MyCustomMethod();
};
// MyActor.cpp
#include "MyActor.h"
AMyActor::AMyActor()
{
PrimaryActorTick.bCanEverTick = true;
}
void AMyActor::BeginPlay()
{
Super::BeginPlay();
}
void AMyActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
void AMyActor::MyCustomMethod()
{
// Implementació del mètode personalitzat
}
- Integració amb l'Editor d'Unreal Engine
3.1. Compilació i Creació d'Instàncies
Després de definir i implementar la nostra classe, hem de compilar el projecte. Un cop compilat, podem crear instàncies de la nostra classe directament des de l'editor d'Unreal Engine.
3.2. Utilitzant Blueprints
Les propietats i mètodes que hem definit amb UPROPERTY i UFUNCTION es poden utilitzar en Blueprints, permetent una integració fluida entre C++ i l'editor visual.
Exercici Pràctic
Exercici 1: Creant una Classe d'Actor Personalitzada
- Crea una nova classe d'actor anomenada
ACustomActor. - Afegiu una propietat de tipus
int32anomenadaHealth. - Afegiu un mètode anomenat
TakeDamageque redueixi el valor deHealth. - Implementa la lògica per a
TakeDamageen el fitxer.cpp.
Solució
// CustomActor.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "CustomActor.generated.h"
UCLASS()
class MYPROJECT_API ACustomActor : public AActor
{
GENERATED_BODY()
public:
ACustomActor();
protected:
virtual void BeginPlay() override;
public:
virtual void Tick(float DeltaTime) override;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Properties")
int32 Health;
UFUNCTION(BlueprintCallable, Category="Methods")
void TakeDamage(int32 DamageAmount);
};
// CustomActor.cpp
#include "CustomActor.h"
ACustomActor::ACustomActor()
{
PrimaryActorTick.bCanEverTick = true;
Health = 100; // Valor inicial de Health
}
void ACustomActor::BeginPlay()
{
Super::BeginPlay();
}
void ACustomActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
void ACustomActor::TakeDamage(int32 DamageAmount)
{
Health -= DamageAmount;
if (Health < 0)
{
Health = 0;
}
}Conclusió
En aquest tema, hem après a crear classes en C++ dins d'Unreal Engine, definir propietats i mètodes, i integrar aquestes classes amb l'editor d'Unreal Engine. Aquestes habilitats són fonamentals per a qualsevol desenvolupador que vulgui aprofitar al màxim el poder de C++ en Unreal Engine. En el proper tema, explorarem com integrar C++ amb Blueprints per crear funcionalitats més complexes i interactives.
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
