2016-07-23 8 views
1

私は記事10000 UPDATE() CALLSを読んだ。 AuthorはUpdateManagerを使用します。それはオブジェクトの他の全てのMonBehavioursでUpdateメソッドを呼び出すUpdateメソッドを持っています。それぞれのMonoBehaviourから別々にUpdateメソッドを呼び出すよりも速く動作します。シーンのMonoBehavioursをリストに追加するにはどうすればいいですか?

このマネージャーは、次のようになります。

private ManagedUpdateBehavior[] list; 

private void Start() { 
    list = GetComponents<ManagedUpdateBehavior>(); 
} 

private void Update() { 
    var count = list.Length; 
    for (var i = 0; i < count; i++) { 
     // UpdateMe 
     list[i].UpdateMe(); 
    } 
} 

、すべてのオブジェクトは現在のコードでコンポーネントが含まれています

public class ManagedUpdateBehavior : MonoBehaviour { 
    // some variables 

    public void UpdateMe() { 
     // some logic 
    } 
} 

5-6-7-8-オブジェクトは、そのコンポーネントを持っていることになる場合、それは大丈夫です。

しかし、100個のオブジェクトがある場合はどうなりますか? 1000? 10000?

シーンのすべてのオブジェクトからすべてManagedUpdateBehaviorsを見つけて追加するにはどうすればよいですか? On Startで再帰的メソッドを使用する必要がありますか?すべてのオブジェクトにスクリプトを含む他のオブジェクトが含まれている可能性があります。他のオブジェクトなどが含まれている可能性があります...無制限の入れ子

また、一部のオブジェクトは動的にインスタンス化できます...マネージャにモノを追加するには?正しい方法は何ですか?

+0

管理対象のモノオブジェクトの静的リストを作成し、各モノオブジェクトの 'Start()'関数でそれをそのリストに追加し、マネージャのリストから読み込むことができます。 –

+0

@ YotamSalmon Neee。私はそれが良い考えだとは思わない。 Monobehavioursを50..100持っているとどうなりますか?各スクリプトに手動でコードを追加しますか?私の心が変わるとどうなりますか?手動で削除しますか?私の考えを変えるのか?))それは生産的ではありません....... 'java 8'は、デフォルトのメソッドを(実装で)含むことができるインターフェースを持っています。それはより正しいでしょう、私は –

答えて

1

また、いくつかのオブジェクトは、各ManagedUpdateBehaviorManagedUpdateBehaviorインスタンスにそのインスタンスを追加することによって、ManagedUpdateBehaviorリストに参加してみましょう動的

インスタンス化することができます。また、ManagedUpdateBehaviorインスタンスから自身を削除して破棄した場合は、ManagedUpdateBehaviorから退会する必要があります。

新しいManagedUpdateBehaviorスクリプト:

public class ManagedUpdateBehavior : MonoBehaviour 
{ 
    UpdateSubscriber updateSUBSCR; 

    //Add it self to the List 
    void Start() 
    { 
     updateSUBSCR = GameObject.Find("UpdateSUBSCR").GetComponent<UpdateSubscriber>(); 
     updateSUBSCR.addManagedUpdateBehavior(this); 
    } 

    //Remove it self from the List 
    void OnDestroy() 
    { 
     updateSUBSCR.removeManagedUpdateBehavior(this); 
    } 

    public void UpdateMe() 
    { 
     // some logic 
     Debug.Log("Update from: " + gameObject.name); 
    } 
} 

はゲームオブジェクトを作成しますがUpdateSUBSCRと呼ばれ、それに以下のスクリプトを添付:

public class UpdateSubscriber : MonoBehaviour 
{ 
    private List<ManagedUpdateBehavior> managedUpdateBehavior = new List<ManagedUpdateBehavior>(); 


    public void addManagedUpdateBehavior(ManagedUpdateBehavior managedUB) 
    { 
     managedUpdateBehavior.Add(managedUB); 
    } 

    public void removeManagedUpdateBehavior(ManagedUpdateBehavior managedUB) 
    { 
     for (int i = 0; i < managedUpdateBehavior.Count; i++) 
     { 
      if (managedUpdateBehavior[i] == managedUB) 
      { 
       managedUpdateBehavior.RemoveAt(i); 
       break; 
      } 
     } 
    } 

    /* 
    public List<ManagedUpdateBehavior> getManagedUpdateBehaviorinstance 
    { 
     get 
     { 
      return managedUpdateBehavior; 
     } 
    }*/ 

    public void updateAll() 
    { 
     for (int i = 0; i < managedUpdateBehavior.Count; i++) 
     { 
      managedUpdateBehavior[i].UpdateMe(); 
     } 
    } 
} 

その後、あなたがそれを呼び出すことができます。

public class Test : MonoBehaviour 
{ 
    UpdateSubscriber updateSUBSCR; 

    void Start() 
    { 
     updateSUBSCR = GameObject.Find("UpdateSUBSCR").GetComponent<UpdateSubscriber>(); 
    } 

    void Update() 
    { 
     updateSUBSCR.callUpdateFuncs(); 
    } 
} 

配列が012より速いことに注意してくださいですが、これはすべてのスクリプトでUpdate()の機能を持つよりも優れています。

+0

だと思います、そうするための正しい方法は、このコードを手動でMonobhaviourに追加するよりもありませんか? : '(つまり、もし私が50..100のMonobehavioursを持っていて、私の心が変わったら、どこからでも手動で 'Start'、' OnDestroy'、 'UpdateSubscriber updateSUBSCR')コードを取り除くのですか? もう何もありませんこのロジックをオブジェクトに追加する汎用的な方法は?例えば、シーン上で何かがインスタンス化されているかどうかを監視し、そのモノをリストに追加するグローバルスクリプトを使用する場合 Javaの8つのインタフェースこれは唯一の方法ですか?難しいですが右: –

+0

@AlexeyShimansky私はあなたが言っていることを本当に理解していません。あなたは手動で何もしません**。すべてのGameObjectはインスタンス化されると自動的にそれを追加し、破壊されるとそれ自身を削除します。あなたがしなければならないことは、 'ManagedUpdateBehavior'を各ゲームオブジェクトまたはあなたのプレハブに添付することだけです。 UpdateSUBSCRという1つのゲームオブジェクトを作成し、 'UpdateSUBSCR'スクリプトをそれに添付します。 – Programmer

+0

実際に 'Update'関数を呼び出すには、上記の' Test'スクリプトのコードをあなたのメインゲームコードに入れなければなりません。メインゲームコードは、 'updateSUBSCR.callUpdateFuncs();'を呼び出すだけで、他のスクリプトからすべてのUpdate関数を自動的に呼び出します。 – Programmer

1

すべてのManagedUpdateBehavioursは、Object.FindObjectsOfTypeメソッドを使用して検索して追加できます。

オブジェクトを動的にインスタンス化するには、作成したゲームオブジェクトから呼び出されてリストに追加できる静的メソッドを使用します。

私の提案は、このようSceneUpdateManager、何かを作成されます。

using UnityEngine; 
using System.Collections.Generic; 
using System.Linq; 

public class SceneUpdateManager : MonoBehaviour { 

    private static List<ManagedUpdateBehavior> list; 

    private void Start() 
    { 
     list = Object.FindObjectsOfType<ManagedUpdateBehavior>().ToList(); 
    } 

    public static void AddBehavior(ManagedUpdateBehavior behaviour) 
    { 
     list.Add (behaviour); 
    } 

    private void Update() { 
     var count = list.Count; 

     for (var i = 0; i < count; i++) 
     { 
      list [i].UpdateMe(); 
     } 
    } 
} 

Object.FindObjectsOfTypeが非アクティブのオブジェクトを返しません。