2017-02-09 2 views
0

Почему нет данных о overheadDialogueWidgetComponent, доступных для редактирования в синем редакторе?UWidgetComponent, не отображающий детали в редакторе Blueprint

Заголовок:

class ABasePaperCharacter : public APaperCharacter 
{ 
    GENERATED_BODY() 
private: 
    UDialogueComponentWrapper* dialogueComponentWrapper; 
... 

каст:

ABasePaperCharacter ::ABasePaperCharacter() 
{ 
    this->dialogueComponentWrapper = NewObject<UDialogueComponentWrapper>(); 
    this->dialogueComponentWrapper->SetUpDialogueComponents(FObjectInitializer::Get(), this->GetRootComponent()); 
... 

Заголовок:

UCLASS() 
class UDialogueComponentWrapper : public UObject 
{ 
    GENERATED_BODY()  
public: 
    void SetUpDialogueComponents(const FObjectInitializer& objectInitializer, USceneComponent* componentToAttachTo); 
private: 
    UPROPERTY(Instanced, EditAnywhere, BlueprintReadWrite, Category = "Dialogue", Meta = (AllowPrivateAccess = true)) 
    UOverheadDialogueWidgetComponent* overheadDialogueWidgetComponent; 

... 

каст:

void UDialogueComponentWrapper::SetUpDialogueComponents(const FObjectInitializer& objectInitializer, USceneComponent* componentToAttachTo) 
{ 
    this->overheadDialogueWidgetComponent = objectInitializer.CreateDefaultSubobject<UOverheadDialogueWidgetComponent>(objectInitializer.GetObj(), TEXT("Dialogue widget component")); 
    this->overheadDialogueWidgetComponent->AttachToComponent(componentToAttachTo, FAttachmentTransformRules::KeepRelativeTransform); 
} 

заголовок:

UCLASS() 
class ECDD_API UOverheadDialogueWidgetComponent : public UWidgetComponent 
{ 
    GENERATED_BODY()  
}; 

enter image description here

ответ

0

Поскольку вы выставляете этот компонент к Blueprints, он не должен быть частным. Они должны быть защищены или открыты для того, чтобы быть подвергнутыми воздействию BP (все же вы можете использовать их из кода). Представьте BP с APaperCharacter как родительский класс. UE создаст свой собственный класс C++, полученный из APaperCharacter, и попытается показать вам свои собственные свойства. А поскольку ваш компонент является приватным, этот сгенерированный класс его не видит, поэтому он не отображается на панели «Сведения».

Я считаю, что UE также предупредит вас во время компиляции C++, что поля, помеченные как UPROPERTY(..), не должны быть закрытыми.

+0

«Они должны быть защищены или открыты для того, чтобы быть подвергнутыми воздействию BP» - на самом деле это не так. Это была бы ужасная архитектура, если бы это было правдой. (см. Meta = (AllowPrivateAccess = true)) Я, тем не менее, испытал, чтобы дать вам преимущество в сомнении. К несчастью, это не сработало. Благодарю вас за помощь! – Jimmyt1988

+0

@ Jimmyt1988 Ну, я не уверен - на основе обсуждения здесь https://forums.unrealengine.com/showthread.php?2125-UPROPERTY-best-pratices-question-(public-private-protected), говорит вкладчик Engine это не может быть, и другой высокопоставленный человек говорит, что может. –

0

Внимание, нет ответов здесь, единственное поражение ...

ABasePaperCharacter:

UCLASS() 
class ECDD_API ABasePaperCharacter : public ABasePaperCharacter 
{ 
    GENERATED_BODY() 
public: 
    ABasePaperCharacter() 
    { 
     this->dialogueComponentWrapper = CreateDefaultSubobject<UDialogueComponentWrapper>(TEXT("Dialogue component wrapper")); 
     this->dialogueComponentWrapper->AttachToComponent(this->GetCapsuleComponent(), FAttachmentTransformRules::KeepRelativeTransform); 
     this->dialogueComponentWrapper->SetUpDialogueComponents(FObjectInitializer::Get(), this->dialogueComponentWrapper); 
    } 
private: 
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Dialogue", Meta = (AllowPrivateAccess = true)) 
     UDialogueComponentWrapper* dialogueComponentWrapper; 
} 

UDialogueComponentWrapper - Обратите внимание на наследование USceneComponent:

UCLASS() 
class UDialogueComponentWrapper : public USceneComponent 
{ 
    GENERATED_BODY() 
public: 
    UDialogueComponentWrapper(); 
    void SetUpDialogueComponents(const FObjectInitializer& objectInitializer, USceneComponent* componentToAttachTo) 
    { 
     this->overheadDialogueWidgetComponent = objectInitializer.CreateDefaultSubobject<UOverheadDialogueWidgetComponent>(objectInitializer.GetObj(), TEXT("Dialogue widget component")); 
     this->overheadDialogueWidgetComponent->AttachToComponent(componentToAttachTo, FAttachmentTransformRules::KeepRelativeTransform); 
    } 
private: 
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Dialogue", Meta = (AllowPrivateAccess = true)) 
     UOverheadDialogueWidgetComponent* overheadDialogueWidgetComponent; 
}; 

UOverheadDialogueWidgetCompon ЛОР:

UCLASS() 
class ECDD_API UOverheadDialogueWidgetComponent : public UBaseWidgetComponent 
{ 
    GENERATED_BODY() 
}; 

Все вышеперечисленное в конечном итоге с этим:

enter image description here enter image description here

я до сих пор вопрос о компоненте не показывая детали внутри своей панели деталей, но по крайней мере я мог теперь измените детали.

Я до сих пор не знаю, почему я не вижу свойства компонента в панели подробностей ... но по крайней мере я могу продолжать делать свою игру.

+1

Привет! Сегодня я испытал ту же проблему, что и вы. IDK, почему мой LightComponent на основе C++ остановил отображение свойств, но поскольку у меня не было никаких применений этого компонента в BP и только несколько ссылок в коде, я ** переименовал свойство ** и угадал, что? Теперь я вижу все свойства. Я также заметил, что я видел ссылку на это свойство в * default по умолчанию *, но это было * NULL *. Если вам это подходит, вы можете попробовать это тоже. –

Смежные вопросы