2017-01-04 54 views
3

我有一個從MonoBehavior派生並附加到一個遊戲對象的類的問題。當這個GameObject(「彈丸」)與某物發生碰撞時,組件「效果」應該被僞裝並存儲在被擊中目標上的List()中。在任務完成後,射彈應該被銷燬。試圖把一個類的副本/克隆/重複的列表中

當我運行這個,我只在列表中看到「缺少(效果)」。我想我只是給列表分配一個參考,當拋射物被刪除時,參考文獻就會丟失。

彈丸遊戲物體具有的影響和彈丸類作爲連接組件的:

public class Effect : MonoBehaviour { 
    public float dps = 2f; 
    public float duration = 2f; 
    public operatingDelay = 0.1f; 
    public bool freezing = false; 

    void Start(){ 
     StartCoroutine("DamageHealRoutine"); 
    } 

    IEnumerator DamageHealRoutine() { 
     int goalCount = (int)(duration/operatingDelay); 
     float partialDamage = dps * operatingDelay; 
     for (int i = 0; i < goalCount; i++) { 
      if (dps > 0) 
       stats.TakeDamage(partialDamage); 
      else if (dps < 0) 
       stats.GetHeal(partialDamage); 
      yield return new WaitForSeconds(operatingDelay); 
     } 

    } 
} 

public class Projectile : MonoBehaviour { 
    public Effect effect; 

    private void Awake() { 
     effect = GetComponent<Effect>(); // not null 
    } 

    public void hittedSomething(GameObject go) { 
     go.GetComponent<Stats>().effects.Add(effect); 
     // Without destroying, the List entry is assinged accordingly. 
     Destroy(this.gameObject); 
     //Became Missing when destroying the Projectile 
     } 
    } 

目標遊戲對象具有作爲組分附着在統計類:

public class Stats : MonoBehaviour { 
    public List<Effect> effects; 
} 

影響必須從MonoBehavior一個繼承者,因爲它應該能夠啓動協程,我想改變它的值。

如果不在目標上添加效果作爲組件,是否有可能實現此目的?

EDIT1: Missing

+0

是的,這是可能的。 *「效果必須是來自MonoBehavior的繼承者,因爲它應該能夠啓動協同程序,並且我想修改它的值」*您可以包含協程部分嗎? – Programmer

+1

射彈有什麼效果?這是一個預製參考?這是一個孩子嗎?或者像游泳池中的其他效果中的一個對象? – Bijan

+0

@編程器添加了協程部分。 –

回答

2

效果從MonoBehavior一個繼承者,因爲它應該能夠 啓動協同程序,我想改變它的值。

如果不在目標上添加效果作爲 組件,是否有可能實現此目的?

。你只需要從任何腳本中獲得的任何MonoBehaviour的引用,你可以100%確定不會被銷燬。我這樣說是因爲如果它們被破壞,協程可能會停止運行。

在這個例子中,我將從Stats腳本中獲得參考,但是您可以從您希望的任何腳本中獲得該腳本。

Stats腳本腳本:

public class Stats : MonoBehaviour 
{ 

    public List<Effect> effects; 
    private MonoBehaviour mono; 

    public MonoBehaviour monoRef 
    { 
     get 
     { 
      return mono; 
     } 
    } 


    // Use this for initialization 
    void Awake() 
    { 
     mono = this; 
    } 
} 

Effect腳本。無MonoBehaviour要求:

public class Effect 
{ 

    public float dps = 2f; 
    public float duration = 2f; 
    public operatingDelay = 0.1f; 
    public bool freezing = false; 

    MonoBehaviour coroutineMono; 

    public Effect() 
    { 

     coroutineMono = GameObject.Find("StatsObj").GetComponent<Stats>().monoRef; 
     coroutineMono.StartCoroutine("DamageHealRoutine"); 
    } 

    IEnumerator DamageHealRoutine() 
    { 
     int goalCount = (int)(duration/operatingDelay); 
     float partialDamage = dps * operatingDelay; 
     for (int i = 0; i < goalCount; i++) 
     { 
      if (dps > 0) 
       stats.TakeDamage(partialDamage); 
      else if (dps < 0) 
       stats.GetHeal(partialDamage); 
      yield return new WaitForSeconds(operatingDelay); 
     } 
    } 
} 

您現在應該使用Effect effect = new Effect(),它會啓動協程沒有MonoBehaviour

+0

非常感謝!但是現在我無法在巡視員中改變效果上的DPS。 –

+1

如果腳本不從MonoBehaviour繼承,則變量將不會出現在編輯器中。這是一種折衷,但如果這是唯一的問題,這是值得的。 – Programmer

+1

使Effect.cs從ScriptableObject繼承,並啓動Stats.cs上的協同程序,現在一切正常,就像魅力一樣。非常感謝! –