山傘のプログラミング勉強日記[Java & Unity]

プログラミングに関する日記とどうでもよい雑記からなるブログです。

Unity4.6/5.0でつくる 2Dゲーム制作入門 [改訂第二版] その1

Unity4.6/5.0でつくる 2Dゲーム制作入門 [改訂第二版]

今日から「Unity4.6/5.0でつくる 2Dゲーム制作入門 [改訂第二版]」をやっていきたいと思います。新書の大型本を買う余裕がないので、Kindle Unlimitedに登録 (2ヶ月 99円) して、この本を選びました。2ヶ月経過する前に解約することを覚えておかないといけませんね。

作者の自作クラスを使ってスクリプトを書いていくようですが、勉強のために自作クラスの部分を自分で補っていきます。それと、他のブロガーさんを参考にして、コードに自分の言葉で書いたコメントをしていきます。僕はコードにコメントを書くのが苦手で、何を書けばいいのかといつも迷ってしまいます。リーダブルコードを読んだつもりではいるんですが・・・。

Chapter1 ミニゲームの作成

Section 8 敵の作成

たこ焼きを進行方向をランダムに決めて、等速直線運動させます。ただし、画面端にたこ焼きがきたら、反転させて画面から飛び出さないようにさせます。

ビューポート座標が何を指しているのか分からなかったので、調べました。

Unityが使う座標を勉強してみた。

元のコードは著者の自作クラスを使ってきれいに書かれていますが、その部分を補うと、コードがスパゲッティに・・・。リファクタリングする必要がありますね。せめて似たようなコードはメソッドにしなければ。

コード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy : MonoBehaviour {

    public GameObject enemy;
    private Rigidbody2D rbody;
    private SpriteRenderer renderer;
    private float wid;
    private float hei;
    // Use this for initialization
    void Start () {
        // ランダムな方向に移動する
        // 方向をランダムに決める 0~359度
        float dir = Random.Range(0, 359);
        // 速さは2
        float spd = 2;
        // x軸, y軸の速さを計算し、Rigidbodyに設定する。
        Vector2 v = new Vector2(Util.CosEx(dir)*spd, Util.SinEx(dir)*spd);
        rbody = GetComponent<Rigidbody2D>();
        rbody.velocity = v;
        renderer = enemy.GetComponent<SpriteRenderer>();
        wid = renderer.bounds.size.x / 2;
        hei = renderer.bounds.size.y / 2;


        
    }
    
    // Update is called once per frame
    void Update () {
        // 画面の端で跳ね返るようにする。

        // ビューポート座標からワールド座標へ変換する。
        // ビューポート座標では、左下が(0, 0)、右上が(1, 1)となる。
        // カメラの左下座標を取得する。
        Vector2 min = Camera.main.ViewportToWorldPoint(Vector2.zero);
        // 自身の大きさを考慮する
        min.x += wid;
        min.y += hei;
        // カメラの右上座標を取得
        Vector2 max = Camera.main.ViewportToWorldPoint(Vector2.one);
        // 自身の大きさを考慮
        max.x -= wid;
        max.y -= hei;

        // オブジェクトの座標を取得
        float X = GameObject.Find("Enemy").transform.position.x;
        float Y = GameObject.Find("Enemy").transform.position.y;
        if (X < min.x || X > max.x) {
            // 画面外に出たので、X移動量を反転する。
            rbody.velocity = new Vector2(rbody.velocity.x * -1, rbody.velocity.y);

            // 画面内に収まるように制限をかける.
            X = Mathf.Clamp(X, min.x, max.x);
            Y = Mathf.Clamp(Y, min.y, max.y);
            Vector2 pos = transform.position;
            pos.x = X;
            pos.y = Y;

            gameObject.GetComponent<Transform>().position = pos;
        }
        if(Y < min.y || Y > max.y) {
            // 画面外に出たので、Y移動量を反転する。
            rbody.velocity = new Vector2(rbody.velocity.x, rbody.velocity.y * -1);

            // 画面内に収まるように制限をかける.
            X = Mathf.Clamp(X, min.x, max.x);
            Y = Mathf.Clamp(Y, min.y, max.y);

            Vector2 pos = transform.position;
            pos.x = X;
            pos.y = Y;

            gameObject.GetComponent<Transform>().position = pos;
        }

    }
}

成果物

youtu.be

利用したもの

おめが試作設計局 / Omega Experimental Design Bureau

Unity4.6/5.0でつくる 2Dゲーム制作入門 [改訂第二版]

Unity4.6/5.0でつくる 2Dゲーム制作入門 [改訂第二版]