我正在使用以下代码翻转立方体背面的UV:
Vector2[] uvs = GetComponent().sharedMesh.uv;
uvs[7] = new Vector2(0, 0);
uvs[6] = new Vector2(1, 0);
uvs[11] = new Vector2(0, 1);
uvs[10] = new Vector2(1, 1);
GetComponent().sharedMesh.uv = uvs;
它按预期翻转uv,但是如果我注释掉所有内容并在Unity编辑器中点击播放,我会看到uv仍然被翻转(好像代码对uv产生了永久性的改变)。
如果我关闭并重新打开Unity编辑器,然后点击播放,则uv再次处于初始(非翻转)状态。
在这种情况下这不是真正的问题,但是在调试期间它给我带来了很多麻烦,有人可以解释一下这种行为吗?
答案 0 :(得分:2)
有两种方法可以检索网格:
<强> 1 即可。GetComponent<MeshFilter>().sharedMesh
MeshFilter.sharedMesh
指向模型的原始网格,这意味着当您修改它时,也会修改此模型中的所有实例化预制件。建议您仅使用MeshFilter.sharedMesh
来读取网格,但不使用从MeshFilter.sharedMesh
返回的数据来修改它。
这就是您看到当前效果的原因,只有在您想要影响使用此网格的所有其他预制件/游戏对象时才应使用。
<强> 2 即可。GetComponent<MeshFilter>().mesh
MeshFilter.mesh
指向原始网格的当前副本。当您调用MeshFilter.mesh
时,会生成并返回原始网格的副本。如果已存在副本,则返回该副本。这样就可以修改网格而无需修改原始网格或影响使用此网格的其他预制件/游戏对象。
MeshFilter.mesh
是您应该用来修改网格的。
答案 1 :(得分:1)
您正在直接修改3d模型/网格,它会存储更改,而不是在退出播放模式时重置它们。
来源:
https://docs.unity3d.com/Manual/ModifyingSourceAssetsThroughScripting.html
直接修改
重要提示
下面介绍的方法将修改Unity中使用的实际源资产文件。这些修改不可撤消。谨慎使用它们。
现在让我们说当我们退出播放模式时我们不希望材料重置。为此,您可以使用renderer.sharedMaterial。 sharedMaterial属性将返回此渲染器(以及其他人)使用的实际资产。
以下代码将永久更改材质以使用Specular着色器。它不会将材料重置为播放模式之前的状态。
奖金知识:
据我所知,如果您修改ScriptableObjects,也会发生同样的事情。