【Unity講座】STG 制作講座 - 弾幕制作#1 -

初めに

Unityを使って弾幕STGを作るための講座です。

講座といってもまだまだUnity初心者ですので、初心者のアウトプットの場だとお考え下さい。

この記事は以下の動画でも説明しています。 そちらも合わせて確認して下さい。

www.youtube.com

環境

Unity 2020.3.34f1 VisualStudio2019 Cominity

Unityを起動します

UnityHubが起動するので、「新規作成」から以下のプロジェクトを作成します。

テンプレート:3D

プロジェクト名:STG_Game

Unityが立ち上がるとこんな感じです

弾の画像を取り取り込みます

今回使う画像はこちらです

imageフォルダを作成して、その中に画像をドラッグ&ドロップします

取り込んだ後に画像を選択して、画面右側のinspectorから画像の設定を変更します。

TextureTypeを[Default]→[Sprite(2D andUI)]に変更して、Applyを押します。

弾をシーンに配置します

Sceneビューになっていることを確認して、画像をシーン内にドラッグ&ドロップします。

Sceneに画像がbulletとして取り込まれました。

右側のInspectorからPositionをXYZを0,0,0に設定します。

  1. 弾を動かすスクリプトを書く

Scriptフォルダを作成して、その中に新規C# Scriptでスクリプトを作成し、名前をBulletにします。

Bulletをbullet_image_01にドラッグ&ドロップします。

下図のとおり、インスペクターからBullet(Script)がついていればOKです

Bulletスクリプトをダブルクリックして、VisualStuidoを立ち上げ、以下をコピペしてください

プログラム①

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

public class Bullet : MonoBehaviour
{
    [SerializeField] float angle; // 角度
    [SerializeField] float speed; // 速度
    Vector3 velocity; // 移動量

    void Start()
    {
        // X方向の移動量を設定する
        velocity.x = speed * Mathf.Cos(angle * Mathf.Deg2Rad);

        // Y方向の移動量を設定する
        velocity.y = speed * Mathf.Sin(angle * Mathf.Deg2Rad);
        
        // 5秒後に削除
        Destroy(gameObject, 5.0f);
    }
    void Update()
    {
        // 毎フレーム、弾を移動させる
        transform.position += velocity * Time.deltaTime;
    }

}
    [SerializeField] float angle; // 角度
    [SerializeField] float speed; // 速度
    Vector3 velocity; // 移動量

角度と速度をfloatで定義しています。 SerializeFieldを設定することで、インスペクターから角度と速度を設定出来るようになります。 velocityは進む方向を内部で保持しておくための変数です。

    void Start()
    {
        // X方向の移動量を設定する
        velocity.x = speed * Mathf.Cos(angle * Mathf.Deg2Rad);

        // Y方向の移動量を設定する
        velocity.y = speed * Mathf.Sin(angle * Mathf.Deg2Rad);
        
        // 5秒後に削除
        Destroy(gameObject, 5.0f);
    }

StartはこのGameObjectが生成された時に一度だけ呼び出されます。 角度と速度をもとに、ここで弾が進む方向を設定します。

ここの部分はいろいろ書いていますが、ややこしいのでコピペで良いと思います。 詳しく知りたい方は「弾幕 三角関数」で検索してください。

DeleteObjectは弾を一定時間後に削除する機能になります。 ここでは5秒後に削除するようにしています。

    void Update()
    {
        // 毎フレーム、弾を移動させる
        transform.position += velocity * Time.deltaTime;
    }

Updateです。 ここは毎フレーム呼ばれる処理になっています。 弾の座標にヴェロシティを加算することで弾の移動を実現しています。

Time.deltaTimeとありますが、これは直前のフレームと今のフレームの差の値になります。 今後も出てくる重要なパラメータになりますが、今回は説明を割愛します。

動作確認

インスペクターからbullet_image_01を見ると、角度と速度が設定出来るようになっています。 シリアライズフィールドの効果で、インスペクターから値を設定出来るようになりました。

angleとspeedを変更して、どのように動くか確認してみてください。

画面上部のプレイボタンを押したら実行できます。

バグ修正

angle180で動作させると、弾が上正面を向いたまま左に動くと思います。

angleに合わせて弾の向きを修正するようにしましょう。

  • プログラム②
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bullet : MonoBehaviour
{
    [SerializeField] float angle; // 角度
    [SerializeField] float speed; // 速度
    Vector3 velocity; // 移動量

    void Start()
    {
        // X方向の移動量を設定する
        velocity.x = speed * Mathf.Cos(angle * Mathf.Deg2Rad);

        // Y方向の移動量を設定する
        velocity.y = speed * Mathf.Sin(angle * Mathf.Deg2Rad);
        
        // 弾の向きを設定する
        float zAngle = Mathf.Atan2(velocity.y, velocity.x) * Mathf.Rad2Deg - 90.0f;
        transform.rotation = Quaternion.Euler(0, 0, zAngle);
        
        // 5秒後に削除
        Destroy(gameObject, 5.0f);
    }
    void Update()
    {
        // 毎フレーム、弾を移動させる
        transform.position += velocity * Time.deltaTime;
    }

}

以下をstartに追加してください。

        // 弾の向きを設定する
        float zAngle = Mathf.Atan2(velocity.y, velocity.x) * Mathf.Rad2Deg - 90.0f;
        transform.rotation = Quaternion.Euler(0, 0, zAngle);

atanは2つの成分から角度を求める関数です xの移動量とyの移動量、つまり移動方向から弾の画像を回転させてます。

いろいろなangleで実行してください。全部弾の進む方向に向いていると思います。

これで完成です!!

弾が1つ完成したので、次回は弾を沢山出して弾幕の様にしていこうと思います。

プロジェクト配布

以下のGドライブに本プロジェクトを配布します。

STG_Game\Assets\Scenes\SampleScene.unityをダブルクリックで開くことが出来ると思います。

Libraryフォルダを削除しているので、起動に時間が掛かります。

●免責 このファイルを使用することにより発生したいかなる損害についても、責任を負いません。

drive.google.com