あけましておめでとうございます
年始スタートダッシュ記事です
決して年末に間に合わなかったわけではありません
計画通り です
概要
Unityに関わる人なら誰もが恐れおののくピンク悪魔
RGB値が(255,0,255)なので正確にはマゼンタですがみんなピンクというのでピンクと呼びましょう
ユーザー環境でピンクが出てSNS等で問題になることも多いでしょう
そしてミホノブルボンの勝負服を見るたびにドキッとする人も多いでしょう
これを変更できたら便利じゃないです?
開発環境でわかりやすくしたり、本番ではわかりにくくしたり
URPをイジることで色を変えてみましょう
確認環境
Unity : 2020.3.17f1
URP : 10.6.0
Universal Rendering Pipeline(URP)ってなに?
Unity2019からRendering Piplelineが大きく変更になり
開発者で変更することができるようになりました
Scriptable Rendering Pipeline(SRP)の一般端末向け実装になってます
SRPについては前回の記事を参照ください
URPプロジェクト作成してCustomに変更
URPを選択して新規プロジェクトを作成
これからURPをいじりたいところですが
Package Manager管理下だと自動でロールバックされるので
Packages以下にコピーしてカスタマイズできるようにします
cp -r Library/PackageCache/'com.unity.render-pipelines.core@10.6.0'/ Packages/
cp -r Library/PackageCache/'com.unity.render-pipelines.universal@10.6.0'/ Packages/
URPカスタムテスト
Packages > Universal RP > Runtime > UniversalRenderPipeline.cs
Renderというわかりやすい関数があります
試しに速攻でreturnしてみましょう
protected override void Render(ScriptableRenderContext renderContext, Camera[] cameras)
{
return;
}

なにも映らなくなりました✌
レンダリングで何もせずに終了しているので何も映りません
意図通りの挙動なので元に戻して次に行きます
サンプルシーン
シンプルに用意しました
URPでは既存のStandard Shaderが非対応なのでシェーダーエラーになります
これを利用しましょう

みんなのトラウマ
この色を変えていきます
ErrorShaderを作る
Create > Shader > Unlit Shader
やはり目立たないといけないので虹色にしましょう
Unlit/ErrorShader
fixed4 frag (v2f i) : SV_Target
{
fixed3 center = fixed3(_ScreenParams.x/2,_ScreenParams.y/2,0);
float dist = abs(distance(center, i.vertex) * 2 - _Time.y * 300);
float temp = dist % 365;
float red = temp < 45 ? 1 :
temp < 135 ? lerp(1, 0, (temp-45)/90) :
temp < 225 ? 0 :
temp < 320 ? lerp(0, 1, (temp-225)/90) : 1;
temp = (dist + 121.66) % 365;
float green = temp < 45 ? 1 :
temp < 135 ? lerp(1, 0, (temp-45)/90) :
temp < 225 ? 0 :
temp < 320 ? lerp(0, 1, (temp-225)/90) : 1;
temp = (dist + 243.32) % 365;
float blue = temp < 45 ? 1 :
temp < 135 ? lerp(1, 0, (temp-45)/90) :
temp < 225 ? 0 :
temp < 320 ? lerp(0, 1, (temp-225)/90) : 1;
return fixed4(red, green, blue, 1);
}
めっちゃ雰囲気でレインボーシェーダーを作りました
ErrorShaderを変更
URP Packageを「errorMaterial」でgrepかけるとRenderUtil.csがヒットします
Package > Universal RP > Runtime > RenderingUtils.cs
コードを見るととてもそれっぽい部分があります
ここのシェーダーを用意したシェーダーに差し換えてみましょう
static Material errorMaterial
{
get
{
if (s_ErrorMaterial == null)
{
// TODO: When importing project, AssetPreviewUpdater::CreatePreviewForAsset will be called multiple times.
// This might be in a point that some resources required for the pipeline are not finished importing yet.
// Proper fix is to add a fence on asset import.
try
{
// シェーダーでエラーを起こしたら↓↓のマテリアルを使う
s_ErrorMaterial = new Material(Shader.Find("Unlit/ErrorShader"));
//s_ErrorMaterial = new Material(Shader.Find("Hidden/Universal Render Pipeline/FallbackError"));
}
catch { }
}
return s_ErrorMaterial;
}
}
UnityEditorに戻ると自動でリビルドされ反映されます

目がーーーーーーー!!!!
最高に気持ち悪いビジュアルになりました✌
これでピンク悪魔とさよならグッバイです
参考