【问题标题】:unity3d: How to save part of a prefab instance as a prefab?unity3d:如何将预制实例的一部分保存为预制件?
【发布时间】:2021-03-08 03:33:29
【问题描述】:

我有一个大房间,里面有成千上万个嵌套对象。我试图从数百个对象中选择一组表示单个对象的对象。这最初是一个草图文件,后来变成了一个预制变体并添加到场景中。

 using UnityEngine;
 using System.Collections;
 using UnityEditor;
 
 public class CreatePrefab : MonoBehaviour
 {


 [MenuItem("Extras/Create Prefab From Selection")]
 static void DoCreatePrefab()
 {
     Transform[] transforms = Selection.transforms;
     foreach (Transform t in transforms)
     {
         GameObject prefab = PrefabUtility.CreatePrefab("Assets/Prefabs/" + t.gameObject.name + 
".prefab", t.gameObject, ReplacePrefabOptions.ReplaceNameBased);
     }
 }
 }

所以我试图遍历选择并将它们每个都变成预制件。这很荒谬,因为总共有近 100,000 个对象,而构成椅子的螺母、螺栓、杆等所有东西都是单独的游戏对象。

我正在尝试使用 GPU 实例化来降低帧速率,但是这个导入的模型需要以某种方式转换为预制件。我正在尝试提取重复的有意义的对象(例如椅子)作为单独的椅子预制件,但问题是:

  1. 我不知道如何首先组合/融合构成椅子的对象

  2. 如果我能够选择一把椅子,我需要能够将其转换为椅子预制件。

  3. 我必须对每个过度重复的对象(例如椅子、桌子)重复这个过程

我从 unity 收到此错误消息:无法将预制实例的一部分保存为预制,

如何将构成椅子的各个部分组合起来并将其变成预制件?

【问题讨论】:

  • Unity 既不能处理那么多对象,也不能处理这么深的层次结构! (a nice article on Unity's own website about this。因此,您将永远以这种方式获得良好的性能。您必须在专用软件(通常是 3D 建模软件)中减少和组合对象并将这些对象导入统一.
  • @Thomas 我会接受这个答案

标签: c# unity3d


【解决方案1】:

Unity 既不能处理那么多对象,也不能处理这么深的层次结构! (a nice article on Unity's own website about this)。因此,您永远不会以这种方式获得良好的性能。您必须在专用软件(通常是 3D 建模软件)中减少和组合对象,然后将这些对象导入统一。

【讨论】:

    【解决方案2】:

    与您的要求相同。 Unity 没有提供这样的方法来保存嵌套的 prefab 修改,但是可以通过一个技巧来实现。

    解决办法是:

    1. 通过PrefabUtility.InstantiatePrefab 实例化另一个嵌套预制件
    2. 修改预制件的新游戏对象
    3. 通过PrefabUtility.SaveAsPrefabAssetAndConnect保存修改

    并且由于游戏对象层次结构是一个引用,所以保存的修改也会影响嵌套的预制件。

    代码如下:

    var prefabPath = PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(goInScene);
    var prefab = AssetDatabase.LoadAssetAtPath<GameObject>(prefabPath);
    var anotherGo = PrefabUtility.InstantiatePrefab(prefab) as GameObject;
    
    // Do the same modification of the nestedGo to anotherGo
    
    PrefabUtility.SaveAsPrefabAssetAndConnect(anotherGo, prefabPath, InteractionMode.AutomatedAction); // This save will affect all prefab in Scene!
    DestroyImmediate(anotherGo);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-27
      • 2018-07-28
      • 1970-01-01
      • 2017-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多