C++で、キーを入力するとメニュー画面ぽいのが出てくる処理をやりたく、 web上にある様々な資料を見て、やってみたのですが、ブループリントの資料ばかりでよく意味が分かりません。 デフォルトの1人称視点の弾を撃つ処理を行っているクラスを利用して、Tボタンを押したというのは、判断できるのですが、そこから、画面を出すことができず、悩んでいます。
また、サーバだけで行う処理を書きたいのですが、これについては調べ方が悪いのか、資料が全くなく困っています。
一応、QtやDXlibなどを触ったことがあるし、C++の文法とかは大丈夫だと思いますし、 Dxlibで3Dゲームを簡単なところまで作ったことであるので、3Dの知識は入門程度は大丈夫だと思うのですが、
いいUE4のC++資料がありましたら、教えてください。
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.cs の PublicDependencyModuleNames に ** “UMG” ** を追加してください。追加をし忘れた場合はリンカエラーとなります。
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "HeadMountedDisplay", /*追加*/"UMG" });
次にサーバーだけで行う処理ですが
** if (Role == ROLE_Authority) **
と書くことで、このプログラムを実行しているマシンがサーバー側かを調べられます。
先程のウィジェットの作成&画面表示を
** if (Role == ROLE_Authority) **
で囲むとサーバー側のみウィジェットが作成され、クライアント側はキーを押しても何も生成されないという処理が出来ます。
素早い返答ありがとうございます。
お陰様でできました。私がちょっと抜けてたところがあったので、下記に書いておきます。
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という名前のウィジェットブループリントを作って、適当に文字でも書いておけば問題ないですね。
返答ありがとうございました。