Hard Reference

// PlayerCharacter.h
#include "Engine/StaticMesh.h" 
#include "Components/StaticMeshComponent.h"

UCLASS()
class MYGAME_API APlayerCharacter : public ACharacter
{
  GENERATED_BODY()

public:
  // Hard Reference - ์—๋””ํ„ฐ์—์„œ ์ง์ ‘ ํ• ๋‹น
  UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Weapon")
  UStaticMesh* WeaponMesh;
  
  // Hard Reference - ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ํ•จ๊ป˜ ๊ฐ€์ ธ๊ฐ€๋Š” ์ปดํฌ๋„ŒํŠธ
  UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components")
  UStaticMeshComponent* WeaponMeshComponent;
};

// PlayerCharacter.cpp
APlayerCharacter::APlayerCharacter()
{
  WeaponMeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("WeaponMeshComponent"));
  
  // Hard Reference - ์ƒ์„ฑ์ž์—์„œ ์ง์ ‘ ๋กœ๋“œ (๊ฒŒ์ž„ ์‹œ์ž‘์‹œ ๋ฐ”๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋จ)
  static ConstructorHelpers::FObjectFinder<UStaticMesh> WeaponMeshAsset(
      TEXT("/Game/Weapons/Sword_Mesh.Sword_Mesh"));
  
  if (WeaponMeshAsset.Succeeded())
  {
    WeaponMesh = WeaponMeshAsset.Object;
    WeaponMeshComponent->SetStaticMesh(WeaponMesh);
  }
}
  • ์ปดํŒŒ์ผ ํƒ€์ž„์— ์˜์กด์„ฑ์ด ๊ฒฐ์ •๋œ๋‹ค
  • ์ฐธ์กฐํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ํ•ญ์ƒ ๋กœ๋“œ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค
    • ์ด๋กœ ์ธํ•ด ์ดˆ๋ฐ˜ ๋กœ๋”ฉ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง„๋‹ค
    • ์ƒ์‹œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๋„ ๋Š˜์–ด๋‚œ๋‹ค
    • ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ์— ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค

Soft Reference

// PlayerCharacter.h
#include "Engine/StreamableManager.h"

UCLASS()
class MYGAME_API APlayerCharacter : public ACharacter
{
  GENERATED_BODY()

public:
  APlayerCharacter();

  // Soft Reference - ๊ฒฝ๋กœ๋งŒ ์ €์žฅ, ์‹ค์ œ ์˜ค๋ธŒ์ ํŠธ๋Š” ๋กœ๋“œ๋˜์ง€ ์•Š์Œ
  UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Weapon")
  TSoftObjectPtr<UStaticMesh> WeaponMeshSoft;

  UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components")
  UStaticMeshComponent* WeaponMeshComponent;

  UFUNCTION(BlueprintCallable)
  void LoadWeaponAsync();
  
  UFUNCTION(BlueprintCallable)
  void LoadWeaponSync();

private:
    FStreamableManager StreamableManager;
};

// PlayerCharacter.cpp
APlayerCharacter::APlayerCharacter()
{
  WeaponMeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("WeaponMeshComponent"));
  
  // Soft Reference - ๊ฒฝ๋กœ๋งŒ ์„ค์ • (๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋˜์ง€ ์•Š์Œ)
  WeaponMeshSoft = TSoftObjectPtr<UStaticMesh>(FSoftObjectPath(TEXT("/Game/Weapons/Sword_Mesh.Sword_Mesh")));
}

void APlayerCharacter::LoadWeaponAsync()
{
  // ๋น„๋™๊ธฐ ๋กœ๋“œ
  StreamableManager.RequestAsyncLoad(
    WeaponMeshSoft.ToSoftObjectPath(),
    FStreamableDelegate::CreateLambda([this]()
    {
      if (UStaticMesh* LoadedMesh = WeaponMeshSoft.Get())
      {
        WeaponMeshComponent->SetStaticMesh(LoadedMesh);
      }
    })
  );
}

void APlayerCharacter::LoadWeaponSync()
{
  // ๋™๊ธฐ ๋กœ๋“œ
  if (UStaticMesh* LoadedMesh = WeaponMeshSoft.LoadSynchronous())
  {
    WeaponMeshComponent->SetStaticMesh(LoadedMesh);
  }
}
  • ํ•„์š” ์‹œ์— ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค (๋น„๋™๊ธฐ ๋กœ๋“œ)
    • ์ดˆ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ ๋‹ค
    • ๋กœ๋“œ ์‹œ ์•ฝ๊ฐ„์˜ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค
  • ๋Œ€์šฉ๋Ÿ‰ ์—์…‹ ๊ด€๋ฆฌ์— ํšจ์œจ์ ์ด๋‹ค

๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ ํ™•์ธ

void APlayerCharacter::CheckReferenceStatus()
{
  // Hard Reference์˜ ๊ฒฝ์šฐ
  bool bHardRefValid = (WeaponMesh != nullptr); // ํ•ญ์ƒ true (์ด๋ฏธ ๋กœ๋“œ๋จ)
  
  // Soft Reference์˜ ๊ฒฝ์šฐ  
  bool bSoftRefLoaded = (WeaponMeshSoft.Get() != nullptr); // ๋กœ๋“œ ํ›„์—๋งŒ true
  bool bSoftRefPathValid = WeaponMeshSoft.IsValid(); // ๊ฒฝ๋กœ๊ฐ€ ์œ ํšจํ•˜๋ฉด true
}

When to use

Hard Reference

  • ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ
    • ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ uojbect์™€์˜ ๊ด€๊ณ„๊ฐ€ ๋ถ€๋ชจ ์ž์‹ ๊ด€๊ณ„๋กœ์„œ, ๋ถ€๋ชจ์—๊ฒŒ Ownership์„ ๋ถ€์—ฌํ•˜๊ณ  ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๋™์ผํ•˜๊ฒŒ ๊ฐ€์ ธ๊ฐ€์•ผ ํ•  ๋•Œ
  • ํ•ญ์‹œ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋˜์–ด ์žˆ์–ด์•ผ ํ•  ๋•Œ

Soft Reference

  • ์ง€์—ฐ ๋กœ๋”ฉ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ
    • ๊ฒŒ์ž„์˜ ์ง„ํ–‰์„ ๋ง‰์ง€ ์•Š์œผ๋ฉด์„œ ๋กœ๋”ฉํ•ด๋„ ๋˜๋Š” ๊ฒฝ์šฐ
  • ์ˆœํ™˜ ์ฐธ์กฐ ๋ฐฉ์ง€
UCLASS()
class APlayerController : public AController
{
  // ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ํ˜„์žฌ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ (์—†์„ ์ˆ˜๋„ ์žˆ์Œ)
  UPROPERTY()
  TWeakObjectPtr<class AInteractableActor> CurrentInteractTarget;
  
  // ํ˜„์žฌ ์žฅ์ฐฉํ•œ ๋ฌด๊ธฐ (๋งจ์†์ผ ์ˆ˜๋„ ์žˆ์Œ)
  UPROPERTY()
  TWeakObjectPtr<class AWeapon> CurrentWeapon;
};
  • ์˜ต์…”๋„ํ•œ ์ฐธ์กฐ
    • ์žˆ์–ด๋„ ๊ทธ๋งŒ, ์—†์–ด๋„ ๊ทธ๋งŒ์ธ ์ฐธ์กฐ

์ถœ์ฒ˜

Categories: ,

Updated: