销毁预制体
时间: 2025-05-20 07:34:09 浏览: 13
### 如何在Unity中通过代码销毁加载的预制体
在Unity中,可以通过`Object.Destroy`方法销毁已实例化的预制体。如果预制体是通过代码动态加载并实例化的,则需要确保保存对该实例的引用以便稍后销毁它。
以下是具体实现方式:
#### 使用 `Object.Destroy` 方法销毁预制体
当一个预制体被实例化到场景中时,返回的是该实例的游戏对象引用。可以使用此引用调用 `Destroy` 方法来销毁该游戏对象[^2]。
```csharp
public class PrefabManager : MonoBehaviour
{
public GameObject prefab; // 预制体资源
private GameObject instantiatedPrefab;
void Start()
{
// 实例化预制体
instantiatedPrefab = Instantiate(prefab);
// 延迟一段时间后销毁实例化的预制体
Destroy(instantiatedPrefab, 5f); // 5秒后销毁
}
}
```
在此示例中,`Instantiate` 函数用于创建预制体的一个新实例,并将其存储在变量 `instantiatedPrefab` 中。随后,`Destroy` 调用将在指定时间(这里是5秒)之后销毁该实例[^2]。
#### 结合异步加载与销毁操作
对于通过异步方式加载的预制体,通常会先下载资产再进行实例化。一旦完成使用这些资源,同样应该释放它们以节省内存[^1]。
下面是一个基于Addressables系统的例子,展示如何安全地卸载不再需要的内容包以及删除对应的实体对象[^3]:
```csharp
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
public class AsyncPrefabLoader : MonoBehaviour
{
async void LoadAndDestroyPrefab(string assetKey)
{
AsyncOperationHandle<GameObject> handle = Addressables.LoadAssetAsync<GameObject>(assetKey);
await handle.Task;
if (handle.Status == AsyncOperationStatus.Succeeded)
{
GameObject loadedPrefab = handle.Result;
GameObject instance = Instantiate(loadedPrefab);
// Do something with the instance...
// After some time or condition met...
Destroy(instance); // 销毁游戏物体实例
Addressables.Release(handle); // 解除对地址资源的引用
}
}
}
```
以上代码片段展示了如何利用Addressables API 加载远程或本地存储中的预制体,在适当时候既清理了运行时产生的GameObject也回收了关联的数据流管理器持有的副本[^3]。
---
阅读全文
相关推荐















