うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】インスタンスを破棄するスコープ

エフェクトなど、一時的なオブジェクト生成時にオブジェクトの破棄を忘れることがあるので

破棄してくれるスコープを作ってみました

[SerializeField]
private GameObject _effect;
 
private void PlayEffect()
{
    var obj = GameObject.Instantiate(_effect, transform);
    // 再生待ち等の処理

    GameObject.Destroy(obj);
}

コード

public class InstanceScope : IDisposable
{
    public GameObject GameObject { get; private set;}
 
    public InstanceScope(GameObject resource, Transform parent = null)
    {
        var obj = GameObject.Instantiate(resource, parent);
        obj.name = resource.name;
    }
 
    public void Dispose()
    {
        GameObject.Destroy(GameObject);
    }
}
 
public class InstanceScope<T> : IDisposable where T : Component
{
    public T Instance { get; private set;}
 
    public InstanceScope(GameObject resource, Transform parent = null)
    {
        var obj = GameObject.Instantiate(resource, parent);
        obj.name = resource.name;
        Instance = obj.GetComponent<T>();
    }
 
    public void Dispose()
    {
        GameObject.Destroy(Instance.gameObject);
        Instance = null;
    }
}

使い方

GameObejct.Instantiate の部分を Scope に変更するだけ

行数は変わらないけど、気が向いたら使えるかも・・・

[SerializeField]
private GameObject _effect;
 
private void PlayEffect()
{
    using (var i = new InstanceScope(_effect))
    {
        // 再生待ち等の処理
        // i.GameObject.Hoge

    }
}