Unity – 細かく「Update」Part.3

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()が呼ばれることを防ぐことができる。
再利用したい場合は有効な手段だと思われる。

次回へ続く

カテゴリーetc

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です