DaySequence調査メモ
DaySequence基本
UE5.7のDaySequenceプラグインについての調査メモ
2026/05/18 更新
1日を何時間とするか、再生速度、開始時刻はどこで制御しているか
- DayLength:
1日の長さ。デフォルトは24時間 - TimePerCycle:
1日が実時間のどれだけの長さで過ぎるか。デフォルトは5分 - InitialTimeOfDay:
再生開始時刻の指定。デフォルトは6時
DayLengthはデフォルトのままで良さそう。
InitialTImeOfDayはゲームに合わせて調整したら良さそう。
TimePerCycleが制御難しそう。
基本の再生速度をこれで定義して、動的に変化させるのは別途タイムスケールみたいなの用意したい。
SunMoonDaySequenceActor調査
SunLight(DirectionalLight)はどこで制御されてる?
動的生成されてるRootSequencerが持つ、SubSequenceがSunLightを動かしてた。
このSubSequenceは特にアセットがあるわけではなく、動的生成されてるっぽい?
SunLightはDaySequenceCollectionAssetが持つFProceduralDaySequenceのリストデータを元に、動的にシーケンスデータ化して再生されてる。
FProceduralDaySequenceを継承した構造体を独自で用意すれば、複数ライトを独自の制御するシーケンス作れるかも?
ただし基本的に一定の動きをするシーケンスを動的生成するための定義を作るだけのデータなので、細かい独自の動きをするシーケンスを生成する物作るとかは難しそう。
一つのオブジェクトを制御するのに一つFProceduralDaySequence継承構造体を作ってDataAssetのリストデータに登録。
FProceduralDaySequence継承構造体で複数のオブジェクトを制御するシーケンスは作れない。
やる必要もないけど。
例えばMoonLightを制御したいなら、それ用の構造体を用意するか、SunPositionSequence構造体使って制御するコンポーネントをMoonLight指定すればいい。
DaySequenceCollectionAsset.h
public:
UPROPERTY(EditAnywhere, Category="Day Sequence")
TArray<FDaySequenceCollectionEntry> DaySequences;
// このリストにFProceduralDaySequence継承構造体を複数登録していく
UPROPERTY(EditAnywhere, Category="Day Sequence", meta = (ExcludeBaseStruct))
TArray<TInstancedStruct<FProceduralDaySequence>> ProceduralDaySequences;
DaySequenceにはFProceduralDaySequenceを継承した構造体が以下の種類用意されてる。
基本的に用途が決まってるので専用の構造体を継承して作ったほうが良さそう。
- FSunPositionSequence
- FSunAngleSequence
- FSineSequence
InitialTimeOfDayをランタイムで外部パラメータから設定したい
できる?
できなさそう。
できるかも。下記参照。
関数は用意されているが、InitialTimeOfDayを反映させるにはルートシーケンスデータの作り直しが必要になる。
ランタイム中に動的に作り直しは可能か?
もしくは開始時刻分のDaySequenceActorを用意して、シーンに合わせて生成?
そもそもこのアクターを動的生成っていけるのか?
レベルに直置きしてないと使えない?
InitialTimeOfDayを変更しようとするのではなく、SetTimeOfDay関数で時刻操作してやる
/**
* Set the initial time of day in game time in hours.
*
* This is currently intentionally not exposed to Blueprint since
* this property can only be realized by rebuilding the root sequence.
*
* @param InHours initial time of day.
*/
UE_API void SetInitialTimeOfDay(float InHours);
シーケンスのセットアップはActor::PostLoad関数から行われてる。
PostLoadから色々経て最終的にFSunPositionSequence::BuildSequence関数内でシーケンスデータとして生成されてる。
PostLoad関数はレベルにおいてあるアクターがレベルがロードされるタイミングで呼び出される。
SpawnActorからは呼ばれない関数らしい。
SpawnActorからは代わりにPostActorCreated関数が呼ばれる。
この関数からの実装は無さそうなので、DaySequenceActorをSpawnActorするのはうまくいかないかも。
独自実装したActor作ってやればいいか?
PostInitializeComponentsから2回目のシーケンスデータのセットアップ呼ばれてるから動的生成でもいけそう。
タイミング的にSpawnActorしたあとにInitialTimeOfDay変更してもFSunPositionSequence::BuildSequence関数はもう処理されたあとなので、別途独自にBuildSequence呼び出す流れ作らないとダメかも。
1回目のBuildSequence関数 FSunPositionSequence::BuildSequence(UProceduralDaySequenceBuilder *) SunPositionSequence.cpp:175 FProceduralDaySequence::GetSequence(ADaySequenceActor *) ProceduralDaySequence.cpp:22 ADaySequenceActor::InitializeDaySequences() DaySequenceActor.cpp:825 ADaySequenceActor::InitializeRootSequence() DaySequenceActor.cpp:682 ADaySequenceActor::PostLoad() DaySequenceActor.cpp:277 UObject::ConditionalPostLoad() Obj.cpp:1388 UObject::PostLoadSubobjects(FObjectInstancingGraph *) Obj.cpp:1446 UObject::ConditionalPostLoadSubobjects(FObjectInstancingGraph *) Obj.cpp:1514 UObject::ConditionalPostLoad() Obj.cpp:1367 UObject::PostLoadSubobjects(FObjectInstancingGraph *) Obj.cpp:1446 UObject::ConditionalPostLoadSubobjects(FObjectInstancingGraph *) Obj.cpp:1514 UObject::ConditionalPostLoad() Obj.cpp:1367 FStaticMeshComponentHelper::GetMaterial<…>(const UStaticMeshComponent &, int, bool, bool) StaticMeshComponentHelper.h:127 [Inlined] UE::Core::Private::Function::TFunctionRefBase::operator()(int) Function.h:414 UStaticMesh::GetUsedMaterials(TArray<…> &, TFunctionRef<…>) StaticMesh.cpp:9960 FStaticMeshComponentHelper::GetUsedMaterials<…>(const UStaticMeshComponent &, TArray<…> &, bool) StaticMeshComponentHelper.h:144 `UWorld::PostDuplicate'::`48'::<lambda_1>::operator()() World.cpp:1434 UWorld::PostDuplicate(bool) World.cpp:1457 StaticDuplicateObjectEx(FObjectDuplicationParameters &) UObjectGlobals.cpp:3305 UWorld::GetDuplicatedWorldForPIE(UWorld *, UPackage *, int) World.cpp:4409 UEditorEngine::CreatePIEWorldByDuplication(FWorldContext &, UWorld *, FString &) PlayLevel.cpp:2381 UGameInstance::InitializeForPlayInEditor(int, const FGameInstancePIEParameters &) GameInstance.cpp:337 UEditorEngine::CreateInnerProcessPIEGameInstance(FRequestPlaySessionParams &, const FGameInstancePIEParameters &, int) PlayLevel.cpp:3002 UEditorEngine::OnLoginPIEComplete_Deferred(int, bool, FString, FPieLoginStruct) PlayLevel.cpp:1628 UEditorEngine::CreateNewPlayInEditorInstance(FRequestPlaySessionParams &, const bool, EPlayNetMode) PlayLevel.cpp:1892 UEditorEngine::StartPlayInEditorSession(FRequestPlaySessionParams &) PlayLevel.cpp:2911 UEditorEngine::StartQueuedPlaySessionRequestImpl() PlayLevel.cpp:1206 UEditorEngine::StartQueuedPlaySessionRequest() PlayLevel.cpp:1103 UEditorEngine::Tick(float, bool) EditorEngine.cpp:2057 UUnrealEdEngine::Tick(float, bool) UnrealEdEngine.cpp:534 FEngineLoop::Tick() LaunchEngineLoop.cpp:5828 [Inlined] EngineTick() Launch.cpp:60 GuardedMain(const wchar_t *) Launch.cpp:192 LaunchWindowsStartup(HINSTANCE__ *, HINSTANCE__ *, char *, int, const wchar_t *) LaunchWindows.cpp:266 WinMain(HINSTANCE__ *, HINSTANCE__ *, char *, int) LaunchWindows.cpp:334 2回目のBuildSequence関数 FSunPositionSequence::BuildSequence(UProceduralDaySequenceBuilder *) SunPositionSequence.cpp:175 FProceduralDaySequence::GetSequence(ADaySequenceActor *) ProceduralDaySequence.cpp:22 ADaySequenceActor::InitializeDaySequences() DaySequenceActor.cpp:825 ADaySequenceActor::InitializeRootSequence() DaySequenceActor.cpp:682 ADaySequenceActor::InitializePlayer() DaySequenceActor.cpp:560 ULevel::RouteActorInitialize(int) Level.cpp:3855 UWorld::InitializeActorsForPlay(const FURL &, bool, FRegisterComponentContext *) World.cpp:5933 UGameInstance::StartPlayInEditorGameInstance(ULocalPlayer *, const FGameInstancePIEParameters &) GameInstance.cpp:528 UEditorEngine::CreateInnerProcessPIEGameInstance(FRequestPlaySessionParams &, const FGameInstancePIEParameters &, int) PlayLevel.cpp:3187 UEditorEngine::OnLoginPIEComplete_Deferred(int, bool, FString, FPieLoginStruct) PlayLevel.cpp:1628 UEditorEngine::CreateNewPlayInEditorInstance(FRequestPlaySessionParams &, const bool, EPlayNetMode) PlayLevel.cpp:1892 UEditorEngine::StartPlayInEditorSession(FRequestPlaySessionParams &) PlayLevel.cpp:2911 UEditorEngine::StartQueuedPlaySessionRequestImpl() PlayLevel.cpp:1206 UEditorEngine::StartQueuedPlaySessionRequest() PlayLevel.cpp:1103 UEditorEngine::Tick(float, bool) EditorEngine.cpp:2057 UUnrealEdEngine::Tick(float, bool) UnrealEdEngine.cpp:534 FEngineLoop::Tick() LaunchEngineLoop.cpp:5828 [Inlined] EngineTick() Launch.cpp:60 GuardedMain(const wchar_t *) Launch.cpp:192 LaunchWindowsStartup(HINSTANCE__ *, HINSTANCE__ *, char *, int, const wchar_t *) LaunchWindows.cpp:266 WinMain(HINSTANCE__ *, HINSTANCE__ *, char *, int) LaunchWindows.cpp:334
InitialTimeOfDayを無理に変更しない
無理にInitialTimeOfDay変えて開始時刻を変えようとするのではなく、SetTimeOfDay関数を使って時刻制御してやる
UFUNCTION(BlueprintCallable, Category="TimeOfDay") UE_API bool SetTimeOfDay(float InHours);
ゲーム内で状況に合わせてDaySequenceデータ変えたい場合
例えばシーンごとに1日の長さが変わったりとかする場合、
Sequencerアセットを動的に切り替えるより、プレイヤーであるDaySequenceActorごとバリエーション用意して、状況に合わせて生成するのが良さそう。
DaySequenceActorのBP参照コレクションアセットを用意して、そのコレクションから動的に生成が良いかも。
既存のDaySequenceActorはレベルに直置き前提の作りになってるから、独自にPostActorCreatedからの実装を用意しないとSpawnActorで動的配置無理そう。
PostInitializeComponentsから2回目のシーケンスデータのセットアップ呼ばれてるから動的生成でもいけそう。
参考
RiderのMain menuを常時表示しておく設定方法
Rider2025.2.0.1(252.23892.537)時点の設定方法
Ctrl + Alt + s -> Appearance & Behavior -> Appearance -> Main Menu: [Marge with Main Toolbar]に変更

UnrealEngine採用タイトルセーブデータメモ
目的
自身のプロジェクトの参考用に、UEを採用している各タイトルのセーブデータがどこに保存されているか、どういうセーブデータがあるかをメモっていく
タイトルは随時増やしていく
タイトル
Expedition33
配置場所
環境依存(gfx関連とか)のセーブデータが配置されている
C:\Users\"UserName"\AppData\Local\Sandfall\Saved\Config
ゲーム進行関連やその他環境依存のない、クラウドバックアップ可能なセーブデータがまとまってるところと思われる
C:\Users\"UserName"\AppData\Local\Sandfall\Saved\SaveGames(数字)
内容
Config
「Windows」フォルダと「CrashReportClient」フォルダが有る
- CrashReportClient
クラッシュレポート関連のファイルが入ってるぽい - Windows
「GameUserSettings.ini」が一つだけ、環境依存系の設定情報が入ってる
SaveGames
直下に「Backup」フォルダと各種用途ごとに分割されたセーブデータが配置されている
Backupフォルダ
いくつかの今までの進行セーブデータがバックアップとして保存されている
最大いくつまで保存されているのかは不明(おそらく20個?)EnhancedInputUserSettings.sav
おそらくキーバインド関連の設定ぽいEXPEDITION_0.sav
ゲーム進行データPlatformSaveData.sav
プラットフォーム(PCとかXBOXとか?)固有のセーブデータ?SaveCntainer.sav
不明。予想もちょっとつかないSharedGameUserSettings.sav
クラウドバックアップ可能なセッティングデータまとめたやつ?steam_autocloud.vdf
スチームのクラウドセーブの設定ファイル?
参考
聖剣伝説3 TRIALS of MANA
配置場所
セーブデータが配置されているルートパス
Windowsにローカルユーザーでログインしてる場合は「OneDrive」は無いかも
C:\Users\"UserName"\OneDrive\ドキュメント\My Games\Trials of Mana\Steam(数字)
ゲームの進行データが配置されてる
\Saved\SaveGames
コンフィグデータが配置されてる
\Saved\Config\WindowsNoEditor
内容
Config
「GameUserSettings.ini」があるだけ
UEで用意されたセッティングデータ?
SaveGames
ADAT.sav, DAT.sav, SDAT(数字).sav がある
ADAT.savはおそらくオートセーブ
SDAT**.savはスロットごとのゲームセーブデータ
DAT.savはなにかわからない
Lies of P
配置場所
環境依存(gfx関連とか)のセーブデータが配置されている
(インストールドライブ)\SteamLibrary\steamapps\common\Lies of P\LiesofP\Saved\Config
ゲーム進行関連やその他環境依存のない、クラウドバックアップ可能なセーブデータがまとまってるところと思われる
(インストールドライブ)\SteamLibrary\steamapps\common\Lies of P\LiesofP\Saved\SaveGames(数字)
内容
Config
「WindowsNoEditor」フォルダと「CrashReportClient」フォルダが有る
- CrashReportClient
クラッシュレポート関連のファイルが入ってるぽい - WindowsNoEditor 「GameUserSettings.ini」が一つだけ、環境依存系の設定情報が入ってる
SaveGames(数字)
直下に各種セーブデータ
Account(数字).sav
OptionSlot.sav
SaveData-1_Character(数字).sav
steam_autocloud.vdf
SaveData-1_Character(数字).sav が多分ゲームのセーブデータぽい
Account(数字).sav がどういうセーブデータかちょっとわからない
ATOMIC HEART
配置場所
todo
【UE5】Unreal Insights で自身が作った関数の処理計測がしたい
やりたいこと
Unreal Insightsで自身が作った関数の処理負荷がどの程度か確認したい
手順
以下の手順でマーカーを埋め込める
// これをインクルードする
#include "ProfilingDebugging/CpuProfilerTrace.h"
// スリープ関連が定義されてるみたい
// 特になくてもビルドできたけど、うまくビルドできない場合はインクルードしてみること
#include "HAL/PlatformProcess.h"
void Function()
{
// 計測したい関数の頭にマクロ追加。()内はわかりやすい文字列を「""」無しで記述
QUICK_SCOPE_CYCLE_COUNTER(Function_Marker);
// 公式リファレンスではTEXT("")で記述しているが、エラーになるので↑の記述で問題ない
// 処理タイミングを確認したいだけだったりする場合
// ある程度処理負荷かけてないと見づらいので、スリープ入れたりすると良い
FPlatformProcess::Sleep(0.5f); // 0.5秒スリープさせる
}
注意点
Unreal Insightsでの処理計測前に以下のコマンドをcmdから入力しておくこと
「Stat NamedEvents」
これをやっておかないとキャプチャしたプロファイルが詳細表示されない
参考
Visual Studio 2022でデフォルトの文字コードを変更する方法
Visual Studio 2022でデフォルトの文字コードを変更する方法
ツールバーのTools -> Options -> Environment -> Documents
「Save files with a specific encoding」にチェックを入れて
下のドロップダウンから好きなエンコードを選択する
大抵はUTF-8のBOMなしかBOM付きのどっちかを選ぶと思う
「Unicode(UTF-8 with signature) - Code page 65001」ならBOM付きUTF-8
「Unicode(UTF-8 without signature) - Code page 65001」ならBOMなしUTF-8
Visual Studio 2022 17.13 以降で追加された項目らしい

GLSL関数メモ
ShaderToyで遊ぶときの自分用の関数チートシート
glsl関数
| 関数 | 説明 |
|---|---|
| radians(x) | xを度からラジアンに変換する |
| degree(x) | xをラジアンから度に変換する |
| abs(x) | xの絶対値を返す |
| sign(x) | xが正なら+1.0、0.0なら0.0、負なら-1.0を返す |
| floor(x) | x以下の最も近い整数に等しい値を返す(0.5なら0) |
| ceil(x) | x以上の最も近い整数に等しい値を返す(0.5なら1) |
| fract(x) | x-floor(x)を返す |
| mod(x, y) | x-y*floor(x/y)を返す |
| min(x, y) | xとyのより小さい値を返す |
| max(x, y) | xとyのより大きい値を返す |
| clamp(x, a, b) | min(max(x, a), b)を返す |
| mix(x, y, a) | x(1-a)+y*aを返す(線形補間 HLSLでいうlerp) |
| step(a, x) | xがa未満の場合は0.0を、それ以上の場合は1.0に二値化して返す |
| smoothstep(e0, e1, x) | エルミート補完を行う |
| sin(x) | 正弦を返す(x = ラジアン) |
| cos(x) | 余弦を返す(x = ラジアン) |
| tan(x) | 正接を返す(x = ラジアン) |
| asin(x) | 逆正弦を返す(x = ラジアン) |
| acos(x) | 逆余弦を返す(x = ラジアン) |
| atan(y, x) | 逆正接を返す(x = ラジアン) |
| pow(x, y) | xのy乗を返す |
| exp(x) | eのx乗を返す |
| log(x) | xの自然対数を返す |
| exp2(x) | 2のx乗を返す |
| log2(x) | xの底2のlogを返す |
| sqrt(x) | xの平方根を返す |
| inverssqrt(x) | 1/sqrt(x)を返す |
| length(x) | xの長さをfloatで返す |
| distance(x, y) | xとyの距離をfloatで返す |
| normalize(x) | xを正規化した値を返す |
| dot(x, y) | xとyの内積をfloatで返す |
| cross(v1, v2) | vec3型の引数v1とv2の外積をvec3で返す |
| faceforward(N, I, R) | dot(R, I) < 0ならNを返し、それ以外は-Nを返す |
| reflect(I, N) | Nを法線として、Iの反射方向をIと同じ型で返す |
| refract(I, N, eta) | Nを法線、eta(常にfloat型)を屈折率として、Iの屈折方向をIと同じ型で返す |
| lessThan(x, y) | 要素ごとの x < y の比較結果を返す |
| lessThanEqual(x, y) | 要素ごとの x <= y の比較結果を返す |
| greaterThan(x, y) | 要素ごとの x > y の比較結果を返す |
| greaterThanEqual(x, y) | 要素ごとの x >= y の比較結果を返す |
| equal(x, y) | 要素ごとの x == y の比較結果を返す |
| notEqual(x, y) | 要素ごとの x != y の比較結果を返す |
| any(x) | xのすべての要素がfalseならfalseを、それ以外ならtrueを返す |
| all(x) | xのすべての要素がtrueならtrueを、それ以外ならfalseを返す |
| not(x) | xの全要素の真偽値を反転して返す(bool or bvec) |
ShaderToyのビルトインコマンド
| コマンド | 型 | 説明 |
|---|---|---|
| iResolution | vec3 | 画面解像度(Pixel) |
| iTime | floatg | 経過時間(秒) |
| iTimeDelta | float | レンダリング時間?(秒) |
| iFrame | float | 経過フレーム |
| iChannelTime[4] | float | 各チャンネルの経過時間(秒) |
| iMouse | vec4 | マウスのピクセル座標(xy: current (if MLB down), zw: click) |
| iDate | vec4 | (year, month, day, time in seconds) |
| iSampleRate | float | サウンド用のサンプリングレート(概ね44100 or 48000) |
| iChannelResolution[4] | vec3 | 各チャンネルの画面解像度(Pixel) |
| iChanneli | samplerXX | テクスチャサンプラー(最後の「i」は数字 4チャンネルくらいあるみたい) |
参考
Visual Studio Code にインストールする拡張(自分用)
Windows環境の Visual Studio Code に追加する便利拡張一覧。
最低限これだけ入ってればだいたいのことはできるかと思います。
C/C++
InteliSenseやデバッグなどの言語サポート機能を追加する拡張
ビルドやデバッグまで行うにはCygwinかMinGWが必要
glTF Tools
3DモデルフォーマットglTFのプレビューとデバッグ機能を追加する拡張
Hex Editor
バイナリエディター機能を追加する拡張
Python
Pythonの言語サポート機能を追加する拡張
この拡張機能をインストールする際に、以下の拡張も一緒にインストールされる
Jupyter
Pylance
Shader languages support for VS Code
HLSL,GLSL,Cgの言語サポート機能を追加する拡張