fc2ブログ

凛(kagring)のUE5/UE4とゲーム制作と雑記ブログ

2016 年から UE4 / 2021年から UE5 を触り始めました。勉強したもののメモ用ブログです。ゲーム制作に関するメモや雑記とか色々あります。C++ での Qt、Unity もほんの少しあります。

2022年03月 | ARCHIVE-SELECT | 2022年05月

| PAGE-SELECT | NEXT

≫ EDIT

UE5/UE4 2022/04 の無料マーケットプレイスコンテンツと永続コンテンツ(Realtime Archviz AssetPack - Bistro Restaurant Scene)

2022/04 の無料マーケットプレイスコンテンツと永続コンテンツのメモです。

公式情報はこちら。

・2022年4月の無料マーケットプレイスコンテンツ
https://www.unrealengine.com/ja/blog/featured-free-marketplace-content-april-2022

無料コンテンツについては期日がすぎると無料でなくなるので公式情報を見たほうが良いかと思います。
こちらでは永続コンテンツについてのメモを残しておきます。

・Realtime Archviz AssetPack - Bistro Restaurant Scene | Dominique Buttiens
https://www.unrealengine.com/marketplace/ja/product/bistro-restaurant-scene-asset-pack-realtime-archviz

このシンプルなフレンチ ビストロで、会話シーン、カットシーン、マーケティング素材を作りましょう。
(ダイニングセットも含まれています)

・動画


・ArtStation Demo
https://www.artstation.com/artwork/WDJ5Q

| UE5 | 10:00 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

ゲームデザインメモ・開発者に訊きました「星のカービィ ディスカバリー」などからわかる手触りのための処理

開発者に訊きました「星のカービィ ディスカバリー」などからわかる手触りのための処理についてです。

発端は見かけたこちらのツイートになります。

公式サイトの『開発者に訊きました「星のカービィ ディスカバリー」』はこちら。

・『開発者に訊きました「星のカービィ ディスカバリー」』
https://www.nintendo.co.jp/interview/arzga/index.html

今回に関する記事のページはこちら。

・初の3Dアクションとは思えない
https://www.nintendo.co.jp/interview/arzga/02.html

そこで、今作ではゲーム画面で攻撃が当たっているように見える時は
実際当たっていなくても
「当たる」ようにするという仕組みを入れました。

カメラとカービィの位置関係から
お客さまから攻撃が当たったように見える範囲を自動で特定して
動画
その範囲にある時は、攻撃が当たります。
それによって、3Dアクションが苦手な人でも
ストレスなくスムーズに攻撃を当てることができるようになりました。

上記に関する動画はこちら。
https://www.nintendo.co.jp/interview/arzga/movie/01.mp4
細かい配慮000
細かい配慮001
現在の見えている状態から、2D的な判定(奥行きを加味しない)を行う。みたいな感じでしょうか。

ここらへんこの記事が出たあたりでいろいろなツイートを見かけたので書いておきます。

上記とは別ですがこういった記事もありました。興味深いですね。

・高評価アクションゲーム『Celeste』開発者が、“手触り“に関する極意を明かす。プレイヤーにストレスを与えないように取り組んだこと
https://automaton-media.com/articles/newsjp/20200315-116902/

他にもこういったものもありました。

どのゲームでもこういった補正やシステムは入っていると思います。
手触りにもかなり関わることなので色々と知っておきたいですね。

| ゲームデザイン | 10:00 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE5/UE4 C++で詳細ウィンドウでの変数表示を詳細設定として隠す設定をプロパティ指定子(Property Specifiers)で指定する(UPROPERTY(AdvancedDisplay))

C++で詳細ウィンドウでの変数表示を詳細設定として隠す設定をプロパティ指定子(Property Specifiers)で指定する方法です。

こちらを参考にさせていただきました。

・UE4 よく使うUPROPERTYメモ
https://qiita.com/bigengelt/items/b17545fffe7b8d69e5e8

公式ドキュメントはこちら。

・プロパティ(Properties)とプロパティ指定子(Property Specifiers)
https://docs.unrealengine.com/4.27/ja/ProgrammingAndScripting/GameplayArchitecture/Properties/

詳細ウィンドウでの変数表示を詳細設定として隠すには「UPROPERTY」を使って「AdvancedDisplay」を記述します。
記述はこんな感じになります。

// 詳細設定として隠す
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "NewCategory", AdvancedDisplay)
bool bDebugBoolAdvancedDisplay;

上記は「bDebugBoolAdvancedDisplay」という変数を詳細ウィンドウで詳細設定として隠すようにしています。

結果はこんな感じになります。
※「bDebugBoolAdvancedDisplay」変数
プロパティ指定子005
初期状態はこんな感じで「Advanced」の中に隠されています。

「Advanced」を開くとこんな感じで表示されます。
プロパティ指定子006
「bDebugBoolAdvancedDisplay」変数が無事表示されました。

使う頻度が少ないような変数はこの設定をした方がごちゃごちゃしなくてよいかもしれないですね。

| UE5 | 10:00 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE5/UE4 C++でクラス指定子(Class Specifiers)を使って詳細から必要のない情報を非表示にする(UCLASS(HideCategories))

C++でクラス指定子(Class Specifiers)を使って詳細から必要のない情報を非表示にする方法です。

こちらを参考にさせていただきました。

・[UE4]BPを作る時に留意している設定
https://qiita.com/com04/items/e10f697c2adf32175488

公式ドキュメントはこちら。

・クラス指定子(Class Specifiers)
https://docs.unrealengine.com/4.26/ja/ProgrammingAndScripting/GameplayArchitecture/Classes/Specifiers/

詳細から必要のない情報を非表示にするには「UCLASS」に「HideCategories」を記述します。

記述はこんな感じになります。

UCLASS(HideCategories = (Actor, Input, Rendering, Replication, ActorTick, Transform, HLOD, Collision, Physics))
class ATestActor : public AActor

{
GENERATED_BODY()
public:
~省略
public:
// 変数の定義(ほかにもいろいろ定義していますが省略)
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "NewCategory")
bool bDebugBool;
// 変数の定義(ほかにもいろいろ定義していますが省略)
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "EditVisible")
int32 ValueEditAnywhere;
};

「UCLASS()」に「HideCategories」でカテゴリを記述することで
そのカテゴリを詳細から非表示
にすることができます。
「Actor」「Input」「Rendering」「Replication」「ActorTick」「Transform」「HLOD」「Collision」「Physics」を非表示にしました。

「UCLASS()」だけの記述での詳細はこんな感じに表示されます。
詳細でのカテゴリ非表示000
トランスフォーム(Transform)やHLODのカテゴリなどが表示されています。

「UCLASS(HideCategories = (Actor, Input, Rendering, Replication, ActorTick, Transform, HLOD, Collision, Physics))」
上記を記述したものがこちらになります。
詳細でのカテゴリ非表示001
「HideCategories 」で指定したカテゴリがすべて非表示になっています。

用途によっては必要のない情報もあるので、見やすくするためにもこの機能はかなり使えるんじゃないでしょうか。

| UE5 | 10:00 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE5/UE4 C++でポーズ中もカメラの描画が更新されるようにする(APlayerController::UpdateCameraManager、Tick Even when Paused)

C++でポーズ中もカメラの描画が更新されるようにする方法です。

こちらを参考にさせていただきました。

・【UE5】ポーズ中にカメラを動作させる
https://shuntaendo.hatenablog.com/entry/2022/04/19/211527

「Tick Even when Paused」にチェックを入れてポーズ中も動作するようにしても描画更新されない!
と、ここすごい悩んでいたところだったのでこの記事はすごい助かりました。

というわけで実際にどうしたらいいのかやってみました。

下記の説明を見ると、ポーズ中の描画更新の方法は二種類あるようなのですが、

カメラ自体の更新は LevelTick.cpp の “PlayerController->UpdateCameraManager” で更新されているので
ここを動作させる必要があります。

PlayerController の “Class Default” から “Should Perform Full Tick when Paused” を有効にすることで
ポーズ中も UpdateCameraManager にまで処理が通るようになり、カメラが更新されるようになります。
他のアクターなどで UpdateCameraManager を呼ぶことでも可能です。

影響範囲を考えて今回は後者の「他のアクターなどで UpdateCameraManager を呼ぶ」でやってみます。

まずはカメラを継承したクラスを作成します。

#include "CineCameraActor.h"

UCLASS()
class ANewCameraActor : public ACineCameraActor
{

GENERATED_BODY()
public:
virtual void Tick( float DeltaTime ) override;
};

こんな感じで今回は「ACineCameraActor」を継承したクラスにしてみました。

次に、ポーズ時にも描画が更新されるように処理を書いていきます。
#include "Kismet/GameplayStatics.h"

void ANewCameraActor::Tick(float DeltaTime)
{

// ポーズ時
if(this->GetWorld()->IsPaused()){

// カメラの更新
TObjectPtr< APlayerController > aPlayerController = UGameplayStatics::GetPlayerController(this, 0);
aPlayerController->UpdateCameraManager(DeltaTime);

}
}

「Tick」が実行された時に「ポーズ状態であればカメラの更新を行う」といったものになります。

あとはこれが動作するように、このクラスで配置したBPで「Tick Even when Paused」にチェックを入れて
ポーズ中も「Tick」が動作
するようにします。
ポーズ時も更新されるカメラ000

これで一応「ポーズ中にも動作するカメラ」といった望み通りの挙動ができたのですが、

・ポストプロセスなど一部の処理が更新されない(ブラーなど)
・複数こういったものを作成すると多重で「UpdateCameraManager」が呼ばれてしまいそう。

みたいなことがあるので、もう少し別件としてどこかで調べてみたいと思います。

| UE5 | 10:00 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE5 EGJオンラインラーニング「UE5でのアニメーションの流用方法について」

EGJオンラインラーニング「UE5でのアニメーションの流用方法について」という説明の動画配信があったのでメモです。

公式ページはこちら。

・『UE5でのアニメーションの流用方法について』を4/20(水) 20時よりライブ配信を行います
https://www.unrealengine.com/ja/blog/epicgamesjapan-onlinelearning-how-to-reuse-animations-in-ue5

配信時の動画はこちら。

・UE5でのアニメーションの流用方法について【Compatible Skeletons, IK Retergeter】


配信で使われていたスライドはこちら。


こういった詳細な説明をしてもらえるのはすごい助かりますね!

| UE5 | 10:00 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE5/UE4 C++におけるクラス(Class)、構造体(Struct)、列挙型(Enum)、変数、引数の命名規則(AActor、UObject、SWidget、FStruct、EEnum、bBool、IInterface)

C++におけるクラス(Class)、構造体(Struct)、列挙型(Enum)、変数、引数の命名規則のメモです。
ドキュメントを見れば書いてあるのですが忘れやすいのでメモということで…。

公式ドキュメントはこちらになります。

・コーディング規約
https://docs.unrealengine.com/4.27/ja/ProductionPipelines/DevelopmentSetup/CodingStandard/

クラス(Class)はこう記載されています。

テンプレートクラスには接頭辞 T が付きます。
UObject から継承されるクラスには接頭辞 U が付きます。
AActor から継承されるクラスには接頭辞 A が付きます。
SWidget から継承されるクラスには接頭辞 S が付きます。

C抽象インターフェースのクラスには接頭辞 I が付きます。
列挙型変数には接頭辞 E が付きます。
その他のほとんどのクラスには接頭辞 F が付きますが、サブシステムによっては別の文字が使用されます。

継承元によって接頭辞が変わる。といったもののようですね。

構造体(Struct)はこう記載されています。

Typedef には、その型に対して適切な接頭辞が付きます。
構造体の typedef の場合は、F に、
UObject の typedef の場合は、U になる等のようになります。


列挙型(Enum)はこう記載されています。

列挙型変数には接頭辞 E が付きます。


変数はこう記載されています。

ブール変数には、必ず接頭辞 b を付けてください (例、bPendingDestruction や bHasFadedIn)。


引数はこう記載されています。

必須ではありませんが、参照から渡されたり、関数によって値が書かれる場合は、
関数パラメータ名に「Out」を接頭辞として付けることを推奨します。
こうすることで、引数に渡された値が関数によって置き換えられることが明白になります。

In または Out のパラメータも boolean の場合、In/Out の接頭辞の前に b を付けます (例: bOutResult)。


UE5/UE4 独自のルールだと思いますが、慣れてくれば考えなくてもいけそうな気がしますね。

| UE4 | 10:00 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE5/UE4 C++でブループリント(Blueprint)での変数のアクセス権限をプロパティ指定子(Property Specifiers)で指定する(UPROPERTY(BlueprintReadWrite)、UPROPERTY(BlueprintReadOnly))

C++でブループリント(Blueprint)での変数のアクセス権限をプロパティ指定子(Property Specifiers)で指定する方法です。

こちらを参考にさせていただきました。

・UE4 よく使うUPROPERTYメモ
https://qiita.com/bigengelt/items/b17545fffe7b8d69e5e8

公式ドキュメントはこちら。

・プロパティ(Properties)とプロパティ指定子(Property Specifiers)
https://docs.unrealengine.com/4.27/ja/ProgrammingAndScripting/GameplayArchitecture/Properties/

ブループリントでの変数のアクセス権限を設定するには「UPROPERTY」を使って
「BlueprintReadWrite」や「BlueprintReadOnly」を記述
します。
記述はこんな感じになります。

// Get と Set 両方公開
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "NewCategory")
bool bDebugBoolReadWrite;
// Get のみ公開
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "NewCategory")
bool bDebugBoolReadOnly;

「BlueprintReadWrite」は「Get」と「Set」両方を公開
「BlueprintReadOnly」は「Get」のみを公開となります。

結果はこんな感じになります。
まずは「Get」についてみてみます。
※「Get Debug Bool Read Only」と「Get Debug Bool Read Write」
プロパティ指定子008
「BlueprintReadWrite」と「BlueprintReadOnly」は両方とも「Get」は公開されているため一覧に存在します。

次に「Set」についてみてみます。
※「Set Debug Bool Read Only」と「Set Debug Bool Read Write」
プロパティ指定子002
「BlueprintReadWrite」は「Set」が公開されているため一覧に存在します。
「BlueprintReadOnly」は「Set」が公開されていないため一覧には存在しなくなっています。

こんな感じで変更をしてほしくない変数などは制御できるので、
予期せぬことが起きないようにするためにも、ちゃんと設定はしておきたいところです。

| UE5 | 10:00 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE5/UE4 C++で変数のカテゴリ(Category)をプロパティ指定子(Property Specifiers)で指定する(UPROPERTY(Category))

C++で変数のカテゴリ(Category)をプロパティ指定子(Property Specifiers)で指定する方法です。

こちらを参考にさせていただきました。

・UE4 よく使うUPROPERTYメモ
https://qiita.com/bigengelt/items/b17545fffe7b8d69e5e8

公式ドキュメントはこちら。

・プロパティ(Properties)とプロパティ指定子(Property Specifiers)
https://docs.unrealengine.com/4.27/ja/ProgrammingAndScripting/GameplayArchitecture/Properties/

変数のカテゴリを指定するには「UPROPERTY」を使って「Category」を記述します。
記述はこんな感じになります。

// Debug カテゴリ
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "NewCategory")
bool bDebugBool;

上記は「bDebugBool」という変数を「NewCategory」というカテゴリに指定しています。

結果はこんな感じになります。
プロパティ指定子004
他の変数もありますが>「bDebugBool」が「NewCategory」にちゃんと含まれています。

変数のカテゴリに階層を持つ場合は「|」で区切って指定します。
記述はこんな感じになります。

// Debug カテゴリ
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ParentCategory|NewCategory")
bool bDebugBool;

上記は「bDebugBool」という変数を「ParentCategory」の中の「NewCategory」というカテゴリに指定しています。

作業をしやすいようにするためにもカテゴリはちゃんと設定したいですね。

| UE5 | 10:00 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE5/UE4 C++で変数のアクセス権系の属性をプロパティ指定子(Property Specifiers)で指定する(UPROPERTY(EditAnywhere)、UPROPERTY(EditDefaultsOnly)、UPROPERTY(EditInstanceOnly)、UPROPERTY(VisibleAnywhere)、UPROPERTY(VisibleDefaultsOnly)、UPROPERTY(VisibleInstanceOnly))

C++で変数のアクセス権系の属性をプロパティ指定子(Property Specifiers)で指定する方法です。

こちらを参考にさせていただきました。

・UE4 よく使うUPROPERTYメモ
https://qiita.com/bigengelt/items/b17545fffe7b8d69e5e8

公式ドキュメントはこちら。

・プロパティ(Properties)とプロパティ指定子(Property Specifiers)
https://docs.unrealengine.com/4.27/ja/ProgrammingAndScripting/GameplayArchitecture/Properties/

アクセス権系の属性を設定するには「UPROPERTY」を使って
「EditAnywhere」や「EditDefaultsOnly」や「EditInstanceOnly」や
「VisibleAnywhere」や「VisibleDefaultsOnly」や「VisibleInstanceOnly」を記述
します。

記述はこんな感じになります。

// レベルエディター:閲覧可・編集可。ブループリントエディター等:閲覧可・編集可。
UPROPERTY(EditAnywhere, BlueprintReadWrite)
int32 ValueEditAnywhere;
// ブループリントエディター等:閲覧可・編集可。
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
int32 ValueEditDefaultsOnly;
// レベルエディター:閲覧可・編集可。
UPROPERTY(EditInstanceOnly, BlueprintReadWrite)
int32 ValueEditInstanceOnly;
// レベルエディター:閲覧可。ブループリントエディター等:閲覧可。
UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
int32 ValueVisibleAnywhere;
// ブループリントエディター等:閲覧可。
UPROPERTY(VisibleDefaultsOnly, BlueprintReadWrite)
int32 ValueVisibleDefaultsOnly;
// レベルエディター:閲覧可。
UPROPERTY(VisibleInstanceOnly, BlueprintReadWrite)
int32 ValueVisibleInstanceOnly;


上記の記述したものはレベルエディターで配置したものはこういう感じになります。
アクセス属性000

ブループリントの詳細ではこういう感じになります。
アクセス属性001

こんな感じで変更をしてほしくない変数などは制御できるので、
予期せぬことが起きないようにするためにも、ちゃんと設定はしておきたいところです。

| UE5 | 10:00 | comments:0 | trackbacks:0 | TOP↑

| PAGE-SELECT | NEXT