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"

UE4のC++入門について

C++で、キーを入力するとメニュー画面ぽいのが出てくる処理をやりたく、 web上にある様々な資料を見て、やってみたのですが、ブループリントの資料ばかりでよく意味が分かりません。 デフォルトの1人称視点の弾を撃つ処理を行っているクラスを利用して、Tボタンを押したというのは、判断できるのですが、そこから、画面を出すことができず、悩んでいます。

また、サーバだけで行う処理を書きたいのですが、これについては調べ方が悪いのか、資料が全くなく困っています。

一応、QtやDXlibなどを触ったことがあるし、C++の文法とかは大丈夫だと思いますし、 Dxlibで3Dゲームを簡単なところまで作ったことであるので、3Dの知識は入門程度は大丈夫だと思うのですが、 いいUE4のC++資料がありましたら、教えてください。

Product Version: UE 4.18
Tags:
more ▼

asked Mar 06 '18 at 11:41 AM in Japanese

avatar image

cmd_testkusa
7 2 2 6

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

1 answer: sort voted first

C++でウィジェットを作成&表示させる場合、まずヘッダファイルに以下のような変数を定義します。

UPROPERTY(EditDefaultsOnly, Category = "UI")
TSubclassOf UseWidgetClass;
UUserWidget* MyWidget;
この時ヘッダ上部に
class UUSerWidget;
と前方宣言をします。 続いてCPPのTキーが押された時に呼び出される関数内に
MyWidget = CreateWidget(GetWorld(), UseWidgetClass);
if (MyWidget)
{
    MyWidget->AddToViewport();
}
と書きます。ここでウィジェットの作成とビューポートへの追加を行っています。 この時 #include "UserWidget.h" を忘れずに追加してください。

UserWidgetを取り扱う場合は プロジェクト名.Build.csPublicDependencyModuleNames "UMG" を追加してください。追加をし忘れた場合はリンカエラーとなります。

PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "HeadMountedDisplay", /*追加*/"UMG" });

次にサーバーだけで行う処理ですが if (Role == ROLE_Authority) と書くことで、このプログラムを実行しているマシンがサーバー側かを調べられます。

先程のウィジェットの作成&画面表示を if (Role == ROLE_Authority) で囲むとサーバー側のみウィジェットが作成され、クライアント側はキーを押しても何も生成されないという処理が出来ます。

more ▼

answered Mar 06 '18 at 02:58 PM

avatar image

PAVI_PAVI
631 3 3 6

avatar image cmd_testkusa Mar 07 '18 at 01:08 AM

素早い返答ありがとうございます。 お陰様でできました。私がちょっと抜けてたところがあったので、下記に書いておきます。

MyProject2.Build.cs

 PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "HeadMountedDisplay" , "UMG" });
 PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" };

UMGとSlateの記述を追加。

Character.h上部

 #include "Runtime/CoreUObject/Public/UObject/ConstructorHelpers.h"
 #include "UserWidget.h"

Character.cppのキー入力時の処理

         // menuキーが押されたら
         if (this->bmenu == 1 && this->menuflag == false)
         {
             this->menuflag = true;
             MyWidget = CreateWidget<UUserWidget>(GetWorld(), UseWidgetClass);
 
             if (MyWidget)
             {
                 MyWidget->AddToViewport();
             }
 
             UE_LOG(LogTemp, Warning, TEXT("Hello! IN %d"), 22);
         }
         // menuキーから指が離れたら
         if (this->bmenu == 0 && this->menuflag == true)
         {
             this->menuflag = false;
 
             if (MyWidget)
             {
                 MyWidget->RemoveFromParent();
             }
 
             UE_LOG(LogTemp, Warning, TEXT("Hello! OUT %d"), 22);
         }

Character.cppのコンストラクタ

 static ConstructorHelpers::FClassFinder<UUserWidget> WidgetAsset(TEXT("/Game/FirstPerson/menu"));
     if (WidgetAsset.Succeeded())
     {
         // Assign the class of the loaded asset to the WigetClass variable, which is a "subclass" of UUserWidget : Which our asset class is 
         UseWidgetClass = WidgetAsset.Class;
     }


あとは、/Game/FirstPersonでmenuという名前のウィジェットブループリントを作って、適当に文字でも書いておけば問題ないですね。

返答ありがとうございました。

(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