我遇到了一个从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
答案 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
的情况下启动协程。