Unity C#でプレイヤーキャラから弾を撃つ、発射する方法/プレハブ、Instantiate as GameObjectの使い方

archer IT

自キャラから敵に向かって弾を撃ち、敵や壁に当たったらなにがしかの処理を行う方法です。

スポンサーリンク

成果物

st3
キーを押すと弾を撃ちます。

弾の作成

shot1
まずは弾の作成を行います。png画像をオブジェクト化し、コライダーリジッドボディを設定します。
弾のコライダーで自分自身が弾かれないように、トリガーにするをONにしておきます。重力スケールは今回は0にしてますが、あえて設定することで矢のような放物線を描く攻撃をさせることも可能です。
shot2
スクリプトをアタッチし、
shot4
Velocityなどで進行方向へ進むように記述します。この状態だと主人公の向きにかかわらず一方方向にしか進まないので、
shot5
まずはGameObject 変数名 = GameObject.Find(“オブジェクト名”);のように記述して、同じシーンにあるプレイヤーキャラクターのオブジェクトを取得し、
shot6
publicで「左右」を判定する論理値の変数を作っておいて、論理値の変数名 = オブジェクトの変数名.GetComponent<SpriteRenderer>().flipX;のように記述して、自キャラが左右どちらを向いているかをStartメソッド内で取得します。
shot7
Fixed Updateメソッド内では、この論理値がTrueまたはFalseの場合で逆方向に弾が動くようにします。
shot8
動作確認のために、Start内の内容を一度Updateに移動してテストプレイしてみます。
st1
実行結果です。キャラクターの向きに合わせて弾が右往左往していることが確認できます。
shot3
作った弾をプレハブ化し、元のオブジェクトは削除します。

キーを押すと弾を発射

プレハブをゲーム内に出現させる
public GameObject プレハブの変数名;
GameObject 登場させるオブジェクト名 = Instantiate(プレハブの変数名) as GameObject;
shot9
自キャラのスクリプトにpublicでゲームオブジェクトを宣言し、
shot10
さっき作ったプレハブをインスペクターでセットします。
shot11
任意のキー内で、GameObject 作る弾の名 = Instantiate(プレハブの変数名) as GameObject;のように指定すると、プレハブをゲーム内に登場させることができますが、
st2
元々オブジェクトがあった場所から発射されてしまうので、
shot12
transform.positionで位置を自機の位置に合わせてあげます。
st3
割とそれっぽくなってきたんじゃないでしょうか。

当たり判定についてはまたちょっとちがうことしないといけないので、別記事とします。

//Unity C#

//弾のスクリプト
public class Shot : MonoBehaviour
{
    public bool lr;

    void Start()
    {
     //左右確認
        GameObject player = GameObject.Find("chara");
        lr = player.GetComponent<SpriteRenderer>().flipX;
    }

    void FixedUpdate()
    {
        if (lr)
        {
            this.GetComponent<Rigidbody2D>().velocity = new Vector2(-20, 0);
        }
        else
        {
            this.GetComponent<Rigidbody2D>().velocity = new Vector2(20, 0);
        }
        
    }
}

//自機のスクリプト
public class MainCharacter : MonoBehaviour
{
public GameObject tama;

    void FixedUpdate()
    {
            //ショット
            if (Input.GetKey(KeyCode.DownArrow))
            {
            //プレハブ召喚
            GameObject playerShot = Instantiate(tama) as GameObject;
            playerShot.transform.position = this.transform.position;
          }
    }

完成品はこちら

やりたいことから逆引きするUNITYの使い方まとめ
Unityをやりたいことから学習していけるよう、機能・用途別にまとめたページです。C#の命令別の逆引きは現時点で作っていません。2019の時期に書き始めているので、それより前のバージョンについては言及しません。

コメント