【Unity】無敵モードの実装

ゲームオブジェクトを一定時間点滅させることで無敵状態を表現し、その後通常状態に戻します

無敵モードを実装するゲームオブジェクトにアタッチするスクリプト

using System.Collections;
using UnityEngine;

public class InvincibilityEffect : MonoBehaviour
{
    private Renderer renderer;
    private Collider collider;

    private const float BlinkInterval = 0.15f;
    private const float PostBlinkDelay = 0.3f;

    void Start()
    {
        collider = GetComponent<Collider>();
        renderer = GetComponent<Renderer>();
    }

    // このメソッドを外部から呼び出して無敵効果を開始します。
    public void ActivateInvincibility(int blinkCount)
    {
        collider.enabled = false;
        StartCoroutine(StartInvincibilityEffect(blinkCount));
    }

    private IEnumerator StartInvincibilityEffect(int blinkCount)
    {
        renderer.enabled = false;

        for (int i = 0; i < blinkCount; i++)
        {
            yield return new WaitForSeconds(BlinkInterval);
            renderer.enabled = !renderer.enabled;
        }

        yield return new WaitForSeconds(PostBlinkDelay);
        renderer.enabled = true;
        collider.enabled = true;
    }
}


InvincibilityEffect
クラスは、Unityのゲームオブジェクトに無敵状態を追加します。ActivateInvincibilityメソッドは外部から呼び出され、指定された回数(blinkCount)オブジェクトを点滅させます。これはStartCoroutineを使用してStartInvincibilityEffectコルーチンを起動し、オブジェクトのRendererColliderの状態を切り替えることで実現します。最初にコライダーを無効にし、オブジェクトを一時的に非表示にしてから、ループ内で表示状態を交互に切り替えます。ループが完了すると、オブジェクトは再び可視状態に戻り、コライダーが有効になり、通常のインタラクションが可能になります。

必要なコンポーネント

このInvincibilityEffectスクリプトを機能させるには、以下のコンポーネントがゲームオブジェクトに必要です:

  1. Renderer:
    • オブジェクトの表示・非表示を制御するために必要です。点滅効果を実現するために、スクリプト内でrenderer.enabledプロパティが使われています。MeshRendererSpriteRendererなど、オブジェクトに適用されているレンダラータイプに応じて変わります。
  2. Collider:
    • 物理的な相互作用(衝突など)を制御するために使用されます。無敵状態の間、物理的な衝突を避けるためにコライダーが無効にされます。BoxCollider, SphereCollider, CapsuleColliderなど、オブジェクトに適したコライダーが必要です。

これらのコンポーネントはUnityエディタ内でゲームオブジェクトに手動で追加するか、スクリプトで動的に追加することができます。GetComponent<>()メソッドは、これらのコンポーネントが既にオブジェクトにアタッチされていることを前提としています。もしオブジェクトにこれらが付属していない場合は、スクリプトは期待通りに動作しません。また、このスクリプトはUnityのゲームオブジェクトにアタッチする必要があります。

スクリプトで必須コンポーネントのアタッチを要求する場合

スクリプトをアタッチした際に、RendererColliderコンポーネントがゲームオブジェクトに自動的に追加されます(既に存在している場合は追加されません)。これにより、スクリプトの依存関係が明確になり、エラーを防ぐことができます

上記コードのクラス宣言の上に次の行を追加します

[RequireComponent(typeof(Renderer))]
[RequireComponent(typeof(Collider))]

使い方

同じゲームオブジェクトにアタッチされているスクリプトから実装する方法

他のスクリプトからこの機能を使用するには以下のようにします

// 他のスクリプトから
InvincibilityEffect invincibilityEffect = gameObject.GetComponent<InvincibilityEffect>();
invincibilityEffect.ActivateInvincibility(9);

他のゲームオブジェクトにアタッチされているスクリプトから実装する方法

他のゲームオブジェクトからInvincibilityEffectスクリプトのActivateInvincibilityメソッドを呼び出すには、まず無敵状態を適用したいゲームオブジェクトを参照し、そのオブジェクトにアタッチされているInvincibilityEffectスクリプトのインスタンスを取得し、そのインスタンスのメソッドを呼び出します。以下は、その実装例です:

using UnityEngine;

public class OtherScript : MonoBehaviour
{
    public GameObject targetObject; // Inspectorから設定するか、コードで割り当てる

    void SomeMethod()
    {
        InvincibilityEffect invincibilityEffect = targetObject.GetComponent<InvincibilityEffect>();
        if (invincibilityEffect != null)
        {
            invincibilityEffect.ActivateInvincibility(9);
        }
    }
}

C#

Posted by hidepon