【问题标题】:Destroy an object and replace with a prefab at original objects location?销毁一个对象并用原始对象位置的预制件替换?
【发布时间】:2018-05-26 02:37:43
【问题描述】:

绿球寻找白球并“感染”它们。白球被破坏了,但它们又回到了原点。我试图对白球的位置进行变量,但我一直遇到“无法将转换转换为 Vector3”错误。

public Rigidbody prefabInfection;
public Transform infectLocation;

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

这是当前用于碰撞的代码。

我也是 Unity 的新手。我不应该破坏白球而是以某种方式将它们变成绿球吗?这可能吗?

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

【问题讨论】:

标签: c# unity3d


【解决方案1】:

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

public Rigidbody prefabInfection;

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

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

【讨论】:

  • 这正是我想要的!谢谢!
【解决方案2】:

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

Instantiate(prefabInfection, gameObject.transform.position);
Destroy(gameObject);

如果您按此顺序执行此操作,并传入对象的位置,它应该会按照您的预期工作。

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

【讨论】:

  • 这不是真的; Destroy 直到帧结束才会真正发生(如果您需要,请使用 DestroyImmediate) - 但是没有位置通过。此外,实例化 RigidBody 字段不只是实例化 RigidBody - 它只是意味着实例化对象必须包含 RigidBody 组件。
  • @DanPuzey 我每天都在学习新东西!我在做 OP 过去所做的事情时遇到了问题,所以我认为我的修复对他们有用。
猜你喜欢
  • 2014-08-27
  • 1970-01-01
  • 2020-09-12
  • 1970-01-01
  • 2017-06-29
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多