Part.1はこちら
Part.2はこちら
Part.3この記事
Unity4.18f1を使っています。
Update()はスクリプトが有効時に呼ばれる
前回「用済みのGameObjectは速やかに消すこと」という結論に至ったが、生成の頻発はそれこそ大きな負荷になる。再利用することを想定したい場合はどうするのか?
そういった時、Update()はスクリプトが有効時に呼ばれる性質を利用する。
スクリプトが有効時とは、
〇アタッチしているGameObject.activeInHierarchyがtrue
〇スクリプトのBehaviour.enabledがtrue
の両方を満たしている状態。
この条件を崩しすことで、GameObjectを残したままUpdate()の呼び出しを止めることができる。次にこれらの条件の崩し方を見ていく。
GameObject.activeInHierarchy
GameObject自身のアクティブ状態はGameObject.activeSelfで確認する。
ただし、Hierarchy上では親が非アクティブ状態の時、子はその影響を受ける。
具体的に述べると「不可視」「Update()が機能しない」などだ。
親の状態を加味した、文字通りHierarchy上での動作を確認する場合GameObject.activeInHierarchyで取得できる。
スクリプトから変更をするには、
親のアクティブ状態か
自身のアクティブ状態を変更する必要がある。対象のGameObjectの、
public bool GameObject.SetActive(bool value);
を用いることになる。bool SetActive(bool)メソッドの引数にfalseを入れてやればそのGameObjectは非アクティブ状態になる。一方Inspector上では、
上記画像赤枠のチェックボックスがそれにあたる。チェックを消すことでそのGameObjectは非アクティブ状態になる。
Behaviour.enabled
BehaviourはMonoBehaviourの基底クラスだ。
MonoBehaviourはGameObjectのコンポーネントとしてアタッチさせるスクリプト自体が継承する。そしてenabledはそれが有効か無効かを判断する変数である。
つまりスクリプト(コンポーネント)のアクティブ状態だと考えて良い。
enabledをtrueにすると、スクリプトが有効になり更新され、
enabledをfalseにすると、スクリプトを無効にすることになる。
public bool enabledという定義の変数なので直接falseを代入してしまえば、そのスクリプトを非アクティブ状態にできる。一方Inspector上では、
上記画像赤枠のチェックボックスがそれにあたる。チェックを消すことでそのスクリプトは非アクティブ状態になる。
上述した手段をとることで不要なUpdate()が呼ばれることを防ぐことができる。
再利用したい場合は有効な手段だと思われる。
次回へ続く