概要
現在作成しているゲームで、特定のオブジェクト群(今回はカットした豆腐)に対して一斉に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の方法使ってんのかなぁみんなも、わからん。