moao blog

生活記録

弾幕STG作成試み 1

いつか挑戦したいと思っていた弾幕STG作成。 今やらないでいつやるよ。

というわけで作成進めてみることに。今後の展開性を考えて3Dで作成し2Dに見せるようにしたいため、 以下2Dゲーム作成内容を3D適用できるか試してみることにしました。

参考元 https://nn-hokuson.hatenablog.com/entry/2016/07/04/213231

設定

プレイヤーオブジェクトはz=0に配置。 カメラを-10に配置して、2Dに見せるための設定です。

背景

以前以下で作成した星空を使用して、 ドーナツ型のパーティクルシステムにして、横軸を太目(z=12くらい)にすれば星空背景にできます。 あとはx軸方向に回せば、動く背景のできあがり。

少々重いかもですが。

moao.hatenablog.com

また、普段のデバッグ時は以下表示を無効にして軽くすることが可能です。

画面サイズ変え

カメラ設定のサイズを5->7に変更

十字カーソル移動、移動制限

プレイヤーに対し以下のようにwasdと十字キーで動かせるようにします。

    void Update()
    {
        float speed = 10.0f;
        if (Input.GetKeyDown(KeyCode.Space) | Input.GetMouseButtonDown(0))
        {
            Instantiate(bulletPrefab, transform.position, Quaternion.identity);
        }
        // Wキー(前方移動)
        if (Input.GetKey(KeyCode.W)| Input.GetKey(KeyCode.UpArrow))
        {
            transform.position += speed * transform.up * Time.deltaTime;
        }

        // Sキー(後方移動)
        if (Input.GetKey(KeyCode.S)| Input.GetKey(KeyCode.DownArrow))
        {
            transform.position -= speed * transform.up * Time.deltaTime;
        }

        // Dキー(右移動)
        if (Input.GetKey(KeyCode.D)| Input.GetKey(KeyCode.RightArrow))
        {
            transform.position += speed * transform.right * Time.deltaTime;
        }

        // Aキー(左移動)
        if (Input.GetKey(KeyCode.A)| Input.GetKey(KeyCode.LeftArrow))
        {
            transform.position -= speed * transform.right * Time.deltaTime;
        }

        Vector3 currentPos = transform.position;
        currentPos.x = Mathf.Clamp(currentPos.x, -xLimit, xLimit);
        currentPos.y = Mathf.Clamp(currentPos.y, -yLimit, yLimit);
        transform.position = currentPos;
    }

当たり判定

2Dの当たり判定と3Dでは異なる用で、以下のようにOnTriggerEnter内で定義しないとだめでした。

   void OnTriggerEnter(Collider collision)
    {
        //Destroy(this.gameObject);
        if (collision.gameObject.tag == "Rock")

        {
    // 衝突時の処理
        }
    }

スマホ連携操作

キー入力だとスマホで遊べないため、マウスカーソルでも動かせるようにしてみます。

ラジオボタン、トグルで有効無効にできるようにしておきます。 以下のようにトグルで関数コールされるようにしている感じです。

    public void change_mode()
    {
        mouse_mode = mouse_mode ^ 1;
    }
        // 物理更新時に処理

        void FixedUpdate()
    {
        // 移動量
        Vector3 moveVec;

        // プレイヤー移動
        if(mouse_mode==1){
            // マウス座標取得
            Vector3 pos = Input.mousePosition;
            // マウス座標をスクリーン座標に変換
            pos.z = -Camera.main.transform.position.z;
            // スクリーン座標をワールド座標に変換
            Vector3 worldPos = Camera.main.ScreenToWorldPoint(pos);
            // 現在位置からマウスワールド位置までの移動量
            moveVec = (worldPos - transform.position) / 30;
            // 徐々にマウス座標に近づくよう、移動量を分割して加算
            transform.position += moveVec;
        }
    }

色付け

青は味方、赤は敵でマテリアル分け

出力

unityroom.com

あとがき

というわけでざっくり作成したので記事にしてみました。 次はもっと弾幕STGらしいものを作りたいと思います。