【Unity6.3】ShaderGraph ディザリングで半透明を表現する手法について

ディザ抜きについて軽く調べたことをまとめておきます。
ディザリングとは?という部分に関しては他の方のブログなどにまとまっていると思いますので省略させていただきます。

ディザリング手法の種類

代表的なディザリングの手法として以下のようなものがあります。
(リンクは貼らず、検索しやすいように名称のみ記載しています)
Bayer Matrix Dither
Void-and-Cluster
Interleaved Gradient Noise(Jimenez SIGGRAPH 2014)
Spatiotemporal Blue Noise
ここではゲーム開発で使用されることが多い
Bayer Matrix DitherとInterleaved Gradient Noiseについて取り上げます。

Bayer Matrix Dither


あらかじめ決められたBayer行列によるディザリングで、とても簡単なものです。
Shader Graphに入っているDitherノードは、4×4(16要素)のBayer行列を基に出力を決定します。
ゲーム開発でも昔から使用されているもので
特徴的な格子が見え、レトロなゲームで目にしたことがある人も多いかと思います。
続きを読む →

【Unity6】TMPのピクセルフォントの設定

Atlas Resolutionは適切に
ピクセルフォントなら文字数によっては512×512でも十分な場合も

フォントサイズの指定がある場合はサイズを指定
フォントの配布サイトなどに記載があるので確認しておく。
今回使用しているフォント名が x12y12pxMaruMinyaM となっており、縦横のサイズが12pxで想定されているので明示的に指定しておく。
Paddingが小さいとアウトラインが正常に出せなくなったりするのでプロジェクト毎で調整

RenderModeはRASTER

Atlas作成後
Texture2DファイルのFilterModeをPointにする
ピクセルフォントでは必須

TMP設定
フォントの最小サイズは作成時の最小以下にしない
作成時にフォントサイズを指定した場合にはそのサイズ以下にしてしまうとドットが崩れてしまうので
AutoSizeなどを使う場合にはminの指定に気をつける
Editorで確認する際には、Sceneタブでは解像度が適用されていないのでGameタブを見る。

この記事のフォントは 患者長ひっく様のx12y12pxMaruMinyaM マルミーニャM を使用させていただいております。

【Unity6】Macでビルドしたものを実行した際にGameMode通知が出るのに対応する

※追記2026/01/22
詳しく調べたところ通知が出るのはMac側の仕様で対策するのは難しいことがわかりました

フルスクリーンで起動しているとこの通知が出るようです
以下のコードでplist側でデフォルトのGameModeをオフにしても
オフになっているという通知がでてしまいます。

<key>LSSupportsGameMode</key>
<false/>

ユーザーがMac側の設定でGameCenterの通知を切る
アプリをフルスクリーンで起動しないようにする
が対応可能な対策になることがわかりました。

そのためここより下の古い情報は試しても効果がないのでご注意ください

Unity6.2(6000.2.7f2), MacOS Sequoia 15.6で動作を確認しています

問題

Macでビルドしたアプリケーションを実行した際に
以下のような通知が出てくることがあります

これはmacOSSequoia(15.0以降)で導入されたGameMode機能を使用するということですね
Unityを使ってゲームを作っているのであれば
パフォーマンスが優先されるのでとても助かる機能であるかと思います。

しかし
デスクトップ常駐型のゲームなどを作っている場合にも
パフォーマンスが優先されてしまうと困る場合があるかと思います。

原因

そもそもGameModeの判定をどこで行っているのかということですが
ビルド後のアプリケーションのplistの中に

LSApplicationCategoryType
public.app-category.games

のような記述がありそこで判定していることが予測できます。
xcodeでplistを開くと他のカテゴリなども見ることができますね。

対応策

UnityのPostProcessでビルド後にplistを書き換えて対応します。
メソッドのみを切り出し示します。


/// <summary>
/// plistを編集してCategoryをgamesからutilitiesに変更し、MacOSのGame Mode通知を無効化する
/// </summary>
/// <param name="report"></param>
private void DisableMacOSGameModeNotification(BuildReport report)
{
	if (report.summary.platform != BuildTarget.StandaloneOSX)
	{
		return;
	}

	string pathToBuiltProject = report.summary.outputPath;
	string plistPath = Path.Combine(pathToBuiltProject, "Contents", "Info.plist");

	if (File.Exists(plistPath))
	{
		string plistContent = File.ReadAllText(plistPath);
		bool modified = false;

		// Unity側で書き込まれる
		// public.app-category.games を別のカテゴリに置き換え
		if (plistContent.Contains("public.app-category.games"))
		{
			plistContent = plistContent.Replace(
				"public.app-category.games",
				"public.app-category.utilities"
			);
			modified = true;
			Debug.Log("Info.plist updated: Changed category from games to utilities");
		}
		else if (!plistContent.Contains("LSApplicationCategoryType"))
		{
			// カテゴリが存在しない場合は追加
			int lastDictIndex = plistContent.LastIndexOf("</dict>");
			if (lastDictIndex > 0)
			{
				string insertion = "\t<key>LSApplicationCategoryType</key>\n\t<string>public.app-category.utilities</string>\n";
				plistContent = plistContent.Insert(lastDictIndex, insertion);
				modified = true;
				Debug.Log("Info.plist updated: Added utilities category");
			}
		}
		else
		{
			Debug.Log("LSApplicationCategoryType already set to non-games category");
		}

		if (modified)
		{
			File.WriteAllText(plistPath, plistContent);
			Debug.Log("Info.plist file saved successfully");
		}
	}
	else
	{
		Debug.LogError($"Info.plist not found at: {plistPath}");
	}
}

このコードをIPostprocessBuildWithReportを継承したクラスの
OnPostprocessBuildで呼べば動作します。

今回は便宜上utilitiesにしていますが
Game以外であれば多分GameModeにはならないかと思います。

【Unity6】 Splash Screen Unity Logoが含まれてビルドサイズが増加するのを防ぐ

Unity6000.1.9f1で動作を確認しています

問題

空の2DのURPのプロジェクトをビルドした際に
ログからビルドサイズを確認したところ

2.7mbのSplash Screen Unity Logo
が含まれていることに気がつきました。

PlayerSettingからSplashScreenはOffになっているのにもかかわらず
ビルドに含まれているのはもったいないですね。

対応策

軽く調べたらUnityのフォーラムにも同様な問題が上がっていましたが特に解決されていませんでしたが
手元で以下のような操作を行うとビルドに含まれなくなることが確認できました

1.Show Unity Logoのチェックマークを先に外す
2.そのあとShowSplashScreenのチェックマークを外す

スプラッシュを出したくないという目的では
ShowSplashScreenの方をOffにしてしまう可能性が高いので
修正して欲しいですね〜

【UE5】 DataTableの選択肢をフィルタリングする

以前書いた記事では
データテーブルの要素を取り出す事はできましたが
データテーブルが必要であるときにはフィルタリングできていませんでした。

こちらでフィルタリング機能についての議論がなされており
使用にあたって若干曲があることが伺えます.

UPROPERTY(EditDefaultsOnly,meta=(RowType="/Script/TESTProject.MyDataTable"))
UDataTable* DT_Test;
UPROPERTY(EditDefaultsOnly, Meta=(RequiredAssetDataTags="/Script/TESTProject.MyDataTable"))
TObjectPtr<UDataTable> DT_Test2;

これらは手元のUE5.3.2環境では動作しませんでした。
(コードに誤りがあるかもしれません)
上記のリンク内では動作していたような記述もあるので以前のバージョンでは使用できていたのかもしれません。

対応方法

UPROPERTY(EditDefaultsOnly, meta = (RequiredAssetDataTags = "RowStructure=/Script/TESTProject.MyDataTable"))
UDataTable* DT_Test;

こちらのコードでは動作することが確認できました。

RowStructur=~がかなり冗長になっており
metaの中では文字列結合やマクロを使用する事ができないのでプロパティ毎に書かないといけないため
使い勝手はあまり良くないかもしれません。

RowTypeのほうが使えればきれいに書けるのですが
バグなら早く治ってほしいですね…