最終更新日:2024年12月17日
飛び道具(敵に向かって前に進む攻撃)を作りたいと思ったことはありませんか?今回はパーティクルシステムを使って、魔法攻撃を作ってみたいと思います。考え方と、プログラムの完成形は以下の通りです。
攻撃のタイミングに合わせて、飛び道具を生成(スクラッチでいう「クローン」みたいなもの)します。
この記事を読めば、下の動画のような攻撃が作れるようになります。
目次
事前準備
まず、Unity アセットストアから素材をインポートする必要があります。また素材によっては、事前準備が必要な場合があります。事前準備の内容は、アセットストアのページに記載されています。記載内容に従って各自対応してください。
それぞれ、以下の記事に対応方法を記載しているので確認してみてください。
なお、今回利用した素材は以下の通りです。
Unity アセットストアには他にも色々な素材があります。好きな素材を探してみてください。パーティクルシステムは特定の Unity のバージョンでしか動作しない場合があるので注意してください。素材の探し方についてはこちらの記事が参考になります。
Unity での設定
「Cute 2D Girl – Wizard」にある デモ「Wizard Demo 2」を土台にして作っていくことにします。
シーン上に魔法攻撃のパーティクルを登録する
「Magic Effects FREE」の「Magic effects pack / Prefabs / Portals / Portal blue」というパーティクルを使って魔法攻撃を表現することにします。「プロジェクト」タブにある「Portal blue」をシーン上にドラッグアンドドロップでのせます。また、このオブジェクトをプレイヤー(Wizard)の子オブジェクトにします(魔法を出現させる際に、プレイヤーの位置情報を取得する必要があるためです)。
パーティクル(ゲームオブジェクト)にタグを設定する
タグ「AttackPortal」をつけます。敵のスクリプト内で、当たり判定のときに使用します。
プレイヤーとの位置関係を調整する
位置関係を把握しやすいように、プレイヤーを攻撃中のアニメーションにします(下図の赤色部分)。杖の位置に合わせて、魔法攻撃の位置を調整してください(水色部分)。
パーティクルの設定を変更する
シーン上の魔法攻撃(パーティクル)を選択します。「インスペクター」タブに表示される「ループ」と「ゲーム開始時に再生」のチェックを外します。
パーティクルにコンポーネントを追加する
魔法攻撃(パーティクル)に以下の3つのコンポーネントを追加してください。
Rigidbody 2D
攻撃時に前に進むために使います。
重力は不要なので、「重力スケール」を「0」にします。
Capsule Collider 2D
攻撃の形に合わせたコライダーを選択してください。ここでは Capsule Collider を選択しました。
「コライダーの編集」からコライダーの大きさや形を編集できます。
「トリガーにする」にチェックを入れます(物理的な処理は必要ないからです)。
C# スクリプト
C# スクリプトを作成します。私は、「Wizard – 2D Character / Demo」の中に作りました。ファイル名を「PortalController」とします。作成したら、魔法攻撃にアタッチします。プログラムの中身は後で説明します。
プログラミング
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(シリアライズフィールド)
魔法攻撃を生成するために必要です。アタッチする魔法攻撃はプレハブ化しておく必要があります。
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);
}
}
}
プログラムの解説
魔法攻撃に当たったら、敵キャラクターを破棄するようにします。
最後に
魔法攻撃の初期状態を非アクティブにする
ゲームをプレイしたときに、最初に魔法攻撃が発動してしまうと思います。魔法攻撃のインスペクタータブにあるチェックを外して非アクティブにしましょう(下図の赤枠)。
以上で、飛び道具(魔法攻撃)の解説を終わります。
最終更新日:2024年12月17日
最終更新日:2024年12月17日