[英]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 需要以某种方式转换为预制件。 我正在尝试提取重复的有意义的对象(例如椅子)作为单独的椅子预制件,但问题是:
我不知道如何首先组合/融合构成椅子的对象
如果我能够 select 椅子,我需要能够将其转换为椅子预制件。
我必须对每个过度重复的 object 基本上重复这个过程(例如椅子、桌子)
我从统一收到此错误消息:无法将预制实例的一部分保存为预制,
如何将构成椅子的各个部分分组并将其变成预制件?
Unity 既不能处理那么多对象,也不能处理这么深的层次结构! ( Unity 自己的网站上关于此的一篇不错的文章)。 因此,您永远不会以这种方式获得良好的性能。 您必须在专用软件(通常是 3D 建模软件)中减少和组合对象并将这些对象导入统一。
和你的要求一样。 Unity 没有提供这样的方法来保存嵌套的 prefab 修改,但是可以通过一个技巧来实现。
解决方案是:
PrefabUtility.InstantiatePrefab
实例化另一个嵌套预制件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.