0

我正在使用以下代码来翻转立方体背面的 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,但如果我注释掉所有内容并在统一编辑器中点击播放,我会看到 uv 仍然翻转(好像代码对 uv 产生了永久性更改)。

如果我关闭并重新打开 Unity 编辑器,然后点击播放,uv 将再次处于初始(非翻转)状态。

在这种情况下这不是真正的问题,但它在调试过程中给我带来了很多麻烦,有人可以解释这种行为吗?

4

2 回答 2

2

检索网格有两种方法:

1 .GetComponent<MeshFilter>().sharedMesh

MeshFilter.sharedMesh指向模型的原始网格,这意味着当您修改它时,该模型的所有实例化预制件也将被修改。建议您使用MeshFilter.sharedMesh读取网格而不使用返回的数据对其进行修改。MeshFilter.sharedMesh

这就是您看到当前效果的原因,并且仅应在您想影响使用此网格的所有其他预制件/游戏对象时使用。

2 .GetComponent<MeshFilter>().mesh

MeshFilter.mesh指向原始网格的当前副本。当您调用 时MeshFilter.mesh,会生成并返回原始网格的副本。如果副本已经存在,则返回。这使得修改网格而不修改原始网格或影响使用此网格的其他预制件/游戏对象成为可能。

MeshFilter.mesh是你应该用来修改你的网格。

于 2018-02-18T13:43:46.557 回答
1

您正在直接修改 3d 模型/网格,它存储更改而不是在您退出播放模式时重置它们。

资源:

https://docs.unity3d.com/Manual/ModifyingSourceAssetsThroughScripting.html

直接修改

重要的提示

下面介绍的方法将修改 Unity 中使用的实际源资产文件。这些修改是不可撤销的。谨慎使用它们。

现在假设我们不想在退出播放模式时重置素材。为此,您可以使用 renderer.sharedMaterial。sharedMaterial 属性将返回此渲染器(可能还有其他渲染器)使用的实际资源。

下面的代码将永久更改材质以使用高光着色器。它不会将素材重置为播放模式之前的状态。

额外知识:

据我所知,如果您修改 ScriptableObjects,也会发生同样的事情。

于 2018-02-18T09:31:53.877 回答