2017-01-09 8 views
1

私は学校プロジェクトをやっています。私はシーンが始まるとすぐに、シーン内の破壊されたオブジェクトをチェックする必要があります。問題は、私はどのようにロードするか、どこにC#スクリプトを添付するか分からないということです。シーンの開始時にC#スクリプトを1つに実行する方法

public static class DestroyedObject { 

    static List<GameObject> objs = new List<GameObject>(); 
    public static void Add(GameObject obj) 
    { 
     if(!objs.Contains(obj)) 
      objs.Add(obj); 
    } 
} 
+2

シーンの開始時にオブジェクトが破壊されていますか?シーンが始まる前に何かを作成して破壊するのはなぜですか? –

+0

その隠されたオブジェクトのゲームは、発見されたオブジェクトは、あなたが別のシーンに移動すると、破壊されたままにする必要があるオブジェクトがある前のシーンthatsに戻ってくることができます移動 –

+0

あなたは厳密にコピー貼り付け、 m-rogalskiは[あなたの前の質問](http://stackoverflow.com/questions/41547533/how-to-pass-the-destroyed-state-of-an-object-in-unity)であなたを提供しました:多分あなたは新しい質問を開始するのではなく、単に彼に尋ねました。 – Kardux

答えて

3

シーンを開始するときに実行する場合は、GameObjectにアタッチする必要があります。空を作成し、コンポーネントとして添付します。

開始時に実行するコードは、 void Awake {//Your code here} またはvoid Start{//Your code here}の機能にする必要があります。

Startは、クラスがインスタンス化されるとすぐに呼び出され、シーンの開始時にAwakeが呼び出されます。あなたがコールスタックでそれをどこにしたいかによって異なりますが、あなたの場合、私はそれが本質的に同じことをすると思います。

+0

あなたの答えがこの点についてはっきりしているかどうかは分かりませんので、ここで強調したいと思います。シーンのすべての 'Awake()'メソッドは、 () 'メソッドを呼び出します。'Awake()'はクラスがインスタンス化された瞬間であり(アクティブなGameObject上でスクリプトが無効になっている場合に起こります)、 'Start()'はアクティブなGameObject上でスクリプトが有効になって初めて認識されます。 Unityの実行順序を理解するには、[this](https://docs.unity3d.com/Manual/ExecutionOrder.html)をチェックしてください。 – Kardux

+0

どうすればいいですか? –

+2

シーンにスクリプトを添付してGameObjectを配置し、シーンを実行すると、 'Start()'メソッドで記述したコードがすべて実行されます。 –

1

オブジェクトが削除されたことを「保存」する方法は、MonoBehaviourから継承し、スクリプトを含むオブジェクトがシーン間に存在するようにDontDestroyOnLoad()にコールするだけです。

public static class DestroyedObject : MonoBehaviour 
{ 
    public static DestroyedObject Instance; 
    private static List<GameObject> objs = new List<GameObject>(); 

    private void Awake() 
    { 
     if (!Instance) 
     { 
      Instance = this; 
     } 
     else 
     { 
      DestroyImmediate(gameObject); 
     } 

     DontDestroyOnLoad(gameObject); 
    } 

    public static void Add(GameObject obj) 
    { 
     if(!objs.Contains(obj)) 
      objs.Add(obj); 
    } 

    public static List<GameObject> GetDestroyedObjects() 
    { 
     return objs; 
    } 
} 

は、その後、あなたは単純に(何人かの人々はデザインパターンのこの種のが好きではありませんが、それはユニティを使用するときに非常に効果的であることが証明されている)DestroyedObject.Instance.Add()またはDestroyedObject.Instance.GetDestroyedObjects()を使用してスクリプトにアクセスします。

また@Sergeyが尋ねたように、後でオブジェクトを削除するために(シーンロード時に)オブジェクトを作成する理由:逆の操作(必要なインスタンスのインスタンス化のみ)を行うことができます。このことができます

希望は、

0

あなたは合計で達成しようとしているかを説明することはできますか?あなたの道のように見えるので、それを行う最善の方法ではありません;)。

シーン開始時にスクリプトを実行する方法は、MonoBehaviour(静的クラスは不要)から継承したスクリプトを作成し、シーン内のゲームオブジェクトにアタッチしてください。

シーンが開始され、ゲームオブジェクトがロードされるとすぐにコードを実行する場合は、コードをAwake()またはStart()に配置します。これらの関数の実行順序は次のとおりです。https://docs.unity3d.com/Manual/ExecutionOrder.html

スクリプトを静的にすると、すべてのシーンでアクティブになり、シーンがロードされる前でもアクティブになります。

また、本当に必要な場合を除き、私は静的なクラスの使用をお勧めしません。

+0

@Alexと私がすでに言ったものの種類:) – Kardux

+1

ええ、私はコメントしていましたが、私はできません。それにもかかわらず、アレックスがStartとAwakeについて語ったことは完全に真実ではなく、私は静的なクラスを使うのがこの場合の最良の解決法だとは思わない(避けることができるので)。 –

関連する問題