Unity 2D 初心者 キャラクターを動かすために使用したパターン

# Unity2D初心者が実装した2Dキャラクター(Player以外)の移動パターン

GWの休みを利用してUnity 2Dでゲームを制作してみました。
そこで使用したキャラクターの動作パターンとコードを紹介いたします。

##今回作ったゲームに関して

子供向けのアプリで、2Dのイラストが現れて動き、タッチをしたら鳴いて振り向くというシンプルなゲームです。
今回紹介するのは、現れてからタッチされるまでの移動モーションについてです。
RPGなどで使用できるか正直わかりません。

使用できるゲームは
・同じように画面に出てくるキャラクターをタッチする
・2Dスクロールゲーム
など、でしょうか。

##前提条件
実装したキャラクターのモーションは３パターンです。
・その場で ゆらゆら ゆれる(swing)
・右回り、または、左回りに、回転角ランダムで移動する(move)
・画面右から左へ移動する(walk)

カッコ内の文字は、それぞれコード内の分岐に使用している文字列(コード内の定義)です。


##実際のモーションとコード

###その場でゆらゆら揺れる
```c#:CharacterBehavior.cs
//パラメータ rotationSpeed で 回転させた後、rotationSpeedを全体の向きに応じで増減させる。
//なるべく自然な動きにさせるため中央に向かって加速(または減速)させるイメージ
if(moveType == "swing") { 
    transform.Rotate(0, 0, this.rotationSpeed * Time.deltaTime);
    //現在の向きによって速度の加速、原則を決定する
    if (transform.rotation.z >= 0){
        rotationSpeed = rotationSpeed - rotationAcceleration * Time.deltaTime;
    }
    else {
        rotationSpeed = rotationSpeed + rotationAcceleration * Time.deltaTime;
    }
}
```
<img width="333" alt="スクリーンショット 2020-05-06 16.34.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517693/55f21ba6-360d-cf8c-d5e7-5feb1e1c4140.png">
<img width="364" alt="スクリーンショット 2020-05-06 16.34.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517693/c7df5a2a-b0f5-4c27-4125-94be2f7ca5e0.png">
<img width="393" alt="スクリーンショット 2020-05-06 16.34.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517693/02324b01-d4a4-b37b-151e-5d3fc91dec41.png">

###右回り、または、左回りに、回転角ランダムで移動する
```c#:CharacterBehavior.cs
//prefab化したキャラクターを生成するタイミングで右回りか、左回りを決定したうえで
//向きを回転させた後、キャラクターの向きに一定速度分進める。
//Vector3.up と速度の積をとることで向いている方向へ進む(キャラクターはlocal軸に対して上を向いている前提)
}else if(moveType == "move")
    {
    //update1回分でどれだけ回転するかランダムに決定する
    if(rotationInclination == "left") { 
        deltaDegree = Random.Range(0.0f, 1.0f) * rotationAcceleration * Time.deltaTime;
    }
    else
    {
        deltaDegree = Random.Range(-1.0f, 0.0f) * rotationAcceleration * Time.deltaTime;
    }
    //ランダムに決定した分(360度表記)回転させた後、向いた方向へ進める。
    transform.Rotate(0, 0, deltaDegree);
    transform.Translate(Vector3.up * Time.deltaTime * rotationSpeed);
```
![スクリーンショット 2020-05-06 16.32.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517693/f1578770-02a9-ef91-83e9-1a00890cf0a2.png)
![スクリーンショット 2020-05-06 16.32.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517693/4fb546d5-83af-15d0-1e2d-0f8500654f8d.png)
![スクリーンショット 2020-05-06 16.32.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517693/7ff4f5cd-aa29-1bc6-8383-1963af7bfce9.png)

###画面右から左へ移動する
```c#:CharacterBehavior.cs
//Vector3.right に積をとることで、横報告へ移動します。
//また、歩いているように見せたいので、deltaTimeの和を取得し、1秒を超えたらイメージのSpriteを差し替える、かつ、
//わかりにくいですが足音を鳴らしています(apearClipは足音です)。
}else if(moveType == "walk")
{
    transform.Translate(Vector3.right * (-1) * Time.deltaTime * rotationSpeed);
    walkTime += Time.deltaTime;
    if(walkTime > 1.0f)
    {
        if(image.sprite == walkImage1)
        {
            image.sprite = walkImage2;
        }
        else
        {
            image.sprite = walkImage1;
        }
        audioSource.PlayOneShot(apearClip);
        walkTime = 0.0f;
    }
}
```
![スクリーンショット 2020-05-06 16.49.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517693/e90d871c-f564-5dce-e8c9-27dae9c7e5b4.png)
![スクリーンショット 2020-05-06 16.49.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517693/aaae04b9-e397-c61d-0f86-214648e000e4.png)
![スクリーンショット 2020-05-06 16.49.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517693/8ed8bc92-08c3-1285-058d-4de56d455215.png)

以上です。非常に簡単なコードですが、スプリプトで様々なパターンが実装できるようだったので、
感動して記事としました。

また気になることがあれば記事としたいですがUnityは他の方もたくさん書かれてますので、
果たして需要があるのかどうか・・・

ここまでです。
ご覧いただきありがとうございました。