繁体   English   中英

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

[英]unity3d: How to save part of a prefab instance as a prefab?

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

 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 实例来降低帧速率,但是这个导入的 model 需要以某种方式转换为预制件。 我正在尝试提取重复的有意义的对象(例如椅子)作为单独的椅子预制件,但问题是:

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

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

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

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

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

Unity 既不能处理那么多对象,也不能处理这么深的层次结构! Unity 自己的网站上关于此的一篇不错的文章)。 因此,您永远不会以这种方式获得良好的性能。 您必须在专用软件(通常是 3D 建模软件)中减少和组合对象并将这些对象导入统一。

和你的要求一样。 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM