【Unity】無敵状態を実現する
DoTweenを使って実現
DOTweenを使用してオブジェクトの点滅を実装する場合、DOTweenの DOFade
メソッドを活用して、レンダラーのマテリアルの透明度をアニメーションします。ここでは、Unityの Renderer
のマテリアルの透明度を変化させて点滅させる方法を紹介します。
まず、プロジェクトにDOTweenを追加してください。DOTweenはUnity Asset Storeから無料でダウンロード可能です。追加後、スクリプトから DOTween
を使用するために、初期化が必要です。これは通常、ゲームのスタート時に行われます。
このInvincibility
コンポーネントが正しく機能するためには、いくつかのUnityコンポーネントが必要です。以下のコンポーネントが関連しています:
- Renderer:
Invincibility
スクリプトは、Renderer
コンポーネントを通じてマテリアルの透明度を変更します。- オブジェクトに
Renderer
コンポーネントがアタッチされている必要があります。これは、点滅効果をマテリアルに適用するためです。 - 例えば、
MeshRenderer
やSpriteRenderer
などが該当します。
- Material:
- 透明度を変更するためには、透明度をサポートするマテリアルが必要です。
- マテリアルは、シェーダーが透明度を扱えるもの(例:
Standard
シェーダーでRendering Mode
をTransparent
に設定)である必要があります。
- Collider:
- 衝突検出を行うためには、
Collider
コンポーネントが必要です。 - 衝突時に無敵状態であるかどうかを検出し、ダメージの処理を制御します。
- 衝突検出を行うためには、
- Rigidbody (オプショナル):
- 物理的な衝突を検出する場合、
Rigidbody
コンポーネントが必要になることがあります。 Rigidbody
がないと、OnCollisionEnter
はトリガーされないことがあります(キネマティックオブジェクトなどの例外もあります)。
- 物理的な衝突を検出する場合、
実装例
Player
攻撃する弾
フェードするためのマテリアル
ライブラリ化したスクリプト
以下のようにUnityエディタでコンポーネントを設定する例を示します。
- Unityエディタでの設定:
- ゲームオブジェクトを選択します。
- インスペクター画面で「Add Component」ボタンをクリックします。
Mesh Renderer
やSprite Renderer
を検索し、選択して追加します。- 同じく
Collider
(例えばBox Collider
、Sphere Collider
など)を追加します。 - 必要に応じて
Rigidbody
を追加します(動的な物理反応が必要な場合)。
- スクリプトの適用:
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
、つまり完全に不透明)から0
(完全に透明)へとfadeDuration
秒かけて変化します。 LoopType.Yoyo
により、透明度が0
に到達した後、逆のアニメーションが自動的に開始され、透明度が再び1
に戻ります(これが1回目のループ)。- 再び
0
に向かう変化が開始され、完了後に元の透明度(1
)に戻ります(これが2回目のループ)。
このようなアニメーションは、ゲーム内でキャラクターが無敵状態になる際に視覚的なフィードバックをプレイヤーに提供するのに役立ちます。プレイヤーは視覚的な変化を見て、キャラクターの状態が変わったことを直感的に理解することができます。
使い方
using UnityEngine;
using UnityEngine.SceneManagement;
public class SceneLoader : MonoBehaviour
{
void Start()
{
// 現在のシーンに追加して新しいシーンをロード
SceneManager.LoadScene("BackGroundScene", LoadSceneMode.Additive);
}
}
ディスカッション
コメント一覧
まだ、コメントがありません