Các macro phản chiếu trong Unreal Engine C++

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, USTRUCTUENUM để 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
BlueprintReadOnlyChỉ đọc trong Blueprint
BlueprintReadWriteĐọc/ghi trong Blueprint
BlueprintAssignableCho phép gán delegate trong Blueprint (chỉ dành cho Multicast)
BlueprintCallableCho phép gọi delegate trong Blueprint (chỉ dành cho Multicast)
EditAnywhereCó thể chỉnh sửa ở cả prototype và instance
EditDefaultsOnlyChỉ chỉnh sửa ở prototype (Blueprint)
EditInstanceOnlyChỉ chỉnh sửa ở instance (đối tượng trong scene)
EditFixedSizeKhóa kích thước mảng động
EditInlineCho phép mở rộng chỉnh sửa object được tham chiếu
VisibleAnywhereChỉ hiển thị, không chỉnh sửa
VisibleDefaultsOnlyChỉ hiển thị ở prototype
VisibleInstanceOnlyChỉ 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 định Tê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;

Thẻ: Unreal Engine UPROPERTY UFUNCTION UCLASS USTRUCT

Đăng vào ngày 23 tháng 9 lúc 12:56