【Unity】無敵状態を実現する

DoTweenを使って実現

DOTweenを使用してオブジェクトの点滅を実装する場合、DOTweenの DOFade メソッドを活用して、レンダラーのマテリアルの透明度をアニメーションします。ここでは、Unityの Renderer のマテリアルの透明度を変化させて点滅させる方法を紹介します。

まず、プロジェクトにDOTweenを追加してください。DOTweenはUnity Asset Storeから無料でダウンロード可能です。追加後、スクリプトから DOTween を使用するために、初期化が必要です。これは通常、ゲームのスタート時に行われます。

このInvincibilityコンポーネントが正しく機能するためには、いくつかのUnityコンポーネントが必要です。以下のコンポーネントが関連しています:

  1. Renderer:
    • Invincibilityスクリプトは、Rendererコンポーネントを通じてマテリアルの透明度を変更します。
    • オブジェクトにRendererコンポーネントがアタッチされている必要があります。これは、点滅効果をマテリアルに適用するためです。
    • 例えば、MeshRendererSpriteRendererなどが該当します。
  2. Material:
    • 透明度を変更するためには、透明度をサポートするマテリアルが必要です。
    • マテリアルは、シェーダーが透明度を扱えるもの(例:StandardシェーダーでRendering ModeTransparentに設定)である必要があります。
  3. Collider:
    • 衝突検出を行うためには、Colliderコンポーネントが必要です。
    • 衝突時に無敵状態であるかどうかを検出し、ダメージの処理を制御します。
  4. Rigidbody (オプショナル):
    • 物理的な衝突を検出する場合、Rigidbodyコンポーネントが必要になることがあります。
    • Rigidbodyがないと、OnCollisionEnterはトリガーされないことがあります(キネマティックオブジェクトなどの例外もあります)。

実装例

Player

攻撃する弾

フェードするためのマテリアル

ライブラリ化したスクリプト

以下のようにUnityエディタでコンポーネントを設定する例を示します。

  1. Unityエディタでの設定:
    • ゲームオブジェクトを選択します。
    • インスペクター画面で「Add Component」ボタンをクリックします。
    • Mesh RendererSprite Rendererを検索し、選択して追加します。
    • 同じくCollider(例えばBox ColliderSphere Colliderなど)を追加します。
    • 必要に応じてRigidbodyを追加します(動的な物理反応が必要な場合)。
  2. スクリプトの適用:
    • Invincibilityスクリプトをゲームオブジェクトにドラッグ&ドロップします。
    • スクリプトのパブリックフィールドに、適切なマテリアルをアサインします。

これらのステップにより、Invincibilityコンポーネントが期待通りに機能するようになります。

namespace YourCompany.Utilitiesは、仮の名前です

using System.Collections;
using UnityEngine;
using DG.Tweening; // DOTweenライブラリを利用するために必要

namespace YourCompany.Utilities
{
    /// <summary>
    /// オブジェクトを一定時間無敵にし、その間点滅させるコンポーネント。
    /// </summary>
    public class Invincibility : MonoBehaviour
    {
        [Tooltip("点滅効果を適用するマテリアル")]
        public Material material; // 点滅効果を適用するためのマテリアル。

        [Tooltip("無敵の持続時間(秒)")]
        public float duration = 3.0f; // 無敵状態を持続する時間(デフォルトは3秒間)。

        [Tooltip("点滅の周期(秒)")]
        public float fadeDuration = 0.1f; // 点滅の周期(デフォルトは0.1秒間隔で点滅)。

        /// <summary>
        /// 無敵状態かどうかを取得します。外部から読み取り可能です。
        /// </summary>
        [field: SerializeField]
        public bool IsInvincible { get; private set; } = false;  // 無敵状態のフラグ(外部からは読み取りのみ可能)。

        /// <summary>
        /// 無敵状態を開始します。
        /// </summary>
        public void SetInvincibility()
        {
            if (material != null)
            {
                // 無敵状態と点滅効果を開始するコルーチンを開始します。
                StartCoroutine(BecomeInvincible(duration, fadeDuration));
            }
            else
            {
                // マテリアルが設定されていない場合はエラーをログに出力します。
                Debug.LogError("Invincibility: 効果を適用するためにはマテリアルが必要です。");
            }
        }

        /// <summary>
        /// 無敵状態と点滅効果を管理するコルーチンです。
        /// </summary>
        /// <param name="duration">無敵状態の持続時間。</param>
        /// <param name="fadeDuration">点滅の間隔。</param>
        private IEnumerator BecomeInvincible(float duration, float fadeDuration)
        {
            IsInvincible = true;  // 無敵状態を開始します。
            float endTime = Time.time + duration;
            while (Time.time < endTime)
            {
                // DOTweenを使用してマテリアルの透明度をアニメーションし、点滅させます。
                material.DOFade(0, fadeDuration).SetLoops(2, LoopType.Yoyo);
                yield return new WaitForSeconds(fadeDuration * 2); // 点滅間隔の合計時間(往復)まで待機します。
            }
            material.DOFade(1, 0); // 無敵終了後、マテリアルの透明度を元に戻します。
            IsInvincible = false;  // 無敵状態を終了します。
        }
    }
}

このスクリプトでは、DOFade を使用してマテリアルの透明度をアニメーションさせています。SetLoops メソッドを使うことで点滅を実現しており、LoopType.Yoyo に設定することで透明度が0になった後、再び1に戻る動きをします。点滅の間隔は blinkInterval で制御されています。

このコードでは、透明度が0の時にダメージを受けないように OnCollisionEnter メソッド内でチェックを行っています。また、無敵状態が終了した際には、DOFade を使ってすぐに透明度を1に戻しています。

このコード行は、DOTween ライブラリを使用して、ゲームオブジェクトのマテリアルの透明度をアニメーション化するものです。以下にその詳細を説明します。

// DOTweenを使用してマテリアルの透明度をアニメーション
material.DOFade(0, fadeDuration).SetLoops(2, LoopType.Yoyo);
  • material.DOFade(0, fadeDuration): このメソッドは、マテリアルの透明度(Opacity)をアニメーション化します。第一引数の0はターゲットの透明度値で、この場合は0(完全に透明)を意味します。fadeDurationはアニメーションにかかる時間(秒)を指定し、この期間をかけて透明度が現在の値から0へと変化します。
  • .SetLoops(2, LoopType.Yoyo): このメソッドはアニメーションのループ動作を設定します。2はループの回数を指定し、LoopType.Yoyoはループのタイプです。LoopType.Yoyoを指定すると、アニメーションは指定したターゲット値に達した後、再び元の値に戻る動作を行います。ここでは透明度が0になった後、元の不透明度(通常は1)に戻ります。2回のループ指定により、透明→不透明→透明と変化し、その後元の状態(このコードでは不透明)に戻ります。

アニメーションの動作解説

このアニメーションは次のように動作します:

  1. アニメーション開始時に、マテリアルの透明度は現在の値(例えば1、つまり完全に不透明)から0(完全に透明)へとfadeDuration秒かけて変化します。
  2. LoopType.Yoyoにより、透明度が0に到達した後、逆のアニメーションが自動的に開始され、透明度が再び1に戻ります(これが1回目のループ)。
  3. 再び0に向かう変化が開始され、完了後に元の透明度(1)に戻ります(これが2回目のループ)。

このようなアニメーションは、ゲーム内でキャラクターが無敵状態になる際に視覚的なフィードバックをプレイヤーに提供するのに役立ちます。プレイヤーは視覚的な変化を見て、キャラクターの状態が変わったことを直感的に理解することができます。

使い方

using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneLoader : MonoBehaviour
{
    void Start()
    {
        // 現在のシーンに追加して新しいシーンをロード
        SceneManager.LoadScene("BackGroundScene", LoadSceneMode.Additive);
    }
}

Unity

Posted by hidepon