0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Unity】特定のオブジェクト群に一括処理する

Posted at

概要

現在作成しているゲームで、特定のオブジェクト群(今回はカットした豆腐)に対して一斉にkinematicをfalseにしたかったのだが、やり方がわからんかったのでGPT君に聞いてみるといろんな種類があることを知った。それの記録。
元の設定として、カットした豆腐には「Sliceable」のレイヤーを付与していた。

方法1:全オブジェクト検索+ifでレイヤー処理

GameObject[] allObjects = GameObject.FindObjectsByType<GameObject>(FindObjectsSortMode.None);
foreach (GameObject obj in allObjects)
{
    if (obj.layer == LayerMask.NameToLayer("Sliceable"))
    {
        // 対象オブジェクトに処理
    }
}

レイヤーに対してはこの処理が有効。ただしscene内のオブジェクトを全取得するから無駄が多い。

方法2:Tagで検索

GameObject[] sliceables = GameObject.FindGameObjectsWithTag("Sliceable");
foreach (GameObject obj in sliceables)
{
    // 処理
}

このやり方が一番シンプルで使うべきやつっぽい。ただし、タグを複数つけられない制限から既に何かタグを使ってると処理できない。

方法3:Sliceableスクリプト(マーカー)をつけて FindObjectsOfType() で取得

以下の空スクリプトを作成して、オブジェクトにつけとく。これには何も関数等なくてOK。

// 空のスクリプト
public class Sliceable : MonoBehaviour {}

んで処理を書く

Sliceable[] sliceableObjs = GameObject.FindObjectsOfType<Sliceable>();
foreach (var s in sliceableObjs)
{
    GameObject obj = s.gameObject;
    // 処理
}

コンポーネントでフィルタリングする方法もあるらしい、かしこい

まとめ

処理速度等はわからんが基本は2を使ってりゃよさそう。
複数にまたがるタグつけたいときは3の方法使ってんのかなぁみんなも、わからん。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?