[Unity][Timeline] TimelineEditor.masterDirectorとTimelineEditor.inspectedDirectorの違い

## TimelineEditorクラスの歴史

### Unity2017.1
Unity Timeline機能が公開されたバージョン
この時点ではそもそも`UnityEditor.Timeline`名前空間下のクラスが一切公開されていない
※`UnityEditor.Timeline.TimelineEditor`は存在していない

### Unity2017.2
`UnityEditor.Timeline`名前空間下のpublicなクラスが解禁
**それが[`UnityEditor.Timeline.TimelineEditor`](https://docs.unity3d.com/2017.2/Documentation/ScriptReference/Timeline.TimelineEditor.html)**
しかし、`TimelineWindow`が現在編集している`PlayableDirector`と`TimelineAsset`の参照を取ってこれるだけというとても簡素な状態

### Unity2018.2
今まで使っていた唯一の公開情報である`TimelineEditor.playableDirector`と`TimelineEditor.timelineAsset`が突如`Obsolete`扱いになる(ScriptReferenceからも抹消)
代わりに`TimelineEditor.masterDirector`, `TimelineEditor.inspectedDirector`, `TimelineEditor.masterAsset`, `TimelineEditor.inspectedAsset`の４つのプロパティが公開される

## `masterDirector`と`inspectedDirector`ってなに？
[`TimelineEditor`のScriptReferenceページ](https://docs.unity3d.com/2018.2/Documentation/ScriptReference/Timeline.TimelineEditor.html)の説明は以下の通り

### `TimelineEditor.masterDirector`
The PlayableDirector responsible for the playback of the timeline currently being shown in the Timeline window.
(現在タイムラインウィンドウに表示されているタイムラインの再生を担当するPlayableDirector)

### `TimelineEditor.inspectedDirector`
The PlayableDirector associated with the timeline currently being shown in the Timeline window.
(現在タイムラインウィンドウに表示されているタイムラインに関連付けられたPlayableDirector)

[リリースノート](https://unity3d.com/jp/unity/whats-new/unity-2018.2.0)のAPI Changesの項目を見ても2つプロパティに変わったよとしか書いていません

## 直感的にイメージしにくいので実際に確認してみよう
下記のようなサンプルのシーンを作ります
![入れ子にしたPlayableDirectorを用意する](https://qiita-image-store.s3.amazonaws.com/0/146374/710f7ff0-ad86-8cab-8df2-67e295b0f891.png)
次にDirector,Child,GrandChildオブジェクトにそれぞれ`PlayableDirector`を付け、Hierarchy上の親子関係に揃えて各種`PlayableDirector`を`ControlTrack`で制御するようにします
#### 1.Directorオブジェクト(MasterTimeline)
![Directorオブジェクト(MasterTimeline)](https://qiita-image-store.s3.amazonaws.com/0/146374/358dcddb-58c4-588a-8599-9d4f953800d2.png)
#### 2.Childオブジェクト(ChildTimeline)
![Childオブジェクト(ChildTimeline)](https://qiita-image-store.s3.amazonaws.com/0/146374/e0bc7b37-60cc-dda9-f3ee-ff1418532a22.png)
#### 3.GrandChildオブジェクト(GrandChildTimeline)
![GrandChildオブジェクト(GrandChildTimeline)](https://qiita-image-store.s3.amazonaws.com/0/146374/f8699ed8-6fb8-cb90-4e57-5c5a1886b7ea.png)
そして各種プロパティを確認するための`EditorWindow`を用意してそれぞれのオブジェクトを選択したときの変化を確認します

```csharp
using UnityEditor;
using UnityEditor.Timeline;
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;

public class TestTimelineWindow : EditorWindow
{
    [MenuItem("Test/TestTimelineWindow")]
    static void Open()
    {
        GetWindow<TestTimelineWindow>();
    }

    void OnGUI()
    {
        EditorGUILayout.ObjectField("masterDirector", TimelineEditor.masterDirector, typeof(PlayableDirector), false);
        EditorGUILayout.ObjectField("masterAsset", TimelineEditor.masterAsset, typeof(TimelineAsset), false);
        GUILayout.Space(4); // Spaceは見やすくするために使用しているだけなので深い意味はない
        EditorGUILayout.ObjectField("inspectedDirector", TimelineEditor.inspectedDirector, typeof(PlayableDirector), false);
        EditorGUILayout.ObjectField("inspectedAsset", TimelineEditor.inspectedAsset, typeof(TimelineAsset), false);
        GUILayout.Space(4);
        EditorGUILayout.ObjectField("playableDirector", TimelineEditor.playableDirector, typeof(PlayableDirector), false);
        EditorGUILayout.ObjectField("timelineAsset", TimelineEditor.timelineAsset, typeof(TimelineAsset), false);
    }
}
```

#### 1.Directorオブジェクト(MasterTimeline)を選択したとき
![スクリーンショット 2018-10-10 2.23.04.png](https://qiita-image-store.s3.amazonaws.com/0/146374/f4be68d0-c11a-0548-0ef0-ade8b2e525b0.png)
#### 2.Directorオブジェクト(MasterTimeline)を選択した状態で`ControlTrack`の`Child`オブジェクトが設定されている`TimelineClip`をダブルクリックしたとき
![スクリーンショット 2018-10-10 2.23.11.png](https://qiita-image-store.s3.amazonaws.com/0/146374/2b939b40-b0d8-db57-c983-3b7865b063bf.png)
#### 3.上記の状態で更に`ControlTrack`の`GrandChild`オブジェクトが選択されている`TimelineClip`をダブルクリックしたとき
![スクリーンショット 2018-10-10 2.23.15.png](https://qiita-image-store.s3.amazonaws.com/0/146374/551cfc94-5d65-2925-f767-e7481e2f7831.png)

## 結論
この挙動を見る限り、`inspectedDirector`/`inspectedAsset`プロパティには**従来の`playableDirector`/`timelineAsset`プロパティと同様の結果**が入り、`masterDirector`/`masterAsset`には**`ControlTrack`を使って`PlayableDirector`を入れ子に扱った際に親玉のものが表示**されるという仕様のようです

注意しなければならないのは`TimelineWindow`内で入れ子の`PlayableDirector`の表示を切り替えた場合にのみ上記のような違いが出るだけで、`PlayableDirector`が付いているオブジェクトを直接選択した場合は3種全て同じ結果を返し、Projectビューから直接`TimelineAsset`のデータを選択した場合は`PlayableDirector`系の参照がNoneになって`TimelineAsset`系の参照だけが3種同じという結果になります

もしEditor拡張などで`TimelineWindow`に表示されている`PlayableDirector`/`TimelineAsset`に対して何かしら操作をするようなことがあれば、`inspectedDirector`/`inspectedAsset`のプロパティのほうを扱ったほうが見た目と揃うので良いのではないでしょうか

イメージしにくい方向けに動画も用意したので[こちら](https://youtu.be/bDgjtx8deT4)を見てもらえればイメージしやすいと思います