Unity開発メモ #8
フルスクリーンのポストプロセスをシェーダーグラフでつくる
ポストプロセスとは、レンダリングされたゲーム画面全体に最後にくわえられる特殊エフェクトのようなものです
FPSゲームで「ダメージを受けた際に視界が赤く」なったり、「ダンジョンに入るときに画面がフェードアウト」したり、卑猥なものがうつって突如「画面全体がモザイクになった」り、「いけないおくちゅりをのんだときに画面が揺れ」たりといった例がわかりやすいと思います
今回はUnity 2022.2から標準機能として搭載されたシェーダーグラフによるフルスクリーンエフェクト作成によって、「いけないおくちゅりをのんだときに画面が揺れ」る効果を作ってみました
(これのためにUnityのバージョン上げました、バージョン上げて不具合でなかったのでよかったです)
参考動画
https://www.youtube.com/watch?v=7Cd7kQl6N50
https://www.youtube.com/watch?v=AQGgwgo51lo
https://www.youtube.com/watch?v=Ylq2y6Qez3s
https://www.youtube.com/watch?v=E_oDKQU3e94&t=0s
参考記事
https://docs.unity3d.com/ja/Packages/com.unity.render-pipelines.universal@14.0/manual/Setup.html
https://qiita.com/generosity_honda/items/f091f8edc7d938c7b2fb
https://www.hanachiru-blog.com/entry/2022/12/22/120000
実装時のメモ
Fullscreen ShaderGraphがない
Create -> ShaderGraph -> URP -> Fullscreen ShaderGraphは、Unity 2022.2以降でないとありません
どのUniversal Renderer assetにFull Screen Pass Renderer Featureを追加するの?
Edit -> ProjectSettings -> Quality -> Rendering -> Render Pipeline Assetから使用しているRender Pipeline Assetを探し出し、InspectorからRendering -> Renderer Listに設定されているUniversal Renderer Dataを調べればOK
Asset > Settingに入ってるやつだった
とりあえず画面そのままのレンダリング結果をだしたい
URP Sample Bufferノード(BlitSource)でだせます
↑したんだけど画面が灰色一色のままなんだけど
シェーダーは保存しないと反映されません
シェーダーのオンオフをスクリプトで制御したい
chatGPTで出力されたコードをいじくって下のようなものをこさえました
とりあえず動きますが、もっとスマートな方法があったら教えてください
using UnityEngine;
using UnityEngine.Rendering.Universal;
using System.Collections.Generic;
using UnityEngine.SceneManagement;
using System.Collections;
public class UseDrag : MonoBehaviour
{
public Renderer2DData rendererData; // Renderer 2D Data への参照
(中略)
// 指定したフィーチャーを有効または無効にするメソッド
private void SetFeatureEnabled(string featureName, bool isEnabled)
{
if (rendererData != null)
{
List<ScriptableRendererFeature> features = rendererData.rendererFeatures;
foreach (var feature in features)
{
if (feature.name == featureName) // 指定した名前のフィーチャーを見つけた場合
{
feature.SetActive(isEnabled); // フィーチャーの有効・無効を設定する
return;
}
}
Debug.LogWarning($"Feature '{featureName}' not found in the Renderer 2D Data.");
}
else
{
Debug.LogWarning("Renderer 2D Data reference is not set.");
}
}
(中略)
}
Drag 01 (Full Screen Pass Renderer Feature)のチェックをスクリプトでオンオフする挙動です
その他
遅延処理使いたいけどなぜかInvokeもコルーチンもうまくいかない
根本的な解決にはなっていないがTaskを使う方法もある
使うにはまず System.Threading.Tasks を読み込む必要がある。
await を使用して待機させるには、実行されるメソッドに async が付与されている必要がある。
単純に1秒待たせたいだけならこんな感じ
private async void DelayMethod()
{
await Task.Delay(1000);
Debug.Log("DelayMethod");
}
https://12px.com/blog/2016/11/unity-delay/
キャンバスの子要素のキャンバスを親より上に表示させたい
CanvasコンポーネントをアタッチしてOverride SortingいチェックをいれるとSort順を独立して設定できる
↑をやったら子要素のキャンバスがクリックできなくなった!
Graphic Raycasterコンポーネントをアタッチしないとキャンバスにはレイキャストが設定されないのでアタッチする
UIのトグルとかで別のオブジェクトのActiveを操作したい
Objectをインスペクターで指定してSetActiveを弄れる
画面のクリックをブロックしたい
画面全体最前面にレイキャストを持った透明なオブジェクトをかぶせる
テキストのレイキャストの無効化方法
インスペクターで設定できないのでコードをアタッチして対応
画像ファイル等の置き換え方法
Unityに同じ名前のファイルをドラッグアンドペーストしても新規で連番ファイルが作成されるだけ
正しくはShow in Explorer (win) で Explorerを開いてそこで置き換える
進捗
多言語対応システムはひとまず完成でテスト中
日付・時間遷移のシステム周りもおおむね完成しました
本編部分の前にシステム面をまずあらかた完成させてしまうつもりです
今後技術的に新規学習しなければならない要素としては、Live2Dのスクリプト制御、セリフ送り・選択肢分岐機能、ボイス・SE・BGM制御、セーブ・ロード機能、グローバルな回想・実績管理機能あたりかと思われます
今回はUnityの学習のためにあえて一人で1から完成させる感じなので、なるべくシンプルにプリミティブに、完成優先で進めたいと思います