2017-01-04 8 views
3

MonoBehaviorから派生し、GameObjectに関連付けられているクラスに問題があります。このGameObject( "発射物")が何かに衝突すると、コンポーネント "Effect"は捨てられ、ヒットしたターゲットの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からの相続を有しますCoroutinesを開始することができると私はそれの値を変更したい。

ターゲットにコンポーネントとしてエフェクトを追加せずにこれを達成する可能性はありますか?

EDIT1:コルーチンを開始する ことができるはずと私はそれが値をです変更したいので Missing

+0

はい、可能です。 * "効果はMonoBehaviorからの継承者にあります。なぜなら、それはCoroutinesを開始することができ、その値を変更したいからです" *あなたは、コルーチン部分を含めることができますか? – Programmer

+1

発射の効果は何ですか?それはプレファブリファレンスですか?それは子供ですか?またはプール内のような多くの他のエフェクトの中の1つのオブジェクト? – Bijan

+0

@Programmerコルーチン部分を追加しました。 –

答えて

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から継承しない場合、変数はエディタに表示されません。これはトレードオフの1つですが、それが唯一の問題であれば価値があります。 – Programmer

+1

Effectable.csをScriptableObjectから継承し、Stats.csでコルーチンを開始しました。どうもありがとう! –

関連する問題