mawasiの備忘録

忘れやすい自分の為のプログラムやその他諸々に関するメモ

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回目のシーケンスデータのセットアップ呼ばれてるから動的生成でもいけそう。

参考

Actor Lifecycle
シーケンサーエディタ

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」
これをやっておかないとキャプチャしたプロファイルが詳細表示されない

参考

公式リファレンス
【UE5】意図的に特定のスレッドをスリープさせる

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チャンネルくらいあるみたい)

参考

glsl関数公式リファレンス
ShaderToyの公式Document
GLSLについてのメモ

Visual Studio Code にインストールする拡張(自分用)

Windows環境の Visual Studio Code に追加する便利拡張一覧。
最低限これだけ入ってればだいたいのことはできるかと思います。

C/C++

InteliSenseやデバッグなどの言語サポート機能を追加する拡張
ビルドやデバッグまで行うにはCygwinMinGWが必要

glTF Tools

3DモデルフォーマットglTFのプレビューとデバッグ機能を追加する拡張

Hex Editor

バイナリエディター機能を追加する拡張

Python

Pythonの言語サポート機能を追加する拡張
この拡張機能をインストールする際に、以下の拡張も一緒にインストールされる
Jupyter
Pylance

Shader languages support for VS Code

HLSL,GLSL,Cgの言語サポート機能を追加する拡張

おまけ

Shader Toy

ShaderToy のような機能をVSCodeに追加する拡張