はじめに
Unity2019でShaderGraphを開いたらBlackboardが表示されない問題に遭遇しました。
本記事では、Blackbaordが表示されない問題を解決するまでの道のりをメモ書き程度に書き残したいと思います。
ちなみに、Blackbaordはプロパティの一覧を登録する板を指します。
環境
Unity2019.1.0a14
ShaderGraph Version 5.2.3
LWRP Version 5.2.3
バグの再現手順
- Unity2019.1.0a14でTemplateを3Dにしてプロジェクトを新規作成
PackageManagerからLWRPとShaderGraphをインストールします。(バージョンは両方とも5.2.3)
順番としてはLWRP -> ShaderGraphの順でインストールしました。
LWRPアセットをSRPとしてUnityへ登録
適当なShaderGraph(ここではUnlit)を作成し、これをダブルクリックして開く
ShaderGraphウィンドウが開きますが、Blackboardが見当たりません。
解決方法1 : %APPDATA%以下の設定ファイルを削除
%APPDATA%にあるUnity設定ファイルを削除することで直るようです。
https://forum.unity.com/threads/shader-graph-properties-panel-missing.529581/
解決方法2 : コードを改造する(非推奨)
エラーがなぜ発生しているのか、そしてShaderGraphの内部コードがどうなっているのかも興味があったので、Packageの中のソースコードを追ってエラーの原因個所を探ってみました。
エラーの発生個所 : GraphEditorView.cs
今回のエラーはシェーダーグラフのpackageに同梱されているGraphEditorView.csにてBlackboardのレイアウトがNaNになったことによって発生していた不具合でした。
void UpdateSerializedWindowLayout()
{
if (m_FloatingWindowsLayout == null)
m_FloatingWindowsLayout = new FloatingWindowsLayout();
m_FloatingWindowsLayout.previewLayout.CalculateDockingCornerAndOffset(m_MasterPreviewView.layout, m_GraphView.layout);
m_FloatingWindowsLayout.previewLayout.ClampToParentWindow();
m_FloatingWindowsLayout.blackboardLayout.CalculateDockingCornerAndOffset(m_BlackboardProvider.blackboard.layout, m_GraphView.layout);
m_FloatingWindowsLayout.blackboardLayout.ClampToParentWindow();
if (m_MasterPreviewView.expanded)
{
m_FloatingWindowsLayout.masterPreviewSize = m_MasterPreviewView.previewTextureView.layout.size;
}
blackboard.layoutを確認してみる
コードに手を加えてblackboard.layoutの値をログ出力させてみます。
... m_FloatingWindowsLayout.previewLayout.CalculateDockingCornerAndOffset(m_MasterPreviewView.layout, m_GraphView.layout);
m_FloatingWindowsLayout.previewLayout.ClampToParentWindow();
UnityEngine.Debug.Log("m_BlackboardProvider.blackboard.layout : " + m_BlackboardProvider.blackboard.layout); // 追加したコード
...
レイアウトを上書きしたら直った
Blackboardのレイアウトを上書きする処理を入れてみたところ、Blackboardが表示されるようになりました。
これにて一件落着です。
void UpdateSerializedWindowLayout()
{
if (m_FloatingWindowsLayout == null)
m_FloatingWindowsLayout = new FloatingWindowsLayout();
m_FloatingWindowsLayout.previewLayout.CalculateDockingCornerAndOffset(m_MasterPreviewView.layout, m_GraphView.layout);
m_FloatingWindowsLayout.previewLayout.ClampToParentWindow();
// NaNの場合はレイアウトを強制上書き
if (float.IsNaN(m_BlackboardProvider.blackboard.layout.width))
m_BlackboardProvider.blackboard.SetPosition(new Rect(10f, 10f, 200f, 300f));
m_FloatingWindowsLayout.blackboardLayout.CalculateDockingCornerAndOffset(m_BlackboardProvider.blackboard.layout, m_GraphView.layout);
m_FloatingWindowsLayout.blackboardLayout.ClampToParentWindow();