Unreal Engine cung cấp một hệ thống phản chiếu mạnh mẽ thông qua các macro đặc biệt. Bài viết này tập trung vào cách sử dụng UPROPERTY, UFUNCTION, UCLASS, USTRUCT và UENUM để liên kết C++ với Blueprint một cách linh hoạt.
1. UPROPERTY – Hiển thị thuộc tính trong Blueprint
Cú pháp:
UPROPERTY(Thẻ1, Thẻ2, ..., meta=(Key=Value, ...), Category="Nhóm")
KiểuDữLiệu TênBiến;
| Thẻ | Ý nghĩa |
|---|---|
Category="Nhóm|NhómCon" | Phân loại thuộc tính trong trình chỉnh sửa |
BlueprintReadOnly | Chỉ đọc trong Blueprint |
BlueprintReadWrite | Đọc/ghi trong Blueprint |
BlueprintAssignable | Cho phép gán delegate trong Blueprint (chỉ dành cho Multicast) |
BlueprintCallable | Cho phép gọi delegate trong Blueprint (chỉ dành cho Multicast) |
EditAnywhere | Có thể chỉnh sửa ở cả prototype và instance |
EditDefaultsOnly | Chỉ chỉnh sửa ở prototype (Blueprint) |
EditInstanceOnly | Chỉ chỉnh sửa ở instance (đối tượng trong scene) |
EditFixedSize | Khóa kích thước mảng động |
EditInline | Cho phép mở rộng chỉnh sửa object được tham chiếu |
VisibleAnywhere | Chỉ hiển thị, không chỉnh sửa |
VisibleDefaultsOnly | Chỉ hiển thị ở prototype |
VisibleInstanceOnly | Chỉ hiển thị ở instance |
Ví dụ meta điều khiển
UPROPERTY(EditAnywhere, meta=(DisplayName="Máu Tối Đa"))
float MaxHP;
UPROPERTY(EditAnywhere)
bool bCustomDamage;
UPROPERTY(EditAnywhere, meta=(EditCondition="bCustomDamage"))
float CustomDamageValue;
2. UFUNCTION – Xuất hàm ra Blueprint
UFUNCTION(Thẻ, Category="Nhóm")
KiểuTrảVề TênHàm(ThamSố);
Các thẻ thường dùng
BlueprintCallable: Có thể gọi từ Blueprint. Tham sốint32&trở thành output pin,const int32&là input pin.BlueprintPure: Hàm "sạch" (pure), luôn trả về giá trị, không tạo execution pin.BlueprintImplementableEvent: Khai báo trong C++, định nghĩa trong Blueprint (giống pure virtual).BlueprintNativeEvent: C++ cung cấp định nghĩa mặc địnhTênHàm_Implementation, Blueprint có thể override.
// .h
UFUNCTION(BlueprintNativeEvent, Category="Combat")
void ApplyDamage(int32 Amount);
// .cpp
void AMyActor::ApplyDamage_Implementation(int32 Amount)
{
UE_LOG(LogTemp, Warning, TEXT("Damage %d"), Amount);
}
3. UCLASS – Phản chiếu lớp
UCLASS(Blueprintable, BlueprintType)
class MYPROJECT_API AMyActor : public AActor
{
GENERATED_BODY()
};
Thẻ Blueprintable cho phép Blueprint kế thừa, BlueprintType cho phép dùng lớp này như một biến trong Blueprint.
4. USTRUCT – Cấu trúc dữ liệu có phản chiếu
USTRUCT(BlueprintType)
struct FPlayerStats
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite)
int32 Level;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float Health;
};
5. UENUM – Enum dùng được trong Blueprint
UENUM(BlueprintType)
enum class EWeaponType : uint8
{
Sword UMETA(DisplayName="Kiếm"),
Bow UMETA(DisplayName="Cung"),
Staff UMETA(DisplayName="Gậy")
};
Sử dụng:
UPROPERTY(EditAnywhere, BlueprintReadWrite)
EWeaponType CurrentWeapon;