結果だけでなく過程も見てください

日々の奮闘を綴る日記です。

Unity Tips

Unityを使う上で自分が使用した手法等をまとめていきます。
適宜追加記事です。

フェードアウト/フェードインの実装

Unityエディタでの操作

画像を使わず、Panelを使ったフェードアウト/フェードインの方法をご紹介します。

f:id:taiyakisun:20211015121716p:plain
①Hierarchyツリーで、右クリック→UI→Panelでパネルを追加してください。
②Panelが画面全体に満たない場合は、Scaleを調整して画面全体を覆うように調整してください
③フェードする色を選びます。ここでは白色としています。
④Panelは普段は非表示にするため、ここのチェックは外します。

スクリプトの作成

続いて、フェード処理を行うためのC#スクリプトを作成して、Panelにスクリプトを追加します
ここではクラス名をFadeControllerとしています。
アルファ値(透明度)は0.0f~1.0fの間で指定するので注意してください。0.0fが完全透明、1.0fが完全不透明です。

public class FadeController : MonoBehaviour
{
    private float _fadeSpeed = 0.02f;       // 透明度が変わるスピードを管理
    private float _r, _g, _b, _a;           // パネルの色、不透明度を管理

    private bool _bFadeOut = false;         // フェードアウト処理の開始、完了を管理するフラグ
    private bool _bFadeIn = false;          // フェードイン処理の開始、完了を管理するフラグ

    Image _fadeImage;                       // 透明度を変更するパネルのイメージ(UnityEditorで設定)


    // Start is called before the first frame update
    void Start()
    {
        _fadeImage = GetComponent<Image>();
        _r = _fadeImage.color.r;
        _g = _fadeImage.color.g;
        _b = _fadeImage.color.b;
        _a = _fadeImage.color.a;
    }

    // Update is called once per frame
    void Update()
    {
        if (_bFadeIn)
        {
            _a -= _fadeSpeed;          // 不透明度を徐々に下げる
            _fadeImage.color = new Color(_r, _g, _b, _a);
            if (_a <= 0.0f)
            {
                // フェードイン完了
                _bFadeIn = false;
                _fadeImage.enabled = false;      // パネルもついでに消しておく
            }
        }

        if (_bFadeOut)
        {
            _a += _fadeSpeed;         // 不透明度を徐々に上げる
            _fadeImage.color = new Color(_r, _g, _b, _a);
            if (_a >= 1.0f)
            {
                // フェードインアウト完了
                _bFadeOut = false;
            }
        }
    }

    public void StartFadeIn(float fAlphaSpeed = 0.02f)
    {
        if (_bFadeIn)
        {
            // すでにフェードイン中なら何もしない
            return;
        }

        _fadeImage.enabled = true;
        _fadeSpeed = fAlphaSpeed;
        _bFadeIn = true;
        _a = 1.0f;
    }

    public void StartFadeOut(float fAlphaSpeed = 0.02f)
    {
        if (_bFadeOut)
        {
            // すでにフェードアウト中なら何もしない
            return;
        }

        _fadeImage.enabled = true;
        _fadeSpeed = fAlphaSpeed;
        _bFadeOut = true;
        _a = 0.0f;
    }
}

フェード処理の呼び出し

例えばゲームシーンのクラスから呼び出したいとします。
まず、_fadeWhiteという変数をpublicで定義し、Unityエディタから↑で作成したPanelを割り当ててください。

次にプレイヤーが死亡したときにPlayerDied()という関数が呼ばれるとします。
PlayerDied()の中でStartCoroutineをして、PlayerDiedRoutine()を呼び、PlayerDiedRoutine()の中でフェード処理を書きます。

public class GameScene : MonoBehaviour
{
    //フェード用Panel(白)(UnityEditorで設定する)
    public GameObject _fadeWhite;

    :

    private void PlayerDied()
    {
        StartCoroutine(PlayerDiedRoutine());
    }

    private IEnumerator PlayerDiedRoutine()
    {
        //ここにプレイヤー死亡時のコードを書く

        //フェード処理開始
        _fadeWhite.GetComponent<FadeController>().StartFadeOut(0.016f);  // 60FPSなので1.0fまで約1秒
        yield return new WaitForSeconds(1.0f);  //フェード完了まで一秒ウェイト

        //その他死亡処理をここに書く
    }
    :
}

当たり判定

全当たり判定を取得する

Collider2D[] objAllBoxCollider = obj.GetComponents<Collider2D>()
foreach (var col in objAllBoxCollider)
{
    col.enable = false;  // 当たり判定を無効にする
}
プライバシーポリシー お問い合わせ