【Unityゲーム開発】子Spriteオブジェクトに一括でインパクトエフェクトを適用する方法【備忘録】

この記事では、指定したオブジェクト内の全ての子オブジェクトのSpriteに対して一括でインパクトエフェクトを適用する方法を紹介します。

目次

使用するスクリプトの概要

今回紹介するスクリプトは、次の2つのファイルで構成されています。

  1. MainManager.cs – エフェクトを管理するメインのスクリプト
  2. SpriteImpactEffect.cs – 各子オブジェクトにエフェクトを適用するスクリプト

DOTweenの導入

今回のスクリプトでは、アニメーションやエフェクトを簡単に作成できるツールである DOTween を使用しています。DOTweenを使用するためには、まずUnityプロジェクトにDOTweenを導入する必要があります。

DOTweenの導入方法は以下の記事で紹介しています。

Hierarchyの構成

今回のサンプルでは以下のような構成となっています。

targetオブジェクトにSpriteの画像を2つ入れています。また、debugメソッドを実行するためにボタンを一つ追加しています。

インパクトエフェクトの実装 ~ SpriteImpactEffect.cs 

SpriteImpactEffect.cs は、Unityで指定されたゲームオブジェクト内のすべての子オブジェクトに対して、インパクトエフェクトを一括適用するスクリプトです。

このスクリプトは、複製されたスプライトを使ってエフェクトを表現し、最終的には元のスプライトを操作せずにエフェクトが完了する構成になっています。以下、各コード部分について詳細に解説します。

using UnityEngine;
using DG.Tweening;

/// <summary>
/// 指定したGameObject内の全てのSpriteRendererに
/// インパクトエフェクトを適用するクラス
/// </summary>
public class SpriteImpactEffect : MonoBehaviour
{
    public float duration = 0.5f;        // エフェクトの持続時間
    public float scaleMultiplier = 1.5f; // 拡大倍率
    public float finalAlpha = 0f;      // 最終的な透明度

    public void ShowImpactEffect(GameObject targetGameObject)
    {
        // targetGameObject内の全てのSpriteRendererを取得
        SpriteRenderer[] spriteRenderers = targetGameObject.GetComponentsInChildren<SpriteRenderer>();

        foreach (SpriteRenderer originalSpriteRenderer in spriteRenderers)
        {
            // 元のスプライトを複製
            GameObject spriteCopy = new GameObject("SpriteCopy");
            SpriteRenderer spriteRenderer = spriteCopy.AddComponent<SpriteRenderer>();
            spriteRenderer.sprite = originalSpriteRenderer.sprite;
            spriteCopy.layer = originalSpriteRenderer.gameObject.layer; 

            // 複製したスプライトの初期設定
            spriteCopy.transform.position = originalSpriteRenderer.transform.position;
            spriteCopy.transform.localScale = originalSpriteRenderer.transform.localScale;
            spriteRenderer.color = new Color(1f, 1f, 1f, 1f);

            // スプライトを拡大し、半透明にする
            spriteCopy.transform.DOScale(spriteCopy.transform.localScale * scaleMultiplier, duration).SetEase(Ease.OutQuad);
            spriteRenderer.DOColor(new Color(1f, 1f, 1f, finalAlpha), duration).SetEase(Ease.OutQuad)
                .OnComplete(() => {
                    // 複製したスプライトを破棄
                    Destroy(spriteCopy);
                });
        }
    }
}

メンバ変数の宣言

  • duration: エフェクトの持続時間を設定します。デフォルトでは0.5秒となっています。この変数を変更することで、エフェクトのスピードを調整できます。
  • scaleMultiplier: スプライトの拡大倍率を指定します。デフォルト値は1.5で、スプライトの大きさを1.5倍に拡大することを意味します。
  • finalAlpha: エフェクト終了時のスプライトの透明度を指定します。デフォルト値は0で、完全に透明になります。

ShowImpactEffect メソッド

このメソッドは、指定された targetGameObject のすべての SpriteRenderer コンポーネントに対してインパクトエフェクトを適用します。

GetComponentsInChildren<SpriteRenderer>(): targetGameObject 内のすべての SpriteRenderer コンポーネントを取得します。これにより、オブジェクトとそのすべての子オブジェクトのスプライトを操作対象とします。

スプライトの複製

  • GameObject spriteCopy = new GameObject("SpriteCopy");: 新しいゲームオブジェクトを作成し、”SpriteCopy” という名前を付けます。
  • SpriteRenderer spriteRenderer = spriteCopy.AddComponent<SpriteRenderer>();: 複製したオブジェクトに SpriteRenderer コンポーネントを追加します。
  • spriteRenderer.sprite = originalSpriteRenderer.sprite;: 元のスプライトを複製スプライトに設定します。
  • spriteCopy.layer = originalSpriteRenderer.gameObject.layer;: 複製したスプライトのレイヤーを元のスプライトと同じにします。

複製スプライトの初期設定

  • spriteCopy.transform.position = originalSpriteRenderer.transform.position;: 元のスプライトと同じ位置に複製スプライトを配置します。
  • spriteCopy.transform.localScale = originalSpriteRenderer.transform.localScale;: 元のスプライトと同じスケールに設定します。
  • spriteRenderer.color = new Color(1f, 1f, 1f, 1f);: 複製スプライトの色を白色(完全に不透明)に設定します。

エフェクトのアニメーション設定

スケールの変更

spriteCopy.transform.DOScale(spriteCopy.transform.localScale * scaleMultiplier, duration).SetEase(Ease.OutQuad);: 複製スプライトを拡大し、指定された duration の間に scaleMultiplier 倍の大きさにします。Ease.OutQuad は、アニメーションが徐々に減速するスムーズな効果を与えます。

透明度の変更

spriteRenderer.DOColor(new Color(1f, 1f, 1f, finalAlpha), duration).SetEase(Ease.OutQuad);: 複製スプライトの色を変更し、最終的に finalAlpha で指定された透明度にします。

エフェクト終了後のオブジェクト破棄

.OnComplete(() => { Destroy(spriteCopy); });: エフェクトが完了した後、複製スプライトを破棄します。これにより、エフェクトが終わった後に不要なオブジェクトが残らないようにします。

MainManager.cs

MainManager.csは、ゲーム全体の管理を行うスクリプトです。

このスクリプトでは、ImpactControllerと呼ばれるエフェクト制御オブジェクトを使用して、指定したターゲットオブジェクトにエフェクトを適用します。

using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using System.Linq;
using DG.Tweening;

public class MainManager : MonoBehaviour
{

    #region public 変数
    /// <summary>
    /// メインマネージャーのインスタンス
    /// </summary>
    public static MainManager instance;

    /// <summary>
    /// インパクトエフェクト
    /// </summary>
    public GameObject ImpactController;


    public GameObject targetObject;
    #endregion

    #region private 変数
    private SpriteImpactEffect impactC;
    #endregion

    #region unityのイベント処理

    void Awake()
    {
        if (instance == null)
        {
            instance = this;
        }
        else
        {
            Destroy(gameObject);
        }
    }

    private void Start()
    {
        //各コンポーネントの取得
        impactC = ImpactController.GetComponent<SpriteImpactEffect>();
    }

    #endregion

    #region デバッグ処理

    public void debug()
    {
        impactC.ShowImpactEffect(targetObject);
    }
    #endregion

}

実装手順

  1. MainManagerオブジェクトの作成
    Hierarchyに新規GameObjectを作成し、MainManager.csをアタッチします。
  2. ImpactControllerオブジェクトの設定
    エフェクト制御用のGameObject(ImpactController)を作成し、SpriteImpactEffect.csをアタッチします。MainManagerのInspectorでImpactControllerとして指定してください。
  3. ターゲットオブジェクトの指定
    エフェクトを適用したいオブジェクト(targetObject)を、MainManagerのInspectorで指定します。
  4. デバッグやトリガー設定
    debug()メソッドを使用して、シーン内でエフェクトを確認できます。必要に応じて、UIボタンや特定のイベントからエフェクトをトリガーしてください。

まとめ

今回の解説では、Unityで子オブジェクトに対して一括でインパクトエフェクトを適用する方法について紹介しました。この実装には、DOTweenを使用して簡単にアニメーション効果を追加しています。

  • スクリプトの構成:
    • MainManager.cs でエフェクトを管理し、SpriteImpactEffect.cs で指定したオブジェクト内のすべての子オブジェクトに対してエフェクトを適用します。
  • エフェクトのアニメーション:
    • DOTweenを使用して、スプライトの拡大や透明度の変化などのインパクトエフェクトをスムーズに実現します。

これにより、オブジェクトやキャラクターに対して簡単に視覚的な効果を加えることができ、ゲームの演出力が向上します。初心者でも取り組みやすい内容なので、ぜひ自分のプロジェクトで試してみてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次