ゲームプログラミングC++の9章に出てくる動かないサンプルソースを動かすためのメモ

基本7章と同じ

1>D:\Sandbox\gameprogcpp_code\code-master\Chapter09\SoundEvent.cpp(11,10): error C1083: Cannot open include file: ‘fmod_studio.hpp’: No such file or directory

Visual Studioの場合:
Gameプロジェクトを右クリックし、[プロパティ]を選択。
[C/C++] → [追加のインクルードディレクトリ] を選び、FMODのインクルードフォルダのパス
(例:
D:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\studio\inc
D:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\core\inc
)を追加。
変更後、プロジェクトを再ビルドしてみてください。

1>D:\Sandbox\gameprogcpp_code\code-master\Chapter09\AudioSystem.cpp(59,11): error C2039: ‘getLowLevelSystem’: is not a member of ‘FMOD::Studio::System’
1> D:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\studio\inc\fmod_studio.hpp(36,11):
//mSystem->getLowLevelSystem(&mLowLevelSystem);//コメントアウト

1>D:\Sandbox\gameprogcpp_code\code-master\Chapter09\SoundEvent.cpp(83,10): error C2039: ‘setParameterValue’: is not a member of ‘FMOD::Studio::EventInstance’
1> D:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\studio\inc\fmod_studio.hpp(184,11):
1> see declaration of ‘FMOD::Studio::EventInstance’
//event->setParameterValue(name.c_str(), value);//コメントアウト

1>D:\Sandbox\gameprogcpp_code\code-master\Chapter09\SoundEvent.cpp(126,10): error C2039: ‘getParameterValue’: is not a member of ‘FMOD::Studio::EventInstance’
1> D:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\studio\inc\fmod_studio.hpp(184,11):
1> see declaration of ‘FMOD::Studio::EventInstance’
//event->getParameterValue(name.c_str(), &retVal);//コメントアウト

で解決して次のエラー

1>LINK : fatal error LNK1104: cannot open file ‘fmodL_vc.lib’
1>LINK : fatal error LNK1104: cannot open file ‘fmodstudioL_vc.lib’
[リンカー] → [追加の依存ファイル]にFMODのライブラリを追加します。
D:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\core\lib\x86
D:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\studio\lib\x86

1>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(166,5): error MSB3073: The command “xcopy “D:\Sandbox\gameprogcpp_code\code-master\Chapter07\..\external\SDL\lib\win\x86*.dll” “D:\Sandbox\gameprogcpp_code\code-master\Chapter07\Debug\” /i /s /y
1>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(166,5): error MSB3073: xcopy “D:\Sandbox\gameprogcpp_code\code-master\Chapter07\..\external\GLEW\lib\win\x86*.dll” “D:\Sandbox\gameprogcpp_code\code-master\Chapter07\Debug\” /i /s /y
1>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(166,5): error MSB3073: xcopy “C:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\lowlevel\lib*.dll” “D:\Sandbox\gameprogcpp_code\code-master\Chapter07\Debug\” /i /s /y
1>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(166,5): error MSB3073: xcopy “C:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\studio\lib*.dll” “D:\Sandbox\gameprogcpp_code\code-master\Chapter07\Debug\” /i /s /y
1>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(166,5): error MSB3073:
1>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(166,5): error MSB3073: :VCEnd” exited with code 4.

対処手順:
1,Visual Studioを管理者として実行します。
2,プロジェクトのプロパティを開き、ビルド設定でDLLファイルのコピーが正しく行われているか確認します。
3、ターゲットディレクトリのアクセス許可を確認し、必要に応じて変更します。
4,DLLファイルのパスが正しいか確認します。
5,FMOD Studio APIが正しくインストールされているか確認します。
上記を確認後、再度ビルドを実行します。

fmodL.dll が見つからないため、コードの実行を続行できません。プログラムを
再インストールすると、この問題が解決する可能性があります。

元はこうだった

xcopy "$(ProjectDir)\..\external\SDL\lib\win\x86\*.dll" "$(OutDir)" /i /s /y
xcopy "$(ProjectDir)\..\external\GLEW\lib\win\x86\*.dll" "$(OutDir)" /i /s /y
xcopy "D:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\lowlevel\lib\*.dll" "$(OutDir)" /i /s /y
xcopy "D:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\studio\lib\*.dll" "$(OutDir)" /i /s /y

直して

xcopy "$(ProjectDir)\..\external\SDL\lib\win\x86\*.dll" "$(OutDir)" /i /s /y
xcopy "$(ProjectDir)\..\external\GLEW\lib\win\x86\*.dll" "$(OutDir)" /i /s /y
xcopy "D:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\core\lib\x86\*.dll" "$(OutDir)" /i /s /y
xcopy "D:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\studio\lib\x86\*.dll" "$(OutDir)" /i /s /y

こうした

できたー

ゲームプログラミングC++の7章に出てくる動かないサンプルソースを動かすためのメモ

7章のslnは

こうゆうエラーを吐く

1>D:\Sandbox\gameprogcpp_code\code-master\Chapter07\AudioSystem.cpp(11,10): error C1083: Cannot open include file: ‘fmod_studio.hpp‘: No such file or directory

1>D:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\studio\inc\fmod_studio_common.h(14,10): error C1083: Cannot open include file: ‘fmod.h‘: No such file or directory
1>(compiling source file ‘AudioSystem.cpp’)

fmodを使うので

ユーザー登録をしてダウンロードしてくる 今回はDドライブにインストールした。
https://www.fmod.com/download

Visual Studioの場合:
Gameプロジェクトを右クリックし、[プロパティ]を選択。
[C/C++] → [追加のインクルードディレクトリ] を選び、FMODのインクルードフォルダのパス
(例:
D:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\studio\inc
D:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\core\inc
)を追加。
変更後、プロジェクトを再ビルドしてみてください。


英語
1>D:\Sandbox\gameprogcpp_code\code-master\Chapter07\SoundEvent.cpp(83,10): error C2039: ‘setParameterValue’: is not a member of ‘FMOD::Studio::EventInstance’
1> D:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\studio\inc\fmod_studio.hpp(184,11):
1> see declaration of ‘FMOD::Studio::EventInstance’
1>D:\Sandbox\gameprogcpp_code\code-master\Chapter07\SoundEvent.cpp(126,10): error C2039: ‘getParameterValue’: is not a member of ‘FMOD::Studio::EventInstance’
1> D:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\studio\inc\fmod_studio.hpp(184,11):
1> see declaration of ‘FMOD::Studio::EventInstance’


日本語
1>D:\Sandbox\gameprogcpp_code\code-master\Chapter07\SoundEvent.cpp(83,10): エラー C2039: ‘setParameterValue’: は ‘FMOD::Studio::EventInstance’ のメンバーではありません
83行をコメントアウト
//event->setParameterValue(name.c_str(), value);

1>D:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\studio\inc\fmod_studio.hpp(184,11):
1> ‘FMOD::Studio::EventInstance’ の宣言を参照してください
1>D:\Sandbox\gameprogcpp_code\code-master\Chapter07\SoundEvent.cpp(126,10): エラー C2039: ‘getParameterValue‘: は ‘FMOD::Studio::EventInstance’ のメンバーではありません
127行をコメントアウト
//event->getParameterValue(name.c_str(), &retVal);

1>D:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\studio\inc\fmod_studio.hpp(184,11):
1> ‘FMOD::Studio::EventInstance’ の宣言を参照してください


1>D:\Sandbox\gameprogcpp_code\code-master\Chapter07\AudioSystem.cpp(59,11): error C2039: ‘getLowLevelSystem‘: is not a member of ‘FMOD::Studio::System’
1> D:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\studio\inc\fmod_studio.hpp(36,11):
1> see declaration of ‘FMOD::Studio::System’
AudioSystem.cpp(59,11)をコメントアウト
//mSystem->getLowLevelSystem(&mLowLevelSystem);

1>LINK : fatal error LNK1104: cannot open file ‘fmodL_vc.lib’
1>LINK : fatal error LNK1104: cannot open file ‘fmodstudioL_vc.lib’
[リンカー] → [追加の依存ファイル]にFMODのライブラリを追加します。
D:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\core\lib\x86
D:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\studio\lib\x86

1>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(166,5): error MSB3073: The command “xcopy “D:\Sandbox\gameprogcpp_code\code-master\Chapter07\..\external\SDL\lib\win\x86*.dll” “D:\Sandbox\gameprogcpp_code\code-master\Chapter07\Debug\” /i /s /y
1>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(166,5): error MSB3073: xcopy “D:\Sandbox\gameprogcpp_code\code-master\Chapter07\..\external\GLEW\lib\win\x86*.dll” “D:\Sandbox\gameprogcpp_code\code-master\Chapter07\Debug\” /i /s /y
1>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(166,5): error MSB3073: xcopy “C:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\lowlevel\lib*.dll” “D:\Sandbox\gameprogcpp_code\code-master\Chapter07\Debug\” /i /s /y
1>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(166,5): error MSB3073: xcopy “C:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\studio\lib*.dll” “D:\Sandbox\gameprogcpp_code\code-master\Chapter07\Debug\” /i /s /y
1>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(166,5): error MSB3073:
1>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(166,5): error MSB3073: :VCEnd” exited with code 4.

対処手順:
1,Visual Studioを管理者として実行します。
2,プロジェクトのプロパティを開き、ビルド設定でDLLファイルのコピーが正しく行われているか確認します。
3、ターゲットディレクトリのアクセス許可を確認し、必要に応じて変更します。
4,DLLファイルのパスが正しいか確認します。
5,FMOD Studio APIが正しくインストールされているか確認します。
上記を確認後、再度ビルドを実行します。

fmodL.dll が見つからないため、コードの実行を続行できません。プログラムを
再インストールすると、この問題が解決する可能性があります。

元はこうだったが

xcopy "$(ProjectDir)\..\external\SDL\lib\win\x86\*.dll" "$(OutDir)" /i /s /y
xcopy "$(ProjectDir)\..\external\GLEW\lib\win\x86\*.dll" "$(OutDir)" /i /s /y
xcopy "D:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\lowlevel\lib\*.dll" "$(OutDir)" /i /s /y
xcopy "D:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\studio\lib\*.dll" "$(OutDir)" /i /s /y

を直して

xcopy "$(ProjectDir)\..\external\SDL\lib\win\x86\*.dll" "$(OutDir)" /i /s /y
xcopy "$(ProjectDir)\..\external\GLEW\lib\win\x86\*.dll" "$(OutDir)" /i /s /y
xcopy "D:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\core\lib\x86\*.dll" "$(OutDir)" /i /s /y
xcopy "D:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\studio\lib\x86\*.dll" "$(OutDir)" /i /s /y

にした

起動した!!

[UE554][VSM] One Pass Projection max lights overflow. If you see shadow artifacts, decrease the amount of local lights per pixel, or increase r.Shadow.Virtual.OnePassProjection MaxLightsPerPixel. (0 seconds ago) (;f

エラー内容

[VSM] One Pass Projection max lights overflow. If you see shadow artifacts, decrease the amount of local lights per pixel, or increase r.Shadow.Virtual.OnePassProjection MaxLightsPerPixel. (0 seconds ago) (;f

[VSM] ワンパスプロジェクションの最大ライト数がオーバーフローしました。影のアーティファクトが見られる場合は、ピクセルあたりのローカルライトの量を減らすか、r.Shadow.Virtual.OnePassProjection MaxLightsPerPixel の値を増やしてください。(0秒前) (;f

コンソールコマンドで解決するらしい。

https://forums.unrealengine.com/t/lumen-artifacts-in-shadows-with-many-movable-lights/1747817/2

r.Shadow.Virtual.OnePassProjection MaxLightsPerPixel =16

r.Shadow.Virtual.OnePassProjection MaxLightsPerPixel = 128

黄色い文字は消えた。

参考

https://dev.epicgames.com/documentation/ja-jp/unreal-engine/virtual-shadow-maps-in-unreal-engine

[UE554]Spring Controllerで『アレ』を揺らすときの欠点ジャンプでの不具合をシンプルに改善した。

ずっとKawaiiPhysicsばっかり触ってたけどC++プロジェクトにしたくないときに便利な

Anim Dynamics 関連ノード の中にSpring Controllerがあります。

IsFalling にNOTをつないでBoolをAlphaにつなぎます。

設定値は以下の通りです。ボーン以外の参考にしてください。

[UE554]パッケージ化がループして2日以上パッケージ化できない場合「XGE Con​​troller」プラグインを完全に無効にすることで解決します。

エラー表示は無く、以下がループしていました。

 2 packages in the savequeue:
UATHelper: Packaging (Windows): LogCook: Display:     /Game/jennie9/SwimSuit_Top_FRONT_5010
UATHelper: Packaging (Windows): LogCook: Display:     /Game/jennie9/Skirt_Short_Cage2_Middle_M
UATHelper: Packaging (Windows): LogCook: Display: 2 objects that have not yet returned true from IsCachedCookedPlatformDataLoaded:
UATHelper: Packaging (Windows): LogCook: Display:     Material /Game/jennie9/SwimSuit_Top_FRONT_5010.SwimSuit_Top_FRONT_5010
UATHelper: Packaging (Windows): LogCook: Display:     Material /Game/jennie9/Skirt_Short_Cage2_Middle_M.Skirt_Short_Cage2_Middle_M
UATHelper: Packaging (Windows): LogCook: Display: Cook Diagnostics: OpenFileHandles=311, VirtualMemory=4265MiB, VirtualMemoryAvailable=106810MiB

連鎖的な影響があるかどうかはわかりませんが、「XGE コントローラー」プラグインに関連しているようです。

私が収集した限りでは、これは Incredibuild を利用したコンパイル配布プラグインですが、実際には CPU 上の複数のコアが完全に利用されるのを妨げるだけのようです。

シェーダーのコンパイルが非常に遅く、かつシェーダーのコンパイル時に ShaderCompileWorker.exe プロセスが1つしか起動されていない場合は、これも原因の可能性があります。実際には、タスクマネージャーの「プロセス」タブには3つの ShaderCompileWorker プロセスが表示されることがありますが、詳細タブに切り替えると、「shadercompileworker.exe」プロセスが1つと「XGEControlWorker.exe」プロセスが2つしか表示されないことがあります。ほとんどの環境では、「XGEControlWorker.exe」プロセスは表示されず、「shadercompileworker.exe」プロセスが多数表示されます。なぜ一部の環境でこの動作が異なるのかは、私にはわかりません。

とにかく、コンパイル時間を大幅に短縮できる解決策として私が見つけたのは、

「XGE Con​​troller」プラグインを完全に無効にすることです。(エディターで「編集」>「プラグイン」を選択し、「XGE Con​​troller」を検索して「有効」のチェックを外します。)

追記:このマシンにIncredibuild Coordinatorというツールがインストールされているのを見つけました。シェーダーコンパイルタスクが配布待ちになっていることを検出しましたが、有効なライセンスがインストールされていなかったため、実際には複数のコアに配布されていませんでした。おそらくこれが、ほとんどの人がこの問題に遭遇しない理由でしょう。Incredibuild Coordinator(または類似のツール?)がインストールされていない場合、エンジンはデフォルトでXGE Incredibuildを利用したコンパイルを使用しません。

参考URL

https://forums.unrealengine.com/t/only-a-single-shadercompileworker-process/455973/2

[UE554]Clothの設定方法

1, [Section Selection (セクション選択)]
2,左クリックを使って、クロスとして使用したいメッシュの一部を選択します。次に右クリックして、コンテキスト メニューを開いて Cloth アセットを作成します。
3,コンテキスト メニューから、[Create Cloth Asset from Selection (選択したものから Cloth アセットを作成)] を選びます。

 A,Asset Name – 後で簡単に見つけられるようにアセットに名前を付けてください。

 B,Remove from Mesh – クロスとして関連付けたい別個のジオメトリのメッシュの構成要素があれば、このオプションを有効にします。そうでなければ、チェックを入れずにこのままにします。

 C,Physics Asset – Cloth アセットがキャラクター用ならば、その Physics アセットを使ってクロス シミュレーションで適切なコリジョンが生じるようにします。

4,[Create] ボタンをクリックします。


5,セクションを再度右クリックして、コンテキスト メニューを表示させて、
[Apply Clothing Asset] にマウスをかざし、利用可能なクロス アセットから適用するものを選択します。これで作成した任意のクロス アセットが選択したセクションに関連付けられます。

ウィンドウ上部 [Activate Cloth Paint] ボタンをクリックして、選択した Cloth アセットをペイントするために使用可能なプロパティを有効にします。

「Cloth Window」の下のほうの

・ブラシの半径を5にして
・強度を0.2 か1でいいかも
・フォールオフ0.5
ポリゴン頂点をクリックすると塗れるピンクが塗ってない場所

・ペイント – マウスの左ボタン
・消去 – Shift キー + マウスの左ボタン
・クロスのプレビュー H キー

塗れた状態。

コツとしてマテリアルをisolateの状態にしてそれだけのメッシュを表示して塗ったほうが確実だ。

参考に走っても問題ない塗り

最後に Applyすることで動くようになる。

[UE5.3]第22回UE5ぷちコン22「下痢ゲー3」で使った技術とexeダウンロード

UE53PuciCo22G3 パッケージダウンロードはこちら

https://drive.google.com/file/d/1CSP6l-e4Dvui1CH9GYw_ifelUDYluELD/view?usp=sharing

使っているシェーダーは3Dnchuさんの

LV_StylizedPP_Example

ScreenSpaceHatching_Example

をカスタムしたものです。

管理用プロジェクト

https://drive.google.com/file/d/1qhC8rWejar8ctAWtRB9DCl6uqW9W-rDy/view?usp=sharing

【UE5.3】シェーダーファイルのインクルード方法について(Customノード編)についてをやってみた。

こちらの記事を丸っと参考にさせていただいて

【UE5】シェーダーファイルのインクルード方法について(Customノード編)

確認をとった

プロジェクト名はProjects_CustomNode

プロジェクトフォルダの直下にShadersフォルダを作成します。

Glitter.usf


float3 Glitter = float3(0.0,1.0,0.0);

return Glitter;

先ほど作成したシェーダーファイルを適用させるために、Projects_CustomNode.Build.cs に RenderCore を追加します。

// Copyright Epic Games, Inc. All Rights Reserved.

using UnrealBuildTool;

public class Projects_CustomNode : ModuleRules
{
	public Projects_CustomNode(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
	
		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore","RenderCore" });

		PrivateDependencyModuleNames.AddRange(new string[] {  });

		// Uncomment if you are using Slate UI
		// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
		
		// Uncomment if you are using online features
		// PrivateDependencyModuleNames.Add("OnlineSubsystem");

		// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
	}
}

Projects_CustomNode.h を開き、新しく “Modules/ModuleManager.h” を インクルードします。
さらに、継承クラスとして FDefaultGameModuleImpl を宣言し、StartupModule関数 と ShutdownModule関数 を一緒にオーバライドします。

// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "CoreMinimal.h"
#include "Modules/ModuleManager.h"


class FProjects_CustomNodeModule : public FDefaultGameModuleImpl
{
public:
	virtual void StartupModule() override;
	virtual void ShutdownModule() override;
};

Projects_CustomNode.cpp を開き、IMPLEMENT_PRIMARY_GAME_MODULE の最初の引数を Projects_CustomNode.h 側のクラス名に書き換えます。

// Copyright Epic Games, Inc. All Rights Reserved.

#include "Projects_CustomNode.h"
#include "Modules/ModuleManager.h"

void FProjects_CustomNodeModule::StartupModule()
{
	FString ShaderDir = FPaths::Combine(FPaths::ProjectDir(), "Shaders");
	AddShaderSourceDirectoryMapping("/Project", ShaderDir);
}
void FProjects_CustomNodeModule::ShutdownModule()
{
}
IMPLEMENT_PRIMARY_GAME_MODULE(FProjects_CustomNodeModule, Projects_CustomNode, "Projects_CustomNode" );

以上の流れが完了しましたら、一度ビルドを行います。

マテリアル作成しCustomノードのCodeに

#include "/Project/Glitter.usf"
return 0;

と入力したらOKでした。

プロジェクトデータ

https://drive.google.com/file/d/1Ro4pcatwqWKCQ64ZUObSndKtIyagYKE7/view?usp=sharing

[UE554]DLCによる追加キャラコンテンツ配布、ボスキャラDLCの作成のチュートリアルをやってみた。

基本的にこれをやった。

コンテンツ配布、DLC | Unreal Engine 5.5 ドキュメンテーション
https://dev.epicgames.com/documentation/ja-jp/unreal-engine/patching-content-delivery-and-dlc-in-unreal-engine

1,ChungDownloader Plugin を設定する

注意
・プロジェクトを作ったら一度ビルドしないと
[ProjectName]/Source/[ProjectName]Build.cs がない状態になります。

2,チャンク用のアセットを準備する

Primary Asset Label の設定はこれが正しいようだ。

フォルダに置けばディレクトリやファイルのパスの設定は不要の様子

パッケージ化したディレクトリに.pak ファイルができあがった。

Audit

 [Tools] > [Asset Audit] の順にクリックして、[Asset Audit] ウィンドウでチャンクを確認することもできます。

3,ChunkDownloader のマニフェストとアセットをホスティングする

ディスク上のサイズ ではなく ファイル サイズ を使用する

マニフェスト ファイルは、次のとおりです。

BuildManifest-Windows.txt

	$NUM_ENTRIES = 9
	$BUILD_ID = PatchingDemoKey
	pakchunk1001-Windows.ucas	400	ver01	1001	/Windows/pakchunk1001-Windows.ucas
	pakchunk1002-Windows.ucas	400	ver01	1002	/Windows/pakchunk1002-Windows.ucas
	pakchunk1003-Windows.ucas	416	ver01	1003	/Windows/pakchunk1003-Windows.ucas
	pakchunk1001-Windows.utoc	383	ver01	1001	/Windows/pakchunk1001-Windows.utoc
	pakchunk1002-Windows.utoc	383	ver01	1002	/Windows/pakchunk1002-Windows.utoc
	pakchunk1003-Windows.utoc	381	ver01	1003	/Windows/pakchunk1003-Windows.utoc
	pakchunk1001-Windows.pak	339	ver01	1001	/Windows/pakchunk1001-Windows.pak
	pakchunk1002-Windows.pak	339	ver01	1002	/Windows/pakchunk1002-Windows.pak
	pakchunk1003-Windows.pak	339 ver01	1003	/Windows/pakchunk1003-Windows.pak
  • バージョン。これは任意の文字列に設定することができます。
  • インデックス。これは、プライマリ ラベル アセットに使用した チャンク インデックス の値と一致する必要があります。
  • ファイルのパス、マニフェスト ファイルが配置される場所との相対パスです。

このファイル作成が面倒なので、pythonで自動化しました。

参考のエラー

log chunkdownloader: error: manifest parse error at ../../../../../../sandbox/ue554assemanager/010chunkdowloader/patchingdemo 4_6 all2/saved/persistentdownloaddir/pakcache/cachedbuildmanifest.txt:1

参考URL

https://forums.unrealengine.com/t/primaryassetlabel-explicitassets/455608

Project/PatchingDemoKeyAuto_python.py


# 1 BuildManifest-Windows.txt to Auto Coding
#  1-1 Open Dir \Windows\PatchingDemo\Content\Paks
import os

dir_path = "./Windows/PatchingDemo/Content/Paks/"

files = os.listdir(dir_path)
#print(files)
txtData=""
#minus global Line -2
filelength=len(files)-2
#txtData=txtData+"	$NUM_ENTRIES = 9"+"\r\n"
txtData=txtData+"$NUM_ENTRIES = "+str(filelength)+"\r"
txtData=txtData+"$BUILD_ID = PatchingDemoKey"+"\r"  
for filename in files:
    globalFindNum=filename.find('global')
    print("globalFindNum= "+str(globalFindNum))
    if(globalFindNum==0):
        pass
    else:
        endNum=filename.find('-')
        filenum=filename[8:endNum]
        fileSize=os.path.getsize(dir_path+filename)
        windowsPath="/Windows/"+filename
        #print("filename= "+filename+" fileSize= "+str(fileSize))
        tab="\t"
        print(tab+filename+tab+str(fileSize)+tab+"ver01"+tab+filenum+tab+windowsPath)
        txtData=txtData+filename+tab+str(fileSize)+tab+"ver001"+tab+filenum+tab+windowsPath+"\r" 
filePath="./BuildManifest-Windows.txt"
f = open(filePath, 'w', encoding='UTF-8')
f.write(txtData)
f.close()

# 2 copy

起動用バッチファイル

@echo off
set cwdirpath=%~dp0
set pythonpath=D:\Sandbox\python\python-3.12.7\
set codepath=%cwdirpath%\
set pyfile=PatchingDemoKeyAuto_python.py

%pythonpath%python.exe %codepath%%pyfile%
::pause
cmd /k

パッケージ ファイルを「/Windows/PatchingDemo/Content/Paks/」から「PatchingDemoKey」フォルダのマニフェストと一緒に並んでいる「Windows」という名前のサブフォルダ内にコピーします。

・ファイルをローカル テスト サーバーでホスティングする

IISサーバーをオンにするためにWindows エクスプローラーで [Start Menu] を開き、[Turn Windows Features on or off (Windows の機能の有効化または無効化)] を検索して開きます

[Windows Features] メニューで、[Internet Information Services (インターネット情報サービス)] を有効にして [OK] をクリックします。

(IIS Managerを開いて [Directory Browsing (ディレクトリをブラウズ)] を有効にします。

[Add MIME Type] ウィンドウで [File Name extension] を .pak に設定し、[MIME type] を「application/octet-stream」に設定します。.ucas と .utoc にも同様の操作をします。

これにより、IIS はリクエストされると、ただファイルをダウンロードします。

[Default Web Site] フォルダに移動します。デフォルトでは「C:\inetpub\wwwroot」です。フォルダを作成し、「PatchingDemoCDN」という名前を付けます。

PatchingDemoKey」フォルダを「PatchingDemoCDN」にコピーします。

プロジェクトのConfig/ DefaultGame.ini ファイルを開き、次の情報を追加して CDN Base URL を定義します。

[/Script/Plugins.ChunkDownloader PatchingDemoLive]
     +CdnBaseUrls=127.0.0.1/PatchingDemoCDN


この URL は、ファイルが配置されているウェブサイトを ChunkDownloader に示しています。PatchingDemoLive 修飾子により、ターゲットのプラットフォームに応じて様々な CDN デプロイ コンフィギュレーションを使用できます。

アセットをパッケージ ファイルに分割し、ローカル ウェブサイトにステージングできたので、Unreal Engine でパッチ適用ソリューションを使用してアクセスすることができるようになりました。

4,ChunkDownloader をゲームに実装する

 PatchingDemoGameInstance を

ブランクなC++プロジェクトにC++フォルダがない状態で、C++ クラスを作る方法
「Tools」プルダウンメニューから「New C++ Class…」を選択します。
ここで新しいクラスを作成できます。

GameInstance

「PatchingDemoGameInstance」を作成

PatchingDemoGameInstance.h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Engine/GameInstance.h"
#include "PatchingDemoGameInstance.generated.h"

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FPatchCompleteDelegate, bool, Succeeded);



/**
 * 
 */
UCLASS()
//class UPatchingDemoGameInstance : public UGameInstance
class PATCHINGDEMO_API UPatchingDemoGameInstance :public UGameInstance
{
	GENERATED_BODY()
	public:
        // Overrides
         virtual void Init() override;
         virtual void Shutdown() override;

         UFUNCTION(BlueprintPure, Category = "Patching|Stats")
         void GetLoadingProgress(int32& BytesDownloaded, int32& TotalBytesToDownload, float& DownloadPercent, int32& ChunksMounted, int32& TotalChunksToMount, float& MountPercent) const;	         // Delegates
         
         // Fired when the patching process succeeds or fails
         UPROPERTY(BlueprintAssignable, Category = "Patching");
         FPatchCompleteDelegate OnPatchComplete;

         // Starts the game patching process.Returns false if the patching manifest is not up to date.*/
         UFUNCTION(BlueprintCallable, Category = "Patching")
         bool PatchGame();


 
    protected:
        //Tracks if our local manifest file is up to date with the one hosted on our website
        bool bIsDownloadManifestUpToDate;

        //Called when the chunk download process finishes
        void OnManifestUpdateComplete(bool bSuccess);

        // List of Chunk IDs to try and download
        UPROPERTY(EditDefaultsOnly, Category = "Patching")
        TArray<int32> ChunkDownloadList;

        // Called when the chunk download process finishes
        void OnDownloadComplete(bool bSuccess);

        // Called whenever ChunkDownloader's loading mode is finished
        void OnLoadingModeComplete(bool bSuccess);

        // Called when ChunkDownloader finishes mounting chunks
        void OnMountComplete(bool bSuccess);
};

PatchingDemoGameInstance.cpp

// Fill out your copyright notice in the Description page of Project Settings.


#include "PatchingDemoGameInstance.h"

#include "ChunkDownloader.h"
#include "Misc/CoreDelegates.h"
#include "AssetRegistry/AssetRegistryModule.h"



void UPatchingDemoGameInstance::Init()
{
    Super::Init();
    const FString DeploymentName = "PatchingDemoLive";
    const FString ContentBuildId = "PatchingDemoKey";

    // initialize the chunk downloader with chosen platform
    TSharedRef<FChunkDownloader> Downloader = FChunkDownloader::GetOrCreate();
    Downloader->Initialize("Windows", 8);

    // load the cached build ID
    Downloader->LoadCachedBuild(DeploymentName);

    // update the build manifest file
    TFunction<void(bool bSuccess)> UpdateCompleteCallback = [&](bool bSuccess) {bIsDownloadManifestUpToDate = true; };
    Downloader->UpdateBuild(DeploymentName, ContentBuildId, UpdateCompleteCallback);
}


void UPatchingDemoGameInstance::Shutdown()
{
    Super::Shutdown();
    // Shut down ChunkDownloader
    FChunkDownloader::Shutdown();
}


void UPatchingDemoGameInstance::OnManifestUpdateComplete(bool bSuccess)
{
    bIsDownloadManifestUpToDate = bSuccess;
}

void UPatchingDemoGameInstance::GetLoadingProgress(int32& BytesDownloaded, int32& TotalBytesToDownload, float& DownloadPercent, int32& ChunksMounted, int32& TotalChunksToMount, float& MountPercent) const
{
    //Get a reference to ChunkDownloader
    TSharedRef<FChunkDownloader> Downloader = FChunkDownloader::GetChecked();

    //Get the loading stats struct
    FChunkDownloader::FStats LoadingStats = Downloader->GetLoadingStats();

    //Get the bytes downloaded and bytes to download
    BytesDownloaded = LoadingStats.BytesDownloaded;
    TotalBytesToDownload = LoadingStats.TotalBytesToDownload;

    //Get the number of chunks mounted and chunks to download
    ChunksMounted = LoadingStats.ChunksMounted;
    TotalChunksToMount = LoadingStats.TotalChunksToMount;

    //Calculate the download and mount percent using the above stats
    DownloadPercent = ((float)BytesDownloaded / (float)TotalBytesToDownload) * 100.0f;
    MountPercent = ((float)ChunksMounted / (float)TotalChunksToMount) * 100.0f;
}

bool UPatchingDemoGameInstance::PatchGame()
{
    // make sure the download manifest is up to date
    if (bIsDownloadManifestUpToDate)
    {
        // get the chunk downloader
        TSharedRef<FChunkDownloader> Downloader = FChunkDownloader::GetChecked();

        // report current chunk status
        for (int32 ChunkID : ChunkDownloadList)
        {
            int32 ChunkStatus = static_cast<int32>(Downloader->GetChunkStatus(ChunkID));
            UE_LOG(LogTemp, Display, TEXT("Chunk %i status:%i"), ChunkID, ChunkStatus);
        }

        TFunction<void(bool bSuccess)> DownloadCompleteCallback = [&](bool bSuccess) {OnDownloadComplete(bSuccess); };
        Downloader->DownloadChunks(ChunkDownloadList, DownloadCompleteCallback, 1);

        // start loading mode
        TFunction<void(bool bSuccess)> LoadingModeCompleteCallback = [&](bool bSuccess) {OnLoadingModeComplete(bSuccess); };
        Downloader->BeginLoadingMode(LoadingModeCompleteCallback);
        return true;
    }

    // you couldn't contact the server to validate your Manifest, so you can't patch
    UE_LOG(LogTemp, Display, TEXT("Manifest Update Failed.Can't patch the game"));

    return false;
}

void UPatchingDemoGameInstance::OnLoadingModeComplete(bool bSuccess)
{
    OnDownloadComplete(bSuccess);
}

void UPatchingDemoGameInstance::OnMountComplete(bool bSuccess)
{
    OnPatchComplete.Broadcast(bSuccess);
}

void UPatchingDemoGameInstance::OnDownloadComplete(bool bSuccess)
{
    if (bSuccess)
    {
        UE_LOG(LogTemp, Display, TEXT("Download complete"));

        // get the chunk downloader
        TSharedRef<FChunkDownloader> Downloader = FChunkDownloader::GetChecked();
        FJsonSerializableArrayInt DownloadedChunks;

        for (int32 ChunkID : ChunkDownloadList)
        {
            DownloadedChunks.Add(ChunkID);
        }

        //Mount the chunks
        TFunction<void(bool bSuccess)> MountCompleteCallback = [&](bool bSuccess) {OnMountComplete(bSuccess); };
        Downloader->MountChunks(DownloadedChunks, MountCompleteCallback);

        OnPatchComplete.Broadcast(true);
    }
    else
    {
        UE_LOG(LogTemp, Display, TEXT("Load process failed"));

        // call the delegate
        OnPatchComplete.Broadcast(false);
    }
}

Unreal Editor で、新規「Blueprints」フォルダを コンテンツ ブラウザ に作成します。次に、ベース クラスとして PatchingDemoGameInstance を使用して 新しいブループリント を作成します。

新しいブループリント クラスの名前を「CDGameInstance」にします。

新しく GameMode ブループリントを PatchingGameMode という名前で作成します。

Maps」フォルダを作成し、次に 2 つの新規レベルで作成します。

PatchingDemoEntry レベルは空のマップをベースに、
PatchingDemoTest レベルはデフォルトのマップ
ベースにする必要があります。

[Project Settings (プロジェクト設定)] を開いて [Project] > [Maps & Modes (マップ & モード)] に移動します。次のパラメータを設定します。

1Game Instance Class (ゲーム インスタンス クラス)CDGameInstance
2Editor Startup Map (エディタのスタートアップ マップ)PatchingDemoTest
3Game Default Map (ゲームのデフォルト マップ)PatchingDemoEntry

CDGameInstance を ブループリント エディタ で開きます。[Details (詳細)] パネルで 3 つのエントリを [Chunk Download List (チャンク ダウンロード リスト)] に追加し、それぞれの値を 100110021003 と入力します。これらがチャンク ID です。

PatchingGameMode を ブループリント エディタ で開き、[EventGraph] に

Bigin Playに

Tickで

ダウンロードしたコンテンツを表示する

キャラクター メッシュを表示するには、それらへの参照を取得する必要があります。このセクションでは、アクタのスポーン方法のシンプルな例を説明します。

  1. PatchingDemoTest レベルを開き、次に レベル ブループリント を開きます。
  2. 新規変数を Meshes という名前で作成します。
    • [Variable Type (変数の型)] には [Skeletal Mesh (スケルタルメッシュ)] を選択します。
    • タイプのリストでエントリにマウスオーバーして [Object Reference (オブジェクト参照)] を選択します。

[Meshes (メッシュ)] の [Variable Type (変数の型)] の隣にあるアイコンをクリックし、[Array (配列)] に変更します。ブループリントをコンパイルして変更を適用します。

[Meshes] の [Default Value (デフォルト値)] に 3 つのエントリを追加し、BorisCrunch、およびKhaimera のスケルタルメッシュを選択します。

レベルの イベントグラフ で BeginPlay

レベル内の Player Start を

位置 (256.0, 400.0, 100.0) に移動します。

回転を(0.0,0.0,-90.0)に回転します。

PatchingDemoEntryレベルのゲームモードオーバーライドをPatchingGameModeにします。

Editorでできた!

1,windowsパッケージ化
2,Project/PatchingDemoKeyAuto_cmd.cmd実行

3,Project/BuildManifest-Windows.txt を

4,C:\inetpub\wwwroot\PatchingDemoCDN\PatchingDemoKey へコピー

5,Project\Windows\PatchingDemo\Content\Paks の内容を全部
6,C:\inetpub\wwwroot\PatchingDemoCDN\PatchingDemoKey\Windowsへ コピー

7,Project/WindowsのPatchingDemo.exeを起動

出た!

管理用 全作業データダウンロード

https://drive.google.com/file/d/1YajdJSvuFCg2lAjnPIcIGXcuFC_oHsVm/view?usp=sharing

[UE554] Asset Managerのアセットの非同期ロード機能について試してみた事

https://youtu.be/8LxNPup4TSo

(BP_NextMapPreloadアクターで)非同期ロードはAsync Load Primary Assetノードでやる。(PrimaryAssetを設定するには下の下の設定が必要)

プロジェクト設定で以下の設定をしてUE再起動すると上画像で選べるようになる。Specific Assetでロードマップを設定しないとパッケージでは動かなかった。

その後BP_NextLevelでOpenLevelする。

できたパッケージのテストがこちら

https://youtu.be/8LxNPup4TSo