C# 试图将类的副本/克隆/复制放入列表中
我对一个从MonoBehavior派生并附加到游戏对象的类有一个问题。当此游戏对象(“投射物”)与某物碰撞时,组件“效果”应被复制并存储在命中目标的列表()中。任务完成后,应销毁射弹 当我运行此命令时,我在列表中只看到“缺少(效果)”。我猜我只在列表中分配了一个引用,当射弹被删除时,引用就丢失了 投射物游戏对象的效果和投射物类作为附加组件:C# 试图将类的副本/克隆/复制放入列表中,c#,unity3d,C#,Unity3d,我对一个从MonoBehavior派生并附加到游戏对象的类有一个问题。当此游戏对象(“投射物”)与某物碰撞时,组件“效果”应被复制并存储在命中目标的列表()中。任务完成后,应销毁射弹 当我运行此命令时,我在列表中只看到“缺少(效果)”。我猜我只在列表中分配了一个引用,当射弹被删除时,引用就丢失了 投射物游戏对象的效果和投射物类作为附加组件: public class Effect : MonoBehaviour { public float dps = 2f; public fl
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;
}
公共类效应:单一行为{
公共浮动dps=2f;
公共浮动持续时间=2f;
公共运营延迟=0.1f;
公共布尔冻结=假;
void Start(){
开始例行程序(“损坏健康例行程序”);
}
IEnumerator损坏健康线路(){
int goalCount=(int)(持续时间/运行延迟);
浮动部分损坏=dps*操作延迟;
for(int i=0;i0)
统计:承受伤害(部分伤害);
否则如果(dps<0)
统计数据。GetHeal(部分损坏);
产生返回新WaitForSeconds(操作延迟);
}
}
}
公共类射弹:单一行为{
公共效应;
私人空间{
effect=GetComponent();//不为空
}
公共无效命中对象(游戏对象go){
go.GetComponent().effects.Add(effect);
//在不销毁的情况下,将相应地分配列表条目。
摧毁(这个游戏对象);
//在摧毁射弹时失踪
}
}
目标游戏对象将stats类作为组件附加:
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的继承者是有影响的,因为它应该能够启动协同程序,我想改变它的值
是否有可能在不将效果作为一个组件添加到目标上的情况下实现这一点
编辑1:
对MonoBehavior的继承者的影响是有限的,因为它应该能够
启动协同程序,我想改变它的值
是否有可能在不增加效果的情况下实现这一点
目标上的组件
是。您只需从您100%确信不会被销毁的任何脚本中引用anymonobhavior
。我这样说是因为如果它们被破坏,协同程序可能会停止运行
在本例中,我将从Stats
脚本中获取引用,但您可以从任何脚本中获取它
新建Stats
script脚本:
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 Effect=neweffect()
,它将在不使用monobhavior的情况下启动协同程序
是的,这是可能的。“对于MonoBehavior的继承者来说,效果是必须的,因为它应该能够启动协同程序,并且我想改变它的值。”你能包括协同程序部分吗?投射物中的效果是什么?它是一个预制引用吗?是个孩子吗?或者一个对象在许多其他效果中,比如在一个池中?你正在摧毁游戏对象,所以它的所有组件都被摧毁。这就是为什么它丢失了为什么不创建一个单独的游戏对象来实现效果?它一定是射弹的兄弟吗?@Vala.D。这将是另一个问题,它的解决方案是对象池!但现在我无法在inspector中更改效果的dps。如果脚本没有从MonoBehavior继承,那么变量将不会出现在编辑器中。这是一个折衷方案,但如果这是唯一的问题的话,这是值得的。Made Effect.cs继承自ScriptableObject,并在Stats.cs上启动协同程序现在一切都像一个符咒一样工作。谢谢!