これは Siv3D Advent Calendar 2025 の投稿記事です。
本記事では、Siv3D 0.6.x(現時点では 0.6.16)の、まだ公式ドキュメント等であまり触れられていない機能や、便利機能、ハマったポイント(実体験)など雑多な小ネタをいくつか紹介します。
PixelShaderAsset
TextureAsset や FontAsset 同様、PixelShader もアセットとして利用することができます。
// アセット登録
PixelShaderAsset::Register(U"BgShader", HLSL{ U"shader/bg.hlsl", U"PS" });
//...
// 非同期ローディング
PixelShaderAsset::Load(U"BgShader");
//...
{
// このスコープでテクスチャ描画にシェーダを適用する
const ScopedCustomShader2D shader{ PixelShaderAsset(U"BgShader") };
bgTexture.draw();
}
Siv3D でのアセット管理について:
フォントをアセットに登録し、かつフォールバックフォントを設定する
手順は次のとおりです。
-
Fontを作成してフォールバックフォントを設定 -
FontAssetDataのfontフィールドに上記Fontをセット -
FontAsset::Registerでアセット登録
auto font1Data = std::make_unique<FontAssetData>();
font1Data->font = Font{ 12, U"Font1.ttf" };
// フォールバックフォントの設定
Font fontFallback{ 12, U"Font2.ttf" };
font1Data->font.addFallback(fontFallback);
// アセットに登録
FontAsset::Register(U"Font1", std::move(font1Data));
フォールバックフォントについて:
シーンの更新と描画を別々に行う
まずは基本的なシーンの更新方法。
App manager;
manager.add<Title>(U"Title");
while (System::Update())
{
// シーンの更新と描画
if (not manager.update())
{
break;
}
}
更新と描画は別々のタイミングで行うことができます。
これにより、例えば特定の条件において更新はするが描画はスキップする、など柔軟なシーン管理をすることができます。
App manager;
manager.add<Title>(U"Title");
while (System::Update())
{
// シーンの更新
if (not manager.updateScene())
{
break;
}
// シーンの描画
app.drawScene();
}
Siv3D でのシーン管理について:
lerp で色を変化させる
Siv3D では様々なクラスに lerp 関数が用意されています。A.lerp(B, x) とすると、A ~ B 間を割合 x(0.0~1.0)で線形補間した値が得られます。
色を表す Color (ColorF) にも用意されており、個人的に多用しています。
color.lerp(Palette::Black, 0.1) //ちょっと暗くする
color.lerp(Palette::White, 0.1) //ちょっと明るくする
color.lerp(Palette::Red, Periodic::Square0_1(100ms)) //赤く点滅
// などなど…
Audio をフェードありで停止したあと音量が0になっているの忘れがち
例えば、ある Audio を一時停止しようとして
// 再生を一時停止
audio1.pause(0.1s);
// ...
// 再生を再開・・・???
audio1.play();
としたとします。この場合、再生を再開しても、一時停止時にフェードアウトをしたことにより、audio1 の音量が 0 になっているため、(再生がされてはいるものの)何も聞こえません。
再開前に Audio::setVolume() で音量を設定するか、再開時にもフェード時間を指定する必要があります。
ここにしっかり「音量を 0 に変化させ、一時停止します」と書かれているので、見落としていた私の落ち度なのですが、「あれ、聞こえない???」となって少しハマってしまった実体験から、ここに記録させていただきます。
さいごに
ここでちゃんと解説されてるよ!・使い方間違ってんよ!・もっと良い方法があるよ! など、何かありましたらツッコミをお願いいたします。