C# unity3d:如何将预制实例的一部分保存为预制?

C# unity3d:如何将预制实例的一部分保存为预制?,c#,unity3d,C#,Unity3d,我有一个大房间,里面有成千上万个嵌套的对象。我试图从数百个对象中选择一组表示单个对象的对象。这最初是一个sketchup文件,它被转换为一个预制变量并添加到场景中 using UnityEngine; using System.Collections; using UnityEditor; public class CreatePrefab : MonoBehaviour { [MenuItem("Extras/Create Prefab From Selectio

我有一个大房间,里面有成千上万个嵌套的对象。我试图从数百个对象中选择一组表示单个对象的对象。这最初是一个sketchup文件,它被转换为一个预制变量并添加到场景中

 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);
     }
 }
 }
因此,我尝试迭代选择,并将它们转换为预设。这非常可笑,因为总共有将近100000个物体,而组成椅子的所有东西,如螺母、螺栓、杆,都是单独的游戏物体

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

  • 我不知道如何首先组合/融合构成椅子的物体

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

  • 我必须对每个重复过多的物体(例如椅子、桌子)基本上重复这个过程

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


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

    Unity既不能处理这么多的对象,也不能处理这么深的层次结构!(). 这样你就永远不会有好的表现。您必须在专用软件(通常是3D建模软件)中减少并组合对象,然后将这些对象导入unity。

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

    解决办法是:

  • 通过
    prefableUtility实例化另一个嵌套预置。实例化prefab
  • 修改预设的新游戏对象
  • 通过
    prefableUtility保存修改。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);
    
    var prefablePath=PrefableUtility.GetPrefableAssetPathofNearestInstanceRoot(goInScene);
    var prefact=AssetDatabase.LoadAssetPath(PrefactPath);
    var anotherGo=prefactutility.实例化prefab(prefab)作为游戏对象;
    //对nestedGo进行相同的修改,使其成为另一个Go
    PrefactUtility.SaveAsPrefabAssetAndConnect(另一个Go、PrefactPath、InteractionMode.AutomatedAction);//此保存将影响场景中的所有预设!
    立即销毁(另一个);
    
    Unity既不能处理这么多的对象,也不能处理这么深的层次结构!(.因此,您永远不会以这种方式获得良好的性能。您必须在专用软件(通常是3D建模软件)中减少和组合对象,并将这些对象导入unity。@Thomas我接受这一答案