2016-06-24 4 views
2

안녕하세요! 이제 Unreal Engine 4.12를 1 주일간 공부하기 시작했습니다. 귀하의 재량에 따라 C++ 프로그래밍에 대한 지식이 거의 없습니다. (필자가 PHP를 사용하여 코드를 작성했기 때문에 어느 정도 OOP를 이해할 수 있음) - 시각적 스크립팅 (청사진)에 조금 익숙해졌습니다. 내가 원하는 무엇언리얼 엔진 : 파일 경로에서 정적 메쉬로드

새로운 정적 메쉬를로드하여 플레이어의 무기를 변경할 수 , 즉 정적 메쉬는 파일 경로에서 일 것이다. 현재는 청사진 노드가 없기 때문에 많은 기사/포럼에서 내 청사진 노드를 만들 것을 제안하고 있습니다.

나는 약간의 연구를했는데 이것을 찾았습니다 : Dynamic Load Object C++ - 매우 유망합니다. 그러나 그것을 구현할 지식이 없습니다. MyProject.h를 열어 보았고 거기에 붙여 넣었습니다. 다음에 무엇을해야할지 모르겠습니다 - 함수가됩니까? 또는 청사진 노드입니까?

내가 원하는 것을 달성하는 방법에 대한 다른 제안 (또는 지침)이 열려 있습니다. 이를 달성하기위한 다른 방법이 있다면 나와 공유하고 교육하십시오. 고마워요! 감사합니다

,

크리스

답변

1

은 정적 하중은 도우미된다. UFUNCTION (...) 매크로로 해당 함수의 헤더를 표시하는 경우에만 C++ 함수를 호출 할 수 있습니다. this 링크를 참조하십시오.

그래서 함수를 만들 수 있으며 구현시 해당 도우미를 호출 할 수 있습니다. 예를 들면 :

// Helpers.h 
static FORCEINLINE UTexture2D* GetTexture2DByName(const FName& name) { 
    return LoadObjFromPath<UTexture2D>(name); 
} 

UFUNCTION(BlueprintCallable, Category = TCF2Helpers) 
    static UTexture2D* GetTexture2DForBlock(UBuildableBlockInfo* blockInfo); 


// Helpers.cpp 
UTexture2D* UHelpers::GetTexture2DForBlock(UBuildableBlockInfo* blockInfo) 
{ 
    if (!blockInfo) 
     return nullptr; 

    const FString baseFolder = TEXT("Texture2D'/Game/Textures/HUD/%s"); 

    if (blockInfo->IsEmptyHand) 
     return GetTexture2DByName(*FString::Printf(*baseFolder, TEXT("EmptyHand.EmptyHand'"))); 

    // another lines of implementation 
} 

하지만 당신은 당신이 정말 하드가 필요하면, 자신을 요청해야.

if (wInGameMenu) 
{ 
    InGameMenu = CreateWidget<UObjectWidget>(this, wInGameMenu); 
} 

UObjectWidget이 UUserWidget의 후임 : 당신은 내가 가지고있는 기능있는 BeginPlay의 재정에 (이 즉석에서 위젯을 만들기 때문이다)

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Widgets") 
    TSubclassOf<class UObjectWidget> wInGameMenu; 

UPROPERTY(BlueprintReadOnly, Category = "Widgets") 
    UObjectWidget* InGameMenu; 

같은 것을 지정할 수 있습니다 와 위젯 (에디터에서 생성됨)은 그 위젯을 부수적 인 기초로 삼기 위해 부모가됩니다. 그것을 보유하고있는 내 객체의 archetype에 어떤 위젯을 만들어야하는지 정의합니다.

나는 그런 식으로 그것을 구현하는 것 : SceneComponent는 (그래서 당신이 연결할 수있는

  • 만들기 ActorComponent로 무기WeaponManager 만들기 (사람이 나에게 더 나은 방법을 알려줍니다 경우이 변경 될 수 있습니다) 그것 해골 소켓)
  • 모든 무기은 동일한 인터페이스를 기반으로 자체 구현을 갖습니다 (공통 조상에 정의 된 일부 기능을 무시할 수 있습니까?)
  • 하위 무기 (에너지 무기, 총격 무기 등)가 여러 개있을 수 있으므로 올바른 상속을받을 수 있으며 같은 것을 여러 번 구현하지 않아도됩니다.
  • 모든 무기은 메쉬와 속성을 정의합니다. 다시 말하면 메쉬 경로를 하드 코드 한 경우 (구현 이후로 괜찮습니다), 해당 목록의 끝에있는 코드를 사용할 수 있습니다. 또는 archetype에 설정할 수 있습니다 청사진에 코드를 작성하려는 경우 게임에서 열거 AF 모든 무기, 그래서 나는 TMAP에서 그것의 유형으로 정의 무기와 일치하고 간단하게 작업 할 수 있습니다 - 당신은 예를 TArray<TSubclassOf<UWeapon>>
  • 에 대한 (모든 무기를 정의 WeaponManager
  • 그리고 모든 무기 EWeaponType을 정의해야합니다 그것은 수요 (쇼, 변경, 무기 등을 숨길 수)에 그 유형은 무기의 모든 구현에 하드 코딩해야

로드 메쉬 생성자 :.

//TerminalObject.h 
UCLASS() 
class TAUCETIF2_API ATerminalObject : public AStaticMeshActor 
{ 
    GENERATED_UCLASS_BODY() 
}; 

// TerminalObject.cpp 
ATerminalObject::ATerminalObject(const FObjectInitializer& ObjectInitializer) 
: Super(ObjectInitializer) 
{ 

    static ConstructorHelpers::FObjectFinder<UStaticMesh> mesh(TEXT("StaticMesh'/Game/BuildingObjects/Meshes/terminal.terminal'")); 

    checkf(mesh.Succeeded(), TEXT("Failed to find mesh")); 

    auto mc = GetStaticMeshComponent(); 
    checkf(mc, TEXT("Failed to find mesh component")); 

    mc->SetStaticMesh(mesh.Object); 
} 
+0

광범위한 내 맙소사. 이 대답을 내게 맡겨 주셔서 감사합니다. 고마워요! –

관련 문제