今回はUnity2Dゲームで「ブロックが壊れる(崩れる)エフェクト」を実装していきます。
アニメーションを利用する方法もありますが、ParticleSystemを利用してみます。
はじめに
Unityのバージョンは2021.3.14f1です。
ParticleSystemは下記の記事でも簡単に紹介しています。
実装開始
プレイヤーを作成後、ブロックを作成します。
地面とプレイヤーの作成
「2DObject」→「Sprites」→「Square」を2つ追加。
一つをPlayerにしてBoxCollider2D、Rigidbody2Dをアタッチ。PlayerMoveと言う名前でスクリプトもアタッチしておきます。

もう一つはGroundにしてLayerを変更、BoxCollider2Dをアタッチ。下記の様なゲーム画面にします。

スクリプトを下記に変更してプレイヤーを動くようにします。
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
[SerializeField] private LayerMask _groundLayer;
private float _PlayerSpeed = 10.0f;
private float _jumpPower = 10.0f;
private Rigidbody2D _rb;
void Start()
{
_rb = GetComponent<Rigidbody2D>();
}
void Update()
{
float InputX = Input.GetAxisRaw("Horizontal");
if (Input.GetKey(KeyCode.Space) && isGrounded())
_rb.velocity = new Vector2(_rb.velocity.x, _jumpPower);
_rb.velocity = new Vector2(InputX * _PlayerSpeed, _rb.velocity.y);
}
private bool isGrounded()
{
RaycastHit2D raycastHit = Physics2D.Raycast(transform.position, Vector2.down, 0.6f,
_groundLayer);
return raycastHit.collider != null;
}
}
PlayerMoveスクリプトのパラメータをセット。

実行すると下記の様に左右に動き、スペースキーでジャンプできます。

この地面とプレイヤー部分は下記記事に詳しく書いてあります。
ブロックの作成
「2DObject」→「Sprites」→「Square」を追加。

名前をBoxにして、位置と色を変更しておきます。

BoxCollider2DをアタッチしisTriggerにチェック、BreakBoxと言う名前でスクリプトをアタッチします。

スクリプトを下記に変更。
using UnityEngine;
public class BreakBox : MonoBehaviour
{
private void OnTriggerEnter2D(Collider2D col)
{
Destroy(gameObject);
}
}
実行すると、下記の様にぶつかるとブロックが消えます。

これに破壊したようなエフェクトを追加してみます。
Particle System
Boxの配下に「Effects」→「Particle System」を追加。

上向きにエフェクトを出すので、RotationのXを-90にします。

Projectフォルダ内にMaterialを新規で作成。

ShaderをParticlesにして、ブロックと同じ色に変更します。

Particle SystemのRendererのMaterialを作成したマテリアルに変更。

ParticleSystemのDuration、StartLifetime、StartSize、GravityModifierなどを変更して壊れて広がる感じにします。

スクリプトを下記に変更。
using System.Collections;
using UnityEngine;
public class BreakBox : MonoBehaviour
{
[SerializeField] ParticleSystem _particle;
private SpriteRenderer _rend;
private void Awake()
{
_rend = GetComponent<SpriteRenderer>();
}
private void OnTriggerEnter2D(Collider2D col)
{
StartCoroutine(BoxDest());
}
private IEnumerator BoxDest()
{
_rend.enabled = false;
_particle.Play();
yield return new WaitForSeconds(_particle.main.startLifetime.constantMax);
Destroy(gameObject);
}
}
下記の様な感じになります。

この方法が最適かどうかは少し疑問ですが、こんな方法もあるって感じですね。箱を壊すだけでなく、Particle Systemは結構いろんなことに使えそうな感じですな。

