2017-07-13 23 views
0

私はコルーチンを持っています。N秒後にクリアテキストを返して元の形に戻します。問題はコルーチンが最初の復帰(wait for seconds)の後で決して続かないということです。コルーチンが終了するのを待つ

私はCoroutine仕上げの前にGameObjectを破壊してしまったので、私はそれを返すようにしました。しかし、私は混乱しています。私はスクリプトを通してコルーチンを開始しているので、ここで同じトリックを使うことはできません。初期化されていません。そのスクリプトは静的な機能しか持っていないので、私はコルーチンを起動します。ここに私のコードは次のとおりです。

void OnMouseDown() 
{ 
    bool safeDestroy = false; 

    IGatherable gather = CharacterCommands.character.GetComponent<IGatherable>(); 
    if(gather != null) 
    { 
     switch(itemID) 
     { 
     case 3: 
      Drops[] d = ChestDrop.GetItemFromDropStash(drops, gather, this); //Here is function that is starting function with coroutine PROBLEM 
      if(d.Length == 0) 
      { 
       safeDestroy = true; 
      } 
      else 
      { 
       drops = d; 
      } 
      break; 
     default: 
      if(ItemDatabase.GetItem(itemID).maxStackable < Inventory.GetCoins() + amount) 
      { 
       Parameters.centerText.text = "Not enough space in your bag!"; 
       safeDestroy = Parameters.clearText(Parameters.centerText, 3, this); //Coroutine i had same problem but done it this way. 
      } 
      else 
      { 
       gather.GatherItem(itemID, amount); 
       safeDestroy = true; 
      } 
      break; 
     } 
    } 
    if(safeDestroy) 
    { 
     Destroy(this.gameObject); 
    } 
} 

そしてここでは、関数そのものです:

public static Drops[] GetItemFromDropStash(Drops[] drops, IGatherable gather, MonoBehaviour justToStartCoroutine) 
{ 
    foreach(Drops drop in drops) 
    { 
     int r = UnityEngine.Random.Range(1, 101); 
     if(r < drop.chance) 
     { 
      if(ItemDatabase.GetItem(drop.itemID).maxStackable > Inventory.GetItemFromInventoryById(drop.itemID).amount + drop.amount) 
      { 
       Inventory.AddItemToInventory(drop.itemID, drop.amount); 
       Parameters.centerText.text = "+" + drop.amount + " " + ItemDatabase.GetItem(drop.itemID).itemName; 
       switch(ItemDatabase.GetItem(drop.itemID).itemRarity) 
       { 
       case ItemRarity.common: 
        Parameters.centerText.color = Color.gray; 
        break; 
       case ItemRarity.normal: 
        Parameters.centerText.color = new Color(80, 100, 255); 
        break; 
       case ItemRarity.rare: 
        Parameters.centerText.color = new Color(255, 80, 80); 
        break; 
       case ItemRarity.special: 
        Parameters.centerText.color = new Color(200, 0, 220); 
        break; 
       case ItemRarity.legacy: 
        Parameters.centerText.color = new Color(199, 224, 0); 
        break; 
       case ItemRarity.legendary: 
        Parameters.centerText.color = new Color(224, 169, 0); 
        break; 

       } 
       bool t = Parameters.clearText(Parameters.centerText, 3, justToStartCoroutine); 

       int i = Array.IndexOf(drops, drop); 
       List<Drops> tmp = new List<Drops>(drops); 
       tmp.RemoveAt(i); 
       drops = tmp.ToArray(); 
      } 
      else if (Inventory.CheckForFreeSpaceInInventory() == true) 
      { 
       Inventory.AddItemToInventoryToNewSlot(drop.itemID, drop.amount); 
       Parameters.centerText.text = "+" + drop.amount + " " + ItemDatabase.GetItem(drop.itemID).itemName; 
       switch(ItemDatabase.GetItem(drop.itemID).itemRarity) 
       { 
       case ItemRarity.common: 
        Parameters.centerText.color = Color.gray; 
        break; 
       case ItemRarity.normal: 
        Parameters.centerText.color = new Color(80, 100, 255); 
        break; 
       case ItemRarity.rare: 
        Parameters.centerText.color = new Color(255, 80, 80); 
        break; 
       case ItemRarity.special: 
        Parameters.centerText.color = new Color(200, 0, 220); 
        break; 
       case ItemRarity.legacy: 
        Parameters.centerText.color = new Color(199, 224, 0); 
        break; 
       case ItemRarity.legendary: 
        Parameters.centerText.color = new Color(224, 169, 0); 
        break; 

       } 
       bool t = Parameters.clearText(Parameters.centerText, 3, justToStartCoroutine); 

       int i = Array.IndexOf(drops, drop); 
       List<Drops> tmp = new List<Drops>(drops); 
       tmp.RemoveAt(i); 
       drops = tmp.ToArray(); 
      } 
      else 
      { 
       Parameters.centerText.text = "Not enough space in inventory!"; 
       bool t = Parameters.clearText(Parameters.centerText, 3, justToStartCoroutine); 
      } 
     } 
    } 
    return drops; 
} 

コルーチンが終了するまで、私の項目は(OnMouseDown()がどこにあるか)を破壊しないように、私は達成することができますどのように?

答えて

1

コルーチンが終了するまで待つ場合は、コルーチンも必要です。

はあなたの特定のシナリオに応じて、3つのオプションがあります。

  1. 移動し、最後の現在のyield後(既存のコルーチン方法に待つ必要があるコード が
    • ます。また、渡すことができます現在のコルーチンに委譲し、それをコールバックとして使用すると、既存のコルーチンのそれぞれを使用して独自のコールバックデリゲートを提供することができます。
  2. 現在の非コルーチンメソッドをコルーチンに変換します。
  3. 新しいコルーチンを作成し、既存のコルーチンの呼び出しを含む他のコルーチンが他のコルーチン上にあるのを待つ必要があるコードを変更します。
関連する問題