LoginSignup
3
0

More than 5 years have passed since last update.

【Unity2019】ShaderGraphのBlackboardが表示されないバグを直してみた

Last updated at Posted at 2019-01-26

はじめに

Unity2019でShaderGraphを開いたらBlackboardが表示されない問題に遭遇しました。

本記事では、Blackbaordが表示されない問題を解決するまでの道のりをメモ書き程度に書き残したいと思います。

ちなみに、Blackbaordはプロパティの一覧を登録する板を指します。
image.png

環境

Unity2019.1.0a14
ShaderGraph Version 5.2.3
LWRP Version 5.2.3

バグの再現手順

  1. Unity2019.1.0a14でTemplateを3Dにしてプロジェクトを新規作成
  2. PackageManagerからLWRPとShaderGraphをインストールします。(バージョンは両方とも5.2.3)
    順番としてはLWRP -> ShaderGraphの順でインストールしました。

  3. LWRPアセットをSRPとしてUnityへ登録

  4. 適当なShaderGraph(ここではUnlit)を作成し、これをダブルクリックして開く

ShaderGraphウィンドウが開きますが、Blackboardが見当たりません。

image.png

以下のようなエラーログも発生しました。

解決方法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になったことによって発生していた不具合でした。

GraphEditorView.cs
        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の値をログ出力させてみます。

GraphEditorView.cs
...        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); // 追加したコード
...

レイアウトの各種要素がなぜかNaNになっていました。

レイアウトを上書きしたら直った

Blackboardのレイアウトを上書きする処理を入れてみたところ、Blackboardが表示されるようになりました。
これにて一件落着です。

GraphEditorView.cs
        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();

3
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0