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


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

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

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

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

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

前提条件

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

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

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

その場でゆらゆら揺れる

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;
    }
}



右回り、または、左回りに、回転角ランダムで移動する

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);



画面右から左へ移動する

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;
    }
}



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

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

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