FarmRPG　Unity Scene Management Part2 　シーンに読み込み時にフェードインを実装する

# 概要
今回はSceneの読み込み時にフェードインする処理を実装します。
以下実装時の様子です。

![0610.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/fc067887-ab7c-567a-b3f6-b1df15cb68e8.gif)


# 開発環境

IDE:Rider
Unity:2020.3.42(LTS)
OS:Windows10

# UnityEditor上の設定
## UICanvas以下に新規オブジェクト　FadeImageを作成
ImageとCanvasGroupコンポーネントをアタッチします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/76aafa48-abf1-d768-d891-e56dbe33accf.png)


# 実装のポイント
Fadeメソッドにおいて以下の処理を加えます。
・CanvasGroupコンポーネントのプロパティalpha値を操作してフェードインを実装します。
・alpha値が１の時は不透明になり暗幕となるが　alpha値が0のときは透明になりSceneが表示される。
・alpha値が0になるまでCanvasGroupコンポーネントのプロパティblocksRaycastsを有効(true)にし、１になったら無効(false)に設定します。
・徐々に明転するのを表現するために、Mathf.MovoTowardsメソッドを使って徐々にalpha値を減少させます。


# コード部分

## SceneControllerManager

```diff_c_sharp:SceneControllerManager.cs

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.SceneManagement;

public class SceneControllerManager :SingletonMonobehaviour<SceneControllerManager>
{
+    [SerializeField] private float fadeDuration = 1f;
+    [SerializeField] private CanvasGroup faderCanvasGroup;
+    [SerializeField] private Image faderImage;
    public SceneName startingSceneName;
    
    private IEnumerator Start()
    {
+        faderImage.color = new Color(0f, 0f, 0f, 1f);
+        faderCanvasGroup.alpha = 1f;

        yield return StartCoroutine(LoadSceneAndSetActive(startingSceneName.ToString()));

+        StartCoroutine(Fade(0f));
    }

    private IEnumerator Fade(float finalAlpha)
    {
+        faderCanvasGroup.blocksRaycasts = true;
+        float fadeSpeed = Mathf.Abs(faderCanvasGroup.alpha - finalAlpha) / fadeDuration;

+        while (!Mathf.Approximately(faderCanvasGroup.alpha, finalAlpha))
+        {
+            faderCanvasGroup.alpha = Mathf.MoveTowards(faderCanvasGroup.alpha, finalAlpha, fadeSpeed * Time.deltaTime);
            yield return null;    
+        }
+        faderCanvasGroup.blocksRaycasts = false;
    }
    
    
    private IEnumerator LoadSceneAndSetActive(string sceneName)
    {
        yield return SceneManager.LoadSceneAsync(sceneName,LoadSceneMode.Additive);

        Scene newlyLoadedScene = SceneManager.GetSceneAt(SceneManager.sceneCount - 1);
        SceneManager.SetActiveScene(newlyLoadedScene);
    }
    
}
```

# 参考

## C#

## Unity Editor コンポーネント

### Canvas Group

https://docs.unity3d.com/ja/2018.4/Manual/class-CanvasGroup.html


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/977dfe26-d6f7-b485-6f8c-076f8fb0c449.png)


## Unity スクリプト

### Mathf.Abs

https://docs.unity3d.com/jp/2018.4/ScriptReference/Mathf.Abs.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/026f860c-af72-850d-c82e-dc9d981a37dc.png)


### Mathf.Approximately

https://docs.unity3d.com/ja/2019.4/ScriptReference/Mathf.Approximately.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/387b405e-ebeb-89fa-7a58-38018b2cef5b.png)


### Mathf.MoveToWards

https://docs.unity3d.com/ja/2019.4/ScriptReference/Mathf.MoveTowards.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/c1b45c82-0281-5ee6-9833-dc6eb1dcb153.png)



### CanvasGroup alpha blockRaycasts
https://docs.unity3d.com/jp/2018.4/ScriptReference/CanvasGroup.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/833ab420-a15a-e6da-7388-984e98a7bdd4.png)


## その他

Section9 36 Create A Scene Controller Manager

https://www.udemy.com/course/unity-2d-game-developer-course-farming-rpg/learn/lecture/19896566#content

github コミット分（個人確認用　privateなので見れません）

https://github.com/RYA234/LearnFarmRPG/commit/c5d3d9aeb8c9ec645918bb77a47c986d411a7c5f