2013年9月11日水曜日

オブジェクトを停止し非表示(非アクティブ)にする方法 SetActive()を使用

一時的にオブジェクトを見えなくするためにはRendererをenableにすれば可能です。

gameobject.renderer.enabled = false; 

しかしAIで動いている敵のステータスをそのままに一時的に消したい場面などではRendererをenableにしただけでは見えない敵が動いてしまいます。

なのでスクリプトも一時停止したければSetActive()を使います。
オブジェクトが階層化されている時、階層下のオブジェクトも含めて無効にしてくれます。

gameObject.SetActiveRecursively(false);


これでOKです


赤く囲んだチェックボタンが消えていれば非アクティブになっています。


このようにすれば画面に表示されることなくスクリプトもコンポーネントもまとめて停止できます。

しかし非アクティブからアクティブにしようと

gameObject.SetActiveRecursively(true);

と同じスクリプトに書き足しても停止してしまっているので他のゲームオブジェクトからアクティブにしてあげる必要があります。
しかも非アクティブにしてしまうとFindでのサーチができなくなります。
なのであらかじめキャッシュしておく必要があります。

private var obj1:GameObject;
private var obj2:GameObject;

function Start ()
{
    obj1 = GameObject.FindWithTag("Player");
    obj2 = GameObject.Find("Enemy");
 
    obj1.gameObject.SetActive(false);
    obj2.gameObject.SetActive(false);
}
function Update () {
 if (Input.GetButtonDown ("Fire1")){
     obj1.gameObject.SetActive(true);
    obj2.gameObject.SetActive(true);

}}
私はこうしました。ボタンを押せばアクティブになります。

しかし非アクティブからアクティブにしたときにStart関数は再び実行されることはありません!

なのでStart関数のループでAIを書いている方は要注意です。






0 件のコメント: