我正在编写一个脚本来直接在Unity中重命名网格,因为每次重命名FBX文件时,网格资源仍然保留上次从3dsMax的Maya导出时的旧名称,这真的很烦人。我尝试过的都不起作用,代码如下:
public class Rename
{
[MenuItem("Assets/Test")]
private static void renameTest()
{
//select a fbx in project window
GameObject fbx = Selection.activeGameObject;
Mesh meshAsset = fbx.GetComponentInChildren<MeshFilter>().sharedMesh;
meshAsset.name = "new name";
Debug.Log(meshAsset);
}
}
我也尝试过:
private static void renameTestv2()
{
GameObject fbx = Selection.activeGameObject;
Mesh meshAsset = fbx.GetComponentInChildren<MeshFilter>().sharedMesh;
Mesh meshAsset2 = Object.Instantiate(meshAsset);
meshAsset2.name = "new name";
fbx.GetComponentInChildren<MeshFilter>().sharedMesh = meshAsset2;
}
第三种方法可以更改FBX的Meshfilter组件上的Mesh名称,但实际的子资源仍然使用旧的,您可以通过附图找到我的意思。
private static void renameTest()
{
GameObject fbx = Selection.activeGameObject;
string path = AssetDatabase.GetAssetPath(fbx);
Mesh meshAsset = AssetDatabase.LoadAllAssetRepresentationsAtPath(path)[0] as Mesh;
meshAsset.name = "new name";
fbx.GetComponentInChildren<MeshFilter>().sharedMesh = meshAsset;
Debug.Log(meshAsset);
}
如何解决这个问题?
如果我从 DCC 重新导出 FBX 来更改网格体的名称,它将丢失与预制件的链接,但 fbx 文件的 guid 实际上没有改变,为什么会发生这种情况? 我的步骤是
我认为这不能直接在 Unity 中完成。
原因:在Unity的资源中看到的是一个已经导入的虚拟模型Prefab。实际上,在您的系统文件浏览器中,它仍然是一个普通的 FBX 文件,并且 Unity 不会直接将内容写入该 FBX 文件。 Unity 不是 3D 建模软件,因此没有尝试解决此问题。
换句话说,来自 FBX 导出器包
当 Unity 从 3D 建模应用程序(例如 Autodesk® Maya®)导入模型时,Unity 会创建一个模型Prefab,它是 FBX 文件内容的只读表示。除了更改导入设置之外,您无法在 Unity 中编辑模型预制件。当 FBX 文件在原始 3D 建模软件中修改时,Unity 会更新模型预制件。
您应该查看此软件包及其功能,它们是专门为 Unity 和 Maya / 3ds Max 之间往返 FBX 文件而设计的,
查看 AssetDatabase 函数 RenameAsset。
文档:“重命名资产文件。”
var path = AssetDatabase.GetAssetPath(fbx);
var newName = "new name";
AssetDatabase.RenameAsset(path, newName);
这是可行的。 重命名网格本身非常具有挑战性,但可以通过某些方法来完成。 我已经使用自定义资产后处理器完成并使用导入资产进行修改。 稍后您还需要为重命名集编写脚本,它的作用是将用户定义的设置传递给我们之前创建的 CustomModelProcessor 脚本。 完成此操作后,您只需重新导入所需的模型并在您创建的 customModel Postprocessor 中触发 On PostProcess 模型方法。