fc2ブログ

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

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

2022年07月 | ARCHIVE-SELECT | 2022年09月

| PAGE-SELECT | NEXT

≫ EDIT

UE5/UE4 アニメーションブループリント(Animation Blueprints)のステートマシン(State Machines)で再生するブレンドスペース(Blend Space)を変数にする(Blend Space、Blendspace Player、Bind)

アニメーションブループリント(Animation Blueprints)のステートマシン(State Machines)で再生するブレンドスペース(Blend Space)を変数にする方法です。

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

・アニメーションブループリント(Animation Blueprints)
https://docs.unrealengine.com/5.0/ja/animation-blueprints-in-unreal-engine/

・ステートマシン(State Machines)
https://docs.unrealengine.com/5.0/ja/state-machines-in-unreal-engine/

・ブレンドスペースの使用方法(Using Blend Spaces>
https://docs.unrealengine.com/4.26/ja/AnimatingObjects/SkeletalMeshAnimation/Blendspaces/UserGuide/

アニメーションブループリントのステートマシンで再生する
ブレンドスペースを変数にする方法ですが詳細にある「Bind」という項目で設定します。

まずは「Blend Space」型の変数を作成します。
アニメーションブループリントのステートの使い方026
「AnimationBlendSpace」という名前で変数を作成しました。
この変数に再生したい「ブレンドスペース」を指定しておきます。

直接ブレンドスペースをステートマシンで指定する場合はこんな感じになると思います。
アニメーションブループリントのステートの使い方009
「Blendspace Player」を使って直接ブレンドスペースを指定している感じですね。

この「Blendspace Player」の詳細で「Bind」の項目に先ほど作った変数を指定します。
アニメーションブループリントのステートの使い方024
「AnimationBlendSpace」という名前で変数を作成したのでそれを指定します。

すると、こんな感じで「Blendspace Player」で再生するブレンドスペースが変数指定になります。
アニメーションブループリントのステートの使い方025

汎用化や見やすさなどを考えると変数にしておいた方が良いと思うのでかなり活用しそうかなと思います。

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

≫ EDIT

UE5/UE4 アニメーションブループリント(Animation Blueprints)のステートマシン(State Machines)で再生するアニメーションシーケンス(Animation Sequences)を変数にする(Anim Sequence Base、Sequence Player、Bind)

アニメーションブループリント(Animation Blueprints)のステートマシン(State Machines)で再生するアニメーションシーケンス(Animation Sequences)を変数にする方法です。

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

・アニメーションブループリント(Animation Blueprints)
https://docs.unrealengine.com/5.0/ja/animation-blueprints-in-unreal-engine/

・ステートマシン(State Machines)
https://docs.unrealengine.com/5.0/ja/state-machines-in-unreal-engine/

・アニメーションシーケンス(Animation Sequences>
https://docs.unrealengine.com/4.26/ja/AnimatingObjects/SkeletalMeshAnimation/Sequences/

アニメーションブループリントのステートマシンで再生する
アニメーションシーケンスを変数にする方法ですが詳細にある「Bind」という項目で設定します。

まずは「Anim Sequence Base」型の変数を作成します。
アニメーションブループリントのステートの使い方004
「AnimationSequence」という名前で変数を作成しました。
この変数に再生したい「アニメーションシーケンス」を指定しておきます。

直接アニメーションシーケンスをステートマシンで指定する場合はこんな感じになると思います。
アニメーションブループリントのステートの使い方002
「Sequence Player」を使って直接アニメーションシーケンスを指定している感じですね。

この「Sequence Player」の詳細で「Bind」の項目に先ほど作った変数を指定します。
アニメーションブループリントのステートの使い方003
「AnimationSequence」という名前で変数を作成したのでそれを指定します。

すると、こんな感じで「Sequence Player」で再生するアニメーションシーケンスが変数指定になります。
アニメーションブループリントのステートの使い方005

汎用化や見やすさなどを考えると変数にしておいた方が良いと思うのでかなり活用しそうかなと思います。

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

≫ EDIT

UE5/UE4 アニメーションブループリント(Animation Blueprints)のステートマシン(State Machines)内のステート(State)にステートマシン(State Machines)を作る

アニメーションブループリント(Animation Blueprints)のステートマシン(State Machines)内のステート(State)にステートマシン(State Machines)を作る方法です。

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

・アニメーションブループリント(Animation Blueprints)
https://docs.unrealengine.com/5.0/ja/animation-blueprints-in-unreal-engine/

・ステートマシン(State Machines)
https://docs.unrealengine.com/5.0/ja/state-machines-in-unreal-engine/

ステートマシン内のステートにステートマシンを持つ方法ですが以下のようになります。

まずはアニメーションブループリントでステートマシンを作成します。
アニメーションブループリントのステートの使い方000
こんな感じですね。
「Character StateMachines」という名前にしました。

通常のステートマシンはこんな感じになると思います。
アニメーションブループリントのステートの使い方001
ステートマシン内にステートが複数存在している状態ですね。

ステートの中身はこんな感じでアニメーションシーケンス(Animation Sequences)を再生したりします。
アニメーションブループリントのステートの使い方002

このアニメーションシーケンスを再生する部分をステートマシンにすることができます。
「Move」ステートの中身をステートマシンにしてみます。
アニメーションブループリントのステートの使い方006
こんな感じですね。
「CharacterMove StateMachines」という名前にしました。

上記ステートマシンの中身はこんな感じになります。
アニメーションブループリントのステートの使い方007
通常のステートマシンと同じくステートを作っていく感じですね。

これで「Character StateMachines」内の「Move」ステートの中で
「CharacterMove StateMachines」を作成
してステートを制御する。といったものができました。

子のステートマシンを作ることで、見やすくなるだけではなく、
「複数のモーションで構成されているが、親から見たら一つのステート」となることで遷移が管理しやすい。
といった利点もあるのかなと思います。

結構使う機会は多いので覚えておきたいですね。

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

≫ EDIT

UE5/UE4 BPでビューポート(Viewport)のサイズを取得する(GetViewportSize)

BPでビューポート(Viewport)のサイズを取得する方法です。

BPでビューポート(Viewport)のサイズを取得するには「GetViewportSize」ノードを使います。
BP_GetViewportSize000.jpg
「Size X」「Size Y」でそれぞれビューポートの幅と高さが取得できます。

実際の使い方はこんな感じになります。
BP_GetViewportSize001.jpg
「Get Player Controller」でプレイヤーコントローラーを取得して渡してあげます。

こういったものを結構簡単に取得できるのは便利でいいですね。

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

≫ EDIT

UE5/UE4 C++でビューポート(Viewport)のサイズを取得する(APlayerController::GetViewportSize)

C++でビューポート(Viewport)のサイズを取得する方法です。

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

・Unreal Engineで画面のサイズとタップ座標を取得する
https://crieit.net/posts/Unreal-Engine-5eda44b3abbb2

ビューポート(Viewport)のサイズを取得するには
「APlayerController」の「GetViewportSize」関数を使います。

実際の使い方はこんな感じになります。

// プレイヤーコントローラー取得
TObjectPtr< APlayerController> aPlayerController = UGameplayStatics::GetPlayerController(this->GetWorld(), 0);
// ビューポートサイズ取得
int32 aViewportWidth;
int32 aViewportHeight;
aPlayerController->GetViewportSize(aViewportWidth, aViewportHeight);

「int32」型で取得することができました。

結構簡単に取得できるのは便利でいいですね。

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

≫ EDIT

UE5/UE4 C++でマウスの座標を取得する(APlayerController::GetMousePosition)

C++でマウスの座標を取得する方法です。

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

・Unreal Engineで画面のサイズとタップ座標を取得する
https://crieit.net/posts/Unreal-Engine-5eda44b3abbb2

マウスの座標を取得するには
「APlayerController」の「GetMousePosition」関数を使います。

実際の使い方はこんな感じになります。

// プレイヤーコントローラー取得
TObjectPtr< APlayerController> aPlayerController = UGameplayStatics::GetPlayerController(this->GetWorld(), 0);
// マウス座標の取得
float aMousePositionX;
float aMousePositionY;
aPlayerController->GetMousePosition(aMousePositionX, aMousePositionY);

「float」型で取得することができました。

こういったものを結構簡単に取得できるのは便利でいいですね。

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

≫ EDIT

UE5/UE4 C++でブループリント(Bulepurint)での「WorldContextObject」を暗黙的に扱う(UFUNCTION(meta = (WorldContext = WorldContextObject)))

C++でブループリント(Bulepurint)での「WorldContextObject」を暗黙的に扱う方法です。

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

・UE4: Blueprint 向けに WorldContextObject が必要な機能を提供する際に暗黙的に WorldContextObject を扱わせられるように C++ コードで対応する方法
https://usagi.hatenablog.jp/entry/2018/03/09/103434

C++で関数ライブラリ(Blueprint Function Library)を作成して以下のような関数を作成したとします。

#include "Kismet/BlueprintFunctionLibrary.h"
// 関数ライブラリクラス
UCLASS()
class UNewBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{

GENERATED_BODY()
public:
// static で関数を定義する
UFUNCTION(BlueprintCallable, BlueprintPure)
static int32 GetValue1(const UObject* WorldContextObject);
};


この関数をBPで実行しようとするとこんな感じのノードになります。
WorldContext000.jpg
「World Context Object」が邪魔ですね…。

これを暗黙的に処理してくれるのが「UFUNCTION(meta = (WorldContext = WorldContextObject))」という記述です。

外部から WorldContextObject の供給を受ければ問題無く動作する。ついで、その際に Blueprint 向けの UFUNCTION の定義に WorldContext を与えておくと、 Blueprint でこの関数を使用する際に、暗黙的に WorldContextObject が適切に与えられ、かつ Blueprint では余計なコネクターなども綺麗に省略される状態にできる。

とのことのようです。

というわけで実際に試してみました。

#include "Kismet/BlueprintFunctionLibrary.h"
// 関数ライブラリクラス
UCLASS()
class UNewBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{

GENERATED_BODY()
public:
// static で関数を定義する
UFUNCTION(BlueprintCallable, BlueprintPure, meta = (WorldContext = WorldContextObject))
static int32 GetValue2(const UObject* WorldContextObject);
};


上記「GetValue2」関数をBPから呼び出してみます。
WorldContext001.jpg
無事「WorldContextObject」ピンがなくなってすっきりしました。

こういった機能は使うと効率が上がりそうなので覚えておきたいですね。

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

≫ EDIT

UE5/UE4 C++で関数ライブラリ(Blueprint Function Library)を作成する(UBlueprintFunctionLibrary)

C++で関数ライブラリ(Function Liberary)を作成する方法です。

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

・【UE4】クラスを作成しブループリントから関数を呼び出せる様にする
https://kazupon.org/ue4-blueprint/

C++で関数ライブラリ(Blueprint Function Library)を作成するには
「UBlueprintFunctionLibrary」を継承したクラスを作成します。

#include "Kismet/BlueprintFunctionLibrary.h"
// 関数ライブラリクラス
UCLASS()
class UNewBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{

GENERATED_BODY()
public:
// static で関数を定義する
UFUNCTION(BlueprintCallable, BlueprintPure)
static int32 GetValue1(const UObject* WorldContextObject);
};


これで関数ライブラリの作成は完了です。
試しに上記クラスで作成した「GetValue1」関数をBPから呼び出してみます。
WorldContext000.jpg
こんな感じで無事呼び出せました。

結構使う頻度は多そうな気がするので覚えておきたいですね。

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

≫ EDIT

UE5/UE4 サーバー(Authority)かクライアント(Remote)マシンなのかを判別して処理をする(Switch Has Authority)

サーバー(Authority)かクライアント(Remote)マシンなのかを判別して処理をする方法です。

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

・ブループリントでアクタをレプリケートする
https://docs.unrealengine.com/4.27/ja/InteractiveExperiences/Networking/Actors/ReplicatingActors/

スクリプトを実行しているのは Authority (サーバー) なのか、
または Remote マシン (クライアント) なのかを判断するために
Switch Has Authority (もしくは Authority Guard) ノードを追加します。

通常は Authority に設定して、プレイヤーのヘルス値やポイントの配分、経験値の調整など、
クライアント マシンでごまかしが行われてはならないゲームプレイの重要なスクリプトは
サーバーのみが実行できるようにします。


というわけで、サーバー(Authority)かクライアント(Remote)マシンなのかを判別するには
「Switch Has Authority」ノードを使用
します。
サーバーかクライアントかどうか000
サーバー(Authority)であれば「Authority」が実行され、
クライアント(Remote)マシンであれば「Remote」が実行されます。


実際にはこんな感じの記載になりそうです。
サーバーかクライアントかどうか001
そのままですね。

ネットワークゲームを作らなければあまり使わないと思うのですが、いざという時のために知識として知っておくと良さそうです。

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

≫ EDIT

UE5/UE4 マテリアル(Material)で円周率(Pi(π))の値を扱う(Pi)

マテリアル(Material)で円周率(Pi(π))の値を扱う方法です。

こちらのツイートで言及されていましたのでメモです!

「Pi」というノードがマテリアル(Material)ノードにあるようです。
MaterialPIノード001
その名の通り「円周率(Pi(π))」を掛けることができます。

ちなみにこのノードは「Pi」で検索することができます。
MaterialPIノード000

初歩的なことかもしれないですが覚えておきたいですね。

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

| PAGE-SELECT | NEXT