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

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

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

ちなみに、Blackbaordはプロパティの一覧を登録する板を指します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/e9f126d6-3b2b-92b4-c4cc-c75035ba7cd8.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の順でインストールしました。
<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/ca700043-f7a9-5061-558a-a8daa1f645b3.png" width = 50%>

3. LWRPアセットをSRPとしてUnityへ登録
4. 適当なShaderGraph(ここではUnlit)を作成し、これをダブルクリックして開く

ShaderGraphウィンドウが開きますが、Blackboardが見当たりません。<br>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/834a0e65-f6ec-98c8-f376-82acd107fdf6.png)

以下のようなエラーログも発生しました。<br>
<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/d4817bf7-2e61-c0c8-ee23-6891736ae681.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になっていました。
<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/fa6b2b17-b03b-bc05-706c-dc1fbaf16ef9.png">

### レイアウトを上書きしたら直った
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();

```