# 用布娃娃或残骸替换角色

> Swap an intact GameObject for an instantiated destroyed prefab to switch an object to a wrecked state.

在游戏中，您可能需要将角色、车辆、建筑物等资产从“完好无损”状态切换到“损毁”状态。与其修改完好无损的游戏对象（例如移除脚本、添加刚体组件等），不如直接删除原始游戏对象，并用一个损毁状态的预制体来替换它。这种方式通常更快速且更有效。

这样可以提供很大的灵活性。您可以为损毁版本使用不同的材质；可以附加完全不同的脚本；甚至可以实例化一个预制体，其中包含多个被物理系统控制的碎片，以模拟破碎或损毁的状态。所有这些效果都可以通过一次调用 `Instantiate` 实现，将损毁版本引入场景，同时删除原始游戏对象。

最重要的是，您可以通过与原始游戏对象完全不同的游戏对象来创建损毁版本，并通过 `Instantiate` 方法实例化它。例如，要创建一个可破坏的机器人，您需要制作两个版本：一个版本由单个游戏对象组成，包含网格渲染器和控制机器人移动的脚本。另一个版本由多个骨骼部件组成，这些部件可以通过物理系统单独控制。

使用单个游戏对象的模型时，游戏运行速度更快，因为该模型包含的三角形更少，渲染速度也更快。此外，当机器人正常行走时，没有必要将其拆分为多个部件。

## 无代码构建损毁机器人预制体

要无代码构建一个损毁机器人预制体，请按照以下步骤操作：

1. 在您常用的 3D 建模软件中，为机器人建模，使其包含多个不同的骨骼部件，然后将模型导出到 Unity 项目的 Assets 文件夹中。

2. 在 Unity 编辑器中创建一个空场景。

3. 将模型从**项目 (Project)** 窗口拖入空场景中。

4. 选中所有部件，然后选择**组件 (Component) > 物理 (Physics) > 刚体 (Rigidbody)**，为所有部件添加刚体组件

5. 选中所有部件，然后选择**组件 (Component) > 物理 (Physics) > 网格碰撞体 (Mesh Collider)** 并启用 **Convex** 选项以提高性能，为所有部件添加碰撞体。

6. 确保将所有损毁机器人的部件作为单个根游戏对象的子对象。

7. 为了增加特效，可以为每个部件添加一个类似烟雾的粒子系统作为子对象。

8. 现在，您已经创建了一个具有多个可爆炸部件的机器人。这些部件会因物理作用掉落，并且每个部件都会因附加的粒子系统而产生轨迹。

9. 点击运行 (Play) 按钮预览模型的反应，并根据需要进行调整。

10. 将根游戏对象拖入**项目 (Project)** 窗口的**资源 (Assets)** 文件夹中，创建一个新的预制体。

## 通过代码构建损毁机器人预制体

以下示例展示了如何通过代码实现上述步骤：

```
using UnityEngine;
public class WreckOnCollision : MonoBehaviour
{
   public GameObject wreckedVersion;

   void OnCollisionEnter()
   {
       Destroy(gameObject);
       Instantiate(wreckedVersion,transform.position,transform.rotation);
   }
}
```


**当机器人预制件被飞弹击中时被替换为残骸预制件的示例:**
![](/api/media?file=/engine/6000.0/media/images/PrefabWreckSwap.gif)

可以从此处下载包含上述所有示例的项目：**[InstantiatingPrefabsExamples.zip](/api/download.md?file=/engine/6000.0/media/downloads/InstantiatingPrefabsExamples.zip)**

## 其他资源

* [预制件](/engine/6000.0/manual/working-in-unity/working-with-gameobjects/prefabs.md)
* [GameObject](/engine/6000.0/manual/scripting/get-started/fundamental-unity-types/class-game-object.md)
