x

Search in
Sort by:

Question Status:

Search help

  • Simple searches use one or more words. Separate the words with spaces (cat dog) to search cat,dog or both. Separate the words with plus signs (cat +dog) to search for items that may contain cat but must contain dog.
  • You can further refine your search on the search results page, where you can search by keywords, author, topic. These can be combined with each other. Examples
    • cat dog --matches anything with cat,dog or both
    • cat +dog --searches for cat +dog where dog is a mandatory term
    • cat -dog -- searches for cat excluding any result containing dog
    • [cats] —will restrict your search to results with topic named "cats"
    • [cats] [dogs] —will restrict your search to results with both topics, "cats", and "dogs"

Office Holiday

Epic Games' offices will be on holiday from June 22nd to July 7th. During this period support will be limited. Our offices will reopen on Monday, July 8th. 

[C++][Actor]エディタで設定したパラメータに基づいてActorを構築したい

いつもお世話になります。

Actorを継承したC++クラスのパラメータによって、 ActorのRootComponentに対してAttachToを行いたいと考えていますが、 AttachToを「コンストラクタに近い場所(欲を言えばコンストラクタ)」で行うことはできますでしょうか?

具体的には、

     UPROPERTY( EditAnywhere , BlueprintReadWrite , Category = "Text" , Meta = (ExposeOnSpawn = true , AllowPrivateAccess = true) )
     FString DisplayString;

というプロパティがあり、エディタから上記変数に値を設定します。 その後、

 for( int32 i = 0 ; i < DisplayString.Len() ; i++  )
 {
     auto a = CreateDefaultSubobject<UPaperSpriteComponent>(TEXT("sprite"));
     a->AttachTo(RootComponent);
 }
 

というようにAttachToを「コンストラクタに近い場所(欲を言えばコンストラクタ)」で行いたいのです。

しかしながら、

  • エディタで設定したメンバ変数はコンストラクタではまだ初期化されていない。(これは当然と思います。)

  • Actorから継承したBeginPlayやPostInitializeComponentsなどでAttachToを行うことはできるかもしれませんが、自作のActorをStreamLevelに配置し、StreamLevelをLoadStreamLevelで先読みした際にコンストラクタしか呼ばれず、BeginPlayやPostInitializeComponentsは実際にStreamLevelを表示した際にしか呼び出されない。

という動作になっているようで、 LoadStreamLevelで読み込んだ段階でActor内のコンポーネントの初期化を行えない状況です。

上記、メンバ変数に基づいてコンストラクタ内で初期化する事は可能でしょうか? ※またはLoadStreamLevelで自作Actorを読み込んだ段階でメンバ変数に基づいてコンポーネントの初期化を行うことは可能でしょうか?

以上です。ご教示の程お願いいたします。

Product Version: UE 4.20
Tags:
more ▼

asked Nov 02 '18 at 07:18 PM in Japanese

avatar image

Might
58 6 5 7

(comments are locked)
10|2000 characters needed characters left
Viewable by all users

1 answer: sort voted first

要はBPのコンストラクションスクリプトのようなことをやりたいということでよろしいでしょうか?

コンストラクションスクリプトはBPだと簡単に設定できますが、C++では多少特殊な方法で構築します。詳しくは以下のブログ記事でわかると思います。

http://orfeasel.com/construction-script-based-on-c/

もし用途が違うということであればすみません。

more ▼

answered Nov 03 '18 at 11:17 AM

avatar image

alwei STAFF
3k 125 19 53

avatar image Might Nov 03 '18 at 05:11 PM

いつもご回答ありがとうございます。 まさにやりたい事はリンク先のような内容です。 ただ1点気になったことがあるので、追加質問させていただいてもよろしいでしょうか。 ※質問を別スレッドで立てた方がよい場合は、別スレッドで質問させていただきます。

OnConstructionもコンストラクションスクリプトも、 レベルロード時ではなく、レベルを表示した際に呼び出されているようなのですが、 パフォーマンス的に問題なさそうか気になっております。

実際にNewObjectで30個の新規コンポーネントを作成しAttachToComponentでRootComponentに追加を行う処理をOnConstructionで行ってみましたがFPS落ちもせず問題なく動作しています。 しかしながら大量のコンポーネントを作成するActorをレベル上に配置するとLoadStreamLevelで先読みした状態でも実際にレベルの表示を行うと処理落ちするという事になる事を恐れています。

OnConstructionをLoadStreamLevelで読み込んだ際に呼び出す方法などはないでしょうか? ※実際に現状は処理落ちしておりませんので杞憂かもしれませんが、気になったので質問させていただきました。

avatar image alwei STAFF Nov 03 '18 at 09:21 PM

次回からは別質問は別スレッドで立てるようにお願いします。

パフォーマンス的な問題は必ず発生します。LoadStreamLevel時にヒッチが発生してしまうということは避けられず、それ自体は仕方ないのですが最適化する方法は存在しています。それに詳しい内容をEGJの方が公開してくれています。

[4.20版] UE4におけるLoadingとGCのProfilingと最適化手法

https://www.slideshare.net/EpicGamesJapan/420-ue4loadinggcprofiling-108367408

ただし、コンストラクションスクリプトやOnConstructはエディター実行時とパッケージされたゲーム内では呼び出されるタイミングが違います。私の記憶が正しければそれらはアセットをCookする際に呼び出されており、ゲーム中には負荷として計上されないようになっています。普段は調整がしやすいようにそのように呼び出されているはずです。

avatar image Might Nov 04 '18 at 02:32 AM

ありがとうございます。上記確認いたします。

(comments are locked)
10|2000 characters needed characters left
Viewable by all users
Your answer
toggle preview:

Up to 5 attachments (including images) can be used with a maximum of 5.2 MB each and 5.2 MB total.

Follow this question

Once you sign in you will be able to subscribe for any updates here

Answers to this question