ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

画面内をキャラが動く

キャラクターが一定の速度で移動し、画面端で跳ね返るというのを実装。
実際に実装したコードは次の通り。サンプルのuni_0というスプライトなのでクラス名はuniとなっている。

public class uni : MonoBehaviour {

    public float speed;

    void Start () {
        float x = Random.Range(-1.0f, 1.0f);
        float y = Random.Range(-1.0f, 1.0f);
        Vector2 velocity = new Vector2(x,y);
        velocity.Normalize();
        velocity *= speed;
        GetComponent<Rigidbody2D>().velocity = velocity;
    }

    void Update () {
        Vector2 min = Camera.main.ViewportToWorldPoint(Vector2.zero);
        Vector2 max = Camera.main.ViewportToWorldPoint(Vector2.one);
        Vector2 position = transform.position;
        Vector2 velocity = GetComponent<Rigidbody2D>().velocity;
        float width = GetComponent<SpriteRenderer>().bounds.size.x;
        float height = GetComponent<SpriteRenderer>().bounds.size.y;

        if (position.x - width / 2.0f < min.x)
        {
            position.x = min.x + width / 2.0f;
            velocity.x *= -1.0f;
        }
        if( position.x + width / 2.0f > max.x)
        {
            position.x = max.x - width / 2.0f;
            velocity.x *= -1.0f;
        }
        if (position.y - height / 2.0f < min.y)
        {
            position.y = min.y + height / 2.0f;
            velocity.y *= -1.0f;
        }
        if (position.y + height / 2.0f > max.y)
        {
            position.y = max.y - height / 2.0f;
            velocity.y *= -1.0f;
        }
        transform.position = position;
        GetComponent<Rigidbody2D>().velocity = velocity;
    }
}

speedが移動速度。値はInspectorで設定している。
最初コードを書いた時は画面端に来たら速度を反転するだけにしていたが、その場合だと移動速度が速いときに端を抜けてしまったり、端のあたりで数回反転するような挙動が発生してしまったので、座標も画面端にするようにしている。


参考にしたサイト
【Unity2D】Unityで2Dミニゲームを作るチュートリアル(第2回) - Qiita
phina.js tips - 要素を画面からはみ出ないように制御しよう | phiary