2017-04-26 17 views
1

私のコード呼び出されません。Invoke()が動作しない理由を呼び出しは()

public class Enemy : MonoBehaviour 
{ 
    public GameObject deathEffect; 
    public float health = 4f; 
    public static int EnemiesAlive = 0; 
    public int loadToScene; 

    void Start() 
    { 
     EnemiesAlive++; 
    } 

    void OnCollisionEnter2D (Collision2D colInfo) 
    { 
     if (colInfo.relativeVelocity.magnitude > health) 
     { 
      Die(); 
     } 
    } 

    void Die() 
    { 
     Instantiate(deathEffect, transform.position, Quaternion.identity); 
     EnemiesAlive--; 

     if (EnemiesAlive <= 0) 
     { 
      Debug.Log ("LEVEL WON!"); 
      Invoke("ChangeScene",2f); 
     } 
     Destroy(gameObject); 
    } 

    void ChangeScene() 
    { 
     Debug.Log ("Hello"); 
     loadToScene = 1; 
     SceneManager.LoadScene (loadToScene); 
    } 
} 

誰も私を指摘することはできますか? (EnemiesAlive <= 0)という条件が満たされたら、シーンを変更する前に2秒の遅延を加えたいと思っていました。 Debug.Log ("Hello");が出力されていないときにDebug.Log ("LEVEL WON!");が出力されます。私もStartCoroutineを使うことができると知っていますが、代わりにInvoke()を使いたかったのです。

答えて

1

これは、上記のm.rogalskiのようなDestroy(gameObject)を呼び出しており、Invoke("ChangeScene",2f);を実行する可能性がないためです。

しかし、私はあなたがそのスクリプト内のもの(例えばOnCollisionEnter2D)を実行を停止したいが同時にその場面をロードしたいので、待たずにそのオブジェクトをすぐに破壊したいという気持ちがあります。

これが事実であるなら、あなたは別のゲームオブジェクトに添付別のスクリプトローディング機能を配置する必要があります。 Destroy(gameObject)に電話すると、このスクリプトは破棄されません。

"SceneLdObj"という新しいゲームオブジェクトを作成します。

以下のスクリプトを「SceneLdObj」GameObjectに添付してください。

public class SceneLoader : MonoBehaviour 
{ 
    int loadToScene = 1; 
    public void ChangeScene(int sceneLevel) 
    { 
     loadToScene = sceneLevel; 
     Invoke("loadScene", 2f); 
    } 

    private void loadScene() 
    { 
     SceneManager.LoadScene(loadToScene); 
    } 
} 

は、あなたの質問内のスクリプトに以下のスクリプトを追加します。

SceneLoader sceneLoader; 

void Start() 
{ 
    sceneLoader = GameObject.Find("SceneLdObj").GetComponent<SceneLoader>(); 
} 

さて、あなたはあなたのダイ関数からのロード機能することができ、それはまだゲームオブジェクトがすでに破棄されていても動作します。

void Die() 
{ 
    Instantiate(deathEffect, transform.position, Quaternion.identity); 
    EnemiesAlive--; 

    if (EnemiesAlive <= 0) 
    { 
     Debug.Log("LEVEL WON!"); 
     //Call that function from another script 
     sceneLoader.ChangeScene(1); 
    } 
    Destroy(gameObject); 
} 

EDIT

これはあなたの新しいEnemyスクリプトでなければなりません:私は(この)デストロイ{ `他を追加します

public class Enemy : MonoBehaviour 
{ 
    public GameObject deathEffect; 
    public float health = 4f; 
    public static int EnemiesAlive = 0; 
    public int loadToScene; 
    SceneLoader sceneLoader; 

    void Start() 
    { 
     sceneLoader = GameObject.Find("SceneLdObj").GetComponent<SceneLoader>(); 
     EnemiesAlive++; 
    } 

    void OnCollisionEnter2D (Collision2D colInfo) 
    { 
     if (colInfo.relativeVelocity.magnitude > health) 
     { 
      Die(); 
     } 
    } 

    void Die() 
    { 
     Instantiate(deathEffect, transform.position, Quaternion.identity); 
     EnemiesAlive--; 

     if (EnemiesAlive <= 0) 
     { 
      Debug.Log ("LEVEL WON!"); 
      //Call that function from another script 
      sceneLoader.ChangeScene(1); 
     } 
     Destroy(gameObject); 
    } 

    void ChangeScene() 
    { 
     Debug.Log ("Hello"); 
     loadToScene = 1; 
     SceneManager.LoadScene (loadToScene); 
    } 
} 
+0

私の意図を正しく予測していただきありがとうございます。以前は言及していなかった。私は正常にあなたのステップを "下のスクリプトを追加..."に従ってきましたが、自分のコードにあなたの与えられたコードを追加する方法についてはわかりません。私は試して、SceneLoaderでエラーを取得します。 SceneLoaderを先に宣言する必要はありますか?私はそれをどのようなタイプで宣言すべきですか? – jer

+0

@jer命令の最後の部分を 'Enemy'スクリプトに直接変更しました。ちょうどそれをコピーする。あなたが 'SceneLoader'スクリプトを作成し、*" SceneLdObj "*と呼ばれる新しいGameObjectにそれを添付する限り、これはうまくいくはずです。 – Programmer

+0

私は最近stackoverflow.comを使用しています。私は受け入れなければならないか分からない。ごめんなさい。ヘッドアップをありがとう。 :) – jer

2

実際にはInvokeが呼び出されていますが、呼び出されたメソッドが実行される前にオブジェクトが破棄されるという問題があります。 (1秒後のオブジェクトを破壊する)Destroy(gameObject, 1.0f):オプションのオブジェクトがDestroyメソッドのオーバーロードを使用して破壊されるまでの時間を指定することができ

void Die() 
{ 
    Instantiate(deathEffect, transform.position, Quaternion.identity); 
    EnemiesAlive--; 

    if (EnemiesAlive <= 0) 
    { 
     Debug.Log ("LEVEL WON!"); 
     Invoke("ChangeScene",2f); 
    } 
} 

void ChangeScene() 
{ 
    Debug.Log ("Hello"); 
    loadToScene = 1; 
    Destroy(gameObject); 
    SceneManager.LoadScene (loadToScene); 
} 

:、それを修正ChangeScene方法Destroy(gameObject)を移動する

+1

。 } 'も同様です。 – Draco18s