试图将类的副本/克隆/重复项放在List中

时间:2017-01-04 14:41:58

标签: c# unity3d

我遇到了一个从MonoBehavior派生并附加到GameObject的类的问题。当这个GameObject(“射弹”)与某个东西碰撞时,组件“效果”应该被欺骗并存储在命中目标上的List()中。任务完成后,弹丸应该被摧毁。

当我运行这个时,我只在列表中看到“Missing(Effect)”。我想我只是在列表中分配一个引用,当抛射物被删除时,引用就会丢失。

Projectile GameObject将Effect和Projectile类作为附件:

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
        }
    }

目标GameObject将stats类作为附件:

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

效果必须来自MonoBehavior的继承者,因为它应该能够启动Coroutines并且我想改变它的值。

是否有可能在不将效果作为目标组件添加的情况下实现此目的?

EDIT1: Missing

1 个答案:

答案 0 :(得分:2)

  

效果必须来自MonoBehavior的继承者,因为它应该能够   启动Coroutines,我想改变它的价值。

     

是否有可能在不添加效果的情况下实现此目的   目标上的组件?

即可。您只需要从100%确定不会销毁的任何脚本中引用任何 MonoBehaviour。我说这是因为如果它们被破坏,那么协程可能会停止运行。

在这个示例中,我将从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的情况下启动协程。