FarmRPG　Unity PlayerBasics Part4　1/2 アニメーション作成 C#のeventを使ってObserverパターンを作成

# 概要
アニメーション機能を実装する下準備として、Observeパターンを作成します。
C#のevent修飾子を用います。（UnityActionではないです。）
以下実装後の様子です。



![sgdetdgffgdsdsfg.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/1132c34f-4460-3193-10a4-6f21781d2090.gif)




# 開発環境

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

# UnityEditor上の設定
PlayerオブジェクトにPlayerAnimationTestをアタッチします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/5ccc4d30-5968-ed6e-c2a5-9ba848029d3f.png)



Playerオブジェクトの子オブジェクト達（body hat）にMovement Animation Parameter Controlをアタッチします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/86b324ce-28f0-5759-8f8a-7f9d6f9865b2.png)




# 実装のポイント

SubJect(Observale)：PlayerAnimationTest　Obeserver：
Movement Animation Parameter Control
としてオブサーバーパターンを作成します。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/3941c55b-07ce-deeb-281a-da798459208a.png)


Idle UpをOFF→ONに切り替えたときの処理




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/1c515e64-e372-0c27-43d9-06ba6ee4646a.png)



# コード部分

## PlayerAnimationTest　Playerオブジェクトにアタッチ

```diff_c_sharp:PlayerAnimationTest.cs
using UnityEngine;
using UnityEngine.EventSystems;

public class PlayerAnimationTest : MonoBehaviour
{
    public bool idleUp;
    public bool idleDown;
    public bool idleLeft;
    public bool idleRight;

    private void Update()
    {
        EventHandler.CallMovementEvent(idleUp, idleDown, idleLeft, idleRight);
    }
    
}


```

## EventHandler staticなのでアタッチせず

```diff_c_sharp:EventHandler.cs
public delegate void MovementDelegate(bool idleUp, bool idleDown, bool idleLeft, bool idleRight);

public static class EventHandler
{
    // Movement Event

    public static event MovementDelegate MovementEvent;

    // Movement Event Call For Publishers

    public static void CallMovementEvent(bool idleUp, bool idleDown, bool idleLeft, bool idleRight)
    {
       // if (MovementEvent != null)
            MovementEvent(idleUp, idleDown, idleLeft, idleRight);
    }
}

```

## MovementAnimationParameterControl Playerの子オブエジェクトにアタッチ

```diff_c_sharp:MovementAnimationParameterControl.cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MovementAnimationParameterControl : MonoBehaviour
{
    private String Name;
    private void AnimationEventPlayFootstepSound()
    {
        
    }

    private void OnEnable()
    {
        
        Name = gameObject.name;
        EventHandler.MovementEvent += SetAnimationParameters;
    }

    private void OnDisable()
    {
        EventHandler.MovementEvent -= SetAnimationParameters;
    }
    private void SetAnimationParameters(bool idleUp, bool idleDown, bool idleLeft, bool idleRight)
    {
        if (idleUp)
            Debug.Log(Name+":idleUP");
        if (idleDown)
            Debug.Log(Name+":idleDown");
        if (idleLeft)
            Debug.Log(Name+":idleLeft");
        if (idleRight)
            Debug.Log(Name+":idleRight");
    }
}


```








# 参考

## C#

### delegate
eventに引数を加えるために使用している

https://learn.microsoft.com/ja-jp/dotnet/csharp/programming-guide/delegates/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/3d3ac6c0-6f2d-524f-3d79-90a43207c839.png)


### event

https://learn.microsoft.com/ja-jp/dotnet/csharp/programming-guide/events/

サブスクライブ方法
https://learn.microsoft.com/ja-jp/dotnet/csharp/programming-guide/events/how-to-subscribe-to-and-unsubscribe-from-events

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/e407a68b-085e-52cf-1ba2-9e80d98af878.png)


## Unity Editot コンポーネント

## Unity スクリプト

### gameObject.name

https://docs.unity3d.com/ja/2020.3/ScriptReference/GameObject.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/19c97a3f-6437-3e64-5eb0-806174c529d6.png)


## その他

### Observerパターン


http://www.code-magagine.com/?p=14149

Udemy

https://www.udemy.com/course/unity-2d-game-developer-course-farming-rpg/


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

https://github.com/RYA234/LearnFarmRPG/commit/0a5f75217c273e2804997887c9a580b6296ed7c0#diff-cb764eda282510d0ec81ec36bc180317f77a317ba9525d06cb9f58fee90a1bbc