コンテンツへスキップ

【Unity】飛び道具(魔法攻撃・パーティクル)の作り方

最終更新日:2024年12月17日

飛び道具(敵に向かって前に進む攻撃)を作りたいと思ったことはありませんか?今回はパーティクルシステムを使って、魔法攻撃を作ってみたいと思います。考え方と、プログラムの完成形は以下の通りです。

攻撃のタイミングに合わせて、飛び道具を生成(スクラッチでいう「クローン」みたいなもの)します。

unity-particle-system-with-magic-attack10

この記事を読めば、下の動画のような攻撃が作れるようになります。

事前準備

まず、Unity アセットストアから素材をインポートする必要があります。また素材によっては、事前準備が必要な場合があります。事前準備の内容は、アセットストアのページに記載されています。記載内容に従って各自対応してください。

それぞれ、以下の記事に対応方法を記載しているので確認してみてください。

なお、今回利用した素材は以下の通りです。

Unity アセットストアには他にも色々な素材があります。好きな素材を探してみてください。パーティクルシステムは特定の Unity のバージョンでしか動作しない場合があるので注意してください。素材の探し方についてはこちらの記事が参考になります。

Unity での設定

Cute 2D Girl – Wizard」にある デモ「Wizard Demo 2」を土台にして作っていくことにします。

unity-particle-system-with-magic-attack3

シーン上に魔法攻撃のパーティクルを登録する

Magic Effects FREE」の「Magic effects pack / Prefabs / Portals / Portal blue」というパーティクルを使って魔法攻撃を表現することにします。「プロジェクト」タブにある「Portal blue」をシーン上にドラッグアンドドロップでのせます。また、このオブジェクトをプレイヤー(Wizard)の子オブジェクトにします(魔法を出現させる際に、プレイヤーの位置情報を取得する必要があるためです)。

unity-particle-system-with-magic-attack4
左の図を動画で解説したもの

パーティクル(ゲームオブジェクト)にタグを設定する

タグ「AttackPortal」をつけます。敵のスクリプト内で、当たり判定のときに使用します。

unity-particle-system-with-magic-attack9

プレイヤーとの位置関係を調整する

位置関係を把握しやすいように、プレイヤーを攻撃中のアニメーションにします(下図の赤色部分)。杖の位置に合わせて、魔法攻撃の位置を調整してください(水色部分)。

unity-particle-system-with-magic-attack5

パーティクルの設定を変更する

シーン上の魔法攻撃(パーティクル)を選択します。「インスペクター」タブに表示される「ループ」と「ゲーム開始時に再生」のチェックを外します。

unity-particle-system-with-magic-attack6

パーティクルにコンポーネントを追加する

魔法攻撃(パーティクル)に以下の3つのコンポーネントを追加してください。

Rigidbody 2D

攻撃時に前に進むために使います。
重力は不要なので、「重力スケール」を「0」にします。

Capsule Collider 2D

攻撃の形に合わせたコライダーを選択してください。ここでは Capsule Collider を選択しました。
「コライダーの編集」からコライダーの大きさや形を編集できます。
「トリガーにする」にチェックを入れます(物理的な処理は必要ないからです)。

unity-particle-system-with-magic-attack7

C# スクリプト

C# スクリプトを作成します。私は、「Wizard – 2D Character / Demo」の中に作りました。ファイル名を「PortalController」とします。作成したら、魔法攻撃にアタッチします。プログラムの中身は後で説明します。

unity-particle-system-with-magic-attack8

プログラミング

SimplePlayerController(プレイヤーのスクリプト)

変更前

private int direction = 1;

void Attack()
{
    if (Input.GetKeyDown(KeyCode.Alpha1))
    {
        anim.SetTrigger("attack");
    }
}

変更後

[SerializeField] private GameObject portalBlue;
public int direction { get; private set; } = 1;

private void Attack()
{
    if (Input.GetKeyDown(KeyCode.Alpha1))
    {
        anim.SetTrigger("attack");
        Vector3 position = transform.position + portalBlue.transform.position;
        if (0 <= direction)
        {
            var obj = Instantiate(portalBlue
                , position
                , Quaternion.identity);
            obj.transform.SetParent(transform);
        }
        else
        {
            position.x = -4.0f;
            var obj = Instantiate(portalBlue
                , position
                , Quaternion.identity);
            obj.transform.localScale = new Vector3(direction, 1, 1);
            obj.transform.SetParent(transform);
        }
    }
}

変更後のプログラムの解説

1行目:portalBlue(シリアライズフィールド)
 魔法攻撃を生成するために必要です。アタッチする魔法攻撃はプレハブ化しておく必要があります。

unity-particle-system-with-magic-attack11

2行目:direction を pubic な getter にする
 direction はプレイヤーの向き(1なら右、-1なら左)の情報です。魔法攻撃が進む方向を、プレイヤーの向きに合わせるために必要です。

9~25行目:プレイヤーが攻撃する際に、魔法攻撃を生成します
 プレイヤーが右向きか左向きかで、魔法攻撃の位置を調整します。Instantiate メソッドで魔法攻撃を生成します。SetParent メソッドで親子関係を設定します。これは、子のオブジェクト(魔法攻撃)が、プレイヤーの向きを取得できるようにするためです。

PortalController(魔法攻撃のスクリプト)

using ClearSky;
using UnityEngine;

public class PortalController : MonoBehaviour
{
    private void Start()
    {
        gameObject.SetActive(true);
        int parentDirection = transform.parent.gameObject.GetComponent<SimplePlayerController>().direction;
        Vector2 force = new Vector2(parentDirection * 100, 0);
        GetComponent<Rigidbody2D>().AddForce(force);
        GetComponent<ParticleSystem>().Play();
        transform.parent = null;
        Destroy(gameObject, 2.0f);
    }
}

プログラムの解説

9行目:親オブジェクト(プレイヤー)の向きを取得します。
10、11行目:向いている方向に魔法攻撃を移動させます。
12行目:パーティクルシステムを再生します。
13、14行目:親子関係を削除し、Destroyメソッドで魔法攻撃を破棄します。「2.0f」は、2秒後に破棄するという意味です。

SlimerController(敵のスクリプト)

using UnityEngine;

public class SlimerController : MonoBehaviour
{
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.tag == "AttackPortal")
        {
            Destroy(gameObject);
        }
    }
}

プログラムの解説

魔法攻撃に当たったら、敵キャラクターを破棄するようにします。

最後に

魔法攻撃の初期状態を非アクティブにする

ゲームをプレイしたときに、最初に魔法攻撃が発動してしまうと思います。魔法攻撃のインスペクタータブにあるチェックを外して非アクティブにしましょう(下図の赤枠)。

unity-particle-system-with-magic-attack12

以上で、飛び道具(魔法攻撃)の解説を終わります。

最終更新日:2024年12月17日

最終更新日:2024年12月17日

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA