【问题标题】:Creating a prefab from a gameobject in scene by using Prefabutiliy.CreatePrefab使用 Prefabutiliy.CreatePrefab 从场景中的游戏对象创建预制件
【发布时间】:2016-12-14 06:23:27
【问题描述】:

我在场景中有一个包含子对象和组件的游戏对象。我想将其保存为预制件,然后使用 c# 脚本删除游戏对象。我有一个处理这种情况的基本脚本:

GameObject gObject = Gameobject.Find(name);
if (gObject != null)
{
    PrefabUtility.CreatePrefab("Assets/Models/" + data + ".prefab", gObject, ReplacePrefabOptions.Default);
    Destroy(gObject);
}

此代码运行良好。但仅在创建预制件时保存变换组件。游戏对象的网格信息在 CreatePrefab 操作后丢失。有没有办法创建一个包含游戏对象所有组件的预制件?

【问题讨论】:

  • 您可能会在gamedev.stackexchange.com找到更多答案
  • 我相信你需要使用instantiate来复制完整的prefab -> docs.unity3d.com/ScriptReference/Object.Instantiate.html
  • 您使用的是什么版本的统一。在测试了您的确切代码之后,预制件拥有所有组件,就像它们所假设的那样。您是在编辑器中运行此代码还是在构建中运行此代码。 PrefabUtility 仅供编辑器使用。
  • 我使用的是 5.3.5f1 版本。目前这段代码正在编辑器中运行,但我计划在 build 中运行此功能。但正如你所说,在构建中使用 PrefabUtility 是不可能的。你知道另一种从游戏对象创建预制件的方法吗?
  • 你不能(afaik)在运行时创建预制件。它们只是一个编辑器内的构造。

标签: c# unity3d destroy gameobject


【解决方案1】:

您需要专门将网格保存在预制件内。

Object prefab = PrefabUtility.CreatePrefab(...
AssetDatabase.AddObjectToAsset(yourMesh, prefab);
Destroy(gObject);

如果您有多个网格,则需要分别添加每个网格。

Re:您的评论:没有必要在构建中具有此功能。您可以在运行时使用所需的所有组件和网格创建一个 GameObject,然后像使用预制件一样使用 Instantiate 克隆它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多