読者です 読者をやめる 読者になる 読者になる

Unityな日々(Unity Geek)

Unityで可視化アプリを開発するための試行錯誤の覚書

コンポーネントが存在するかどうかを見る

GameObjectに対し、あるコンポーネントを持っているかを調べ、なければ足す(あるいは、処理を変える)場合の手順

例えば、あるGameObjectに対し、rigidbodyコンポーネントがなければ新たに加え、rigidbodyコンポーネントを返す例。

if(rigidbody == null){
	return transform.gameObject.AddComponent("Rigidbody") as Rigidbody;
}else{
	return rigidbody;
}

'rigidbody == null'は、rigidbodyコンポーネントがない場合に真となる。

Componentを足すだけなら、

GameObject.AddComponent("コンポーネント名")

でよいが、Componentを加えると同時に、そのコンポーネントを変数として取得する場合、
変数 = GameObject.AddComponent(”コンポーネント名”) as コンポーネント
のように一行で行える。
AddCompnent()の引数はComponent型のため、コンポーネントの型に応じたキャスト(上の例ではRigidbody)が必要。


カスタムクラス・コンポーネントの場合は、次のように書ける。

if(ball.GetComponent<Ball>()){
	//if Ball does not exist
	ballRB = ball.GetComponent<Ball>().getRB();
}else{
	ballRB = ball.rigidbody;
}

一行目は、

if(ball.GetComponent<Ball>() != null){

としてもよい。

                  • -

追記:2013/9/13

特定のコンポーネントなければ加える別な方法として、Runtime Attributeの[Require Component(typeOf(コンポーネント名))]
を使う手もある。エディター上で見えるので、必ず組にして使う必要があるコンポーネントならこの方法がわかりやすい。

using UnityEngine;
using System.Collections;
[RequireComponent (typeof (Rigidbody))]
public class Test : MonoBehaviour {
.........

とすれば、Scriptをアタッチした時点で、アタッチしたゲームオブジェクトがRigidbodyコンポーネントを持っていなければ自動的に加えられる。