C# 销毁一个对象并在原始对象位置用预制件替换?

C# 销毁一个对象并在原始对象位置用预制件替换?,c#,unity3d,C#,Unity3d,绿色的球搜索白色的球并“感染”它们。白球被摧毁了,但它们在原点返回。我试着对白球的位置做一个变量,但我一直遇到“无法将变换转换为矢量3”的错误 这就是当前用于冲突的代码 我对团结也很陌生。我是否应该销毁白色的球,而不是以某种方式将它们变成绿色的球?可能吗 实例化似乎是唯一的方法。我所要做的就是将白色的“人类”球替换为绿色的“感染”球。因为您正在销毁当前对象,您的脚本将永远不会实例化新对象,因为它在有机会销毁之前就已被销毁 如果你按照这个顺序来做,并传递到物体的位置,它应该按照你的意愿来工作 编辑

绿色的球搜索白色的球并“感染”它们。白球被摧毁了,但它们在原点返回。我试着对白球的位置做一个变量,但我一直遇到“无法将变换转换为矢量3”的错误

这就是当前用于冲突的代码


我对团结也很陌生。我是否应该销毁白色的球,而不是以某种方式将它们变成绿色的球?可能吗

实例化似乎是唯一的方法。我所要做的就是将白色的“人类”球替换为绿色的“感染”球。

因为您正在销毁当前对象,您的脚本将永远不会实例化新对象,因为它在有机会销毁之前就已被销毁

如果你按照这个顺序来做,并传递到物体的位置,它应该按照你的意愿来工作

编辑:我刚刚了解到销毁实际上要等到当前的
Update()
帧完成后才能销毁对象。我将保留我的答案,因为我仍然认为最后调用
Destroy()
是一种更好的做法。

因为您正在销毁当前对象,您的脚本将永远不会实例化新对象,因为它在有机会创建之前就已被销毁

如果你按照这个顺序来做,并传递到物体的位置,它应该按照你的意愿来工作


编辑:我刚刚了解到销毁实际上要等到当前的
Update()
帧完成后才能销毁对象。我将保留我的答案,因为我仍然认为最后调用
Destroy()
是一种更好的做法。

您看到的错误可能是因为您使用的是
变换
对象,而不是它的
.position
。假设您的代码是白球游戏对象上的组件,请尝试以下操作:

public Rigidbody prefabInfection;

void OnCollisionEnter(Collision colInfo)
{
    if (colInfo.collider.tag == "Infection")
    {
        Destroy(gameObject);
        Instantiate(prefabInfection, transform.position, transform.rotation);
    }
}

通过将您的
transform.position
传递给实例化函数,新对象将在与您要销毁的对象相同的位置创建。希望这就是你想要的行为

您看到的错误可能是因为您使用的是
Transform
对象,而不是它的
.position
。假设您的代码是白球游戏对象上的组件,请尝试以下操作:

public Rigidbody prefabInfection;

void OnCollisionEnter(Collision colInfo)
{
    if (colInfo.collider.tag == "Infection")
    {
        Destroy(gameObject);
        Instantiate(prefabInfection, transform.position, transform.rotation);
    }
}

通过将您的
transform.position
传递给实例化函数,新对象将在与您要销毁的对象相同的位置创建。希望这就是你想要的行为

那不是真的;
Destroy
在帧结束之前不会真正发生(如果需要,请使用
destroimmediate
)——但没有位置传递。此外,实例化
刚体
字段不仅仅是实例化
刚体
——它只是意味着实例化的对象必须包含
刚体
组件。@DanPuzey我每天都在学习新东西!我在做OP过去所做的事情时遇到了一些问题,所以我想我的解决方案对他们来说是可行的;
Destroy
在帧结束之前不会真正发生(如果需要,请使用
destroimmediate
)——但没有位置传递。此外,实例化
刚体
字段不仅仅是实例化
刚体
——它只是意味着实例化的对象必须包含
刚体
组件。@DanPuzey我每天都在学习新东西!我在做OP过去所做的事情时遇到了问题,所以我认为我的修复方法对他们有效。这正是我想要的!非常感谢。这正是我要找的!非常感谢。“我是不是应该破坏白色的球,而不是以某种方式把它们变成绿色的球?这是可能的吗?”是的,你应该这样做。要么使用对象池的启用/禁用方法(如果您计划在将来用实际模型替换球,您需要这样做),要么关闭它们的共享材质“我是否应该销毁白色球,而不是以某种方式将它们变成绿色球?可能吗?”是的,您应该这样做。要么使用对象池的启用/禁用方法(如果您计划将来用实际模型替换球,则需要使用该方法),要么关闭它们的共享材质
public Rigidbody prefabInfection;

void OnCollisionEnter(Collision colInfo)
{
    if (colInfo.collider.tag == "Infection")
    {
        Destroy(gameObject);
        Instantiate(prefabInfection, transform.position, transform.rotation);
    }
}