Not allowed to access vertices on mesh 'SM_MERGED_BP_NVSplineMesh_110' (isReadable is false; Read/Write must be enabled in import settings) UnityEngine.Mesh:get_vertices () Battlehub.RTHandles.BoxSelection:TrySelect (UnityEngine.Bounds&,System.Collections.Generic.HashSet`1<UnityEngine.GameObject>,Battlehub.RTHandles.FilteringArgs,UnityEngine.Bounds&,UnityEngine.GameObject,UnityEngine.Plane[]) (at
时间: 2025-07-08 21:13:59 浏览: 1
<think>好的,我现在需要帮助用户解决他们在Unity中遇到的错误:“Not allowed to access vertices on mesh 'SM_MERGED_BP_NVSplineMesh_110' (isReadable is false; Read/Write must be enabled in import settings)”。首先,我得理解这个错误的原因。根据错误信息,问题出在尝试访问网格的顶点数据时,但该网格的isReadable属性被设置为false,这意味着在导入设置中没有启用Read/Write选项。
接下来,我应该回忆一下Unity中网格导入的设置。在Unity中,当导入3D模型时,每个模型文件(如FBX)都有一个导入设置面板,其中包含“Model”标签下的多个选项。其中有一个“Read/Write Enabled”复选框,默认情况下可能未勾选,特别是对于优化后的项目,这个选项可能被关闭以减少内存占用。如果脚本或工具需要访问网格的顶点数据,比如修改网格、进行碰撞检测或动态生成内容,就必须启用这个选项,否则会抛出上述错误。
用户提到的具体错误发生在Battlehub.RTHandles.BoxSelection的TrySelect方法中,这可能涉及到在运行时动态选择物体时访问网格的顶点信息。因此,用户需要确保所涉及的网格在导入时启用了Read/Write选项。
接下来,我需要考虑解决方案的步骤。首先,用户需要在Unity编辑器中找到导致问题的网格资源。这可能是一个名为“SM_MERGED_BP_NVSplineMesh_110”的网格文件。找到该资源后,在Inspector面板中检查其导入设置,确保“Read/Write Enabled”被勾选。然后重新导入该模型,这样在运行时就可以访问顶点数据了。
另外,可能需要考虑批量处理多个网格的情况,特别是如果项目中有很多需要修改的模型。用户可以通过编写编辑器脚本来自动化这一过程,遍历所有模型文件并启用Read/Write选项,这样可以节省时间并减少遗漏。
此外,还需要提醒用户注意启用Read/Write选项可能带来的内存开销。每个启用了该选项的网格会在内存中保留两份数据,一份供CPU访问,另一份供GPU渲染。如果项目中有大量大型网格,这可能会导致内存压力增大,因此需要权衡利弊,仅在必要时启用此选项。
最后,用户可能需要检查是否有第三方工具或插件在处理网格时自动关闭了Read/Write选项,或者是否有资源导入的预设配置覆盖了该设置。确保所有相关资源的导入设置都正确无误。
总结来说,解决方案的核心步骤是找到问题网格,启用Read/Write选项,重新导入,并考虑内存影响。此外,批量处理和检查资源导入预设也是需要考虑的方面。</think>在Unity中遇到`Not allowed to access vertices`错误时,需通过以下步骤解决:
---
### **错误原因**
错误信息:
$$Not\ allowed\ to\ access\ vertices\ on\ mesh\ 'SM_MERGED_BP_NVSplineMesh_110'\ (isReadable\ is\ false)$$
- **根本原因**:尝试读取网格顶点数据时,该网格的`Read/Write`选项未启用(`isReadable=false`)。
- **典型场景**:脚本调用`Mesh.vertices`、`Mesh.triangles`等属性时触发。
---
### **解决方案(分步说明)**
#### **1. 修改网格导入设置**
1. **定位资源**:
在Project窗口中找到报错的网格文件`SM_MERGED_BP_NVSplineMesh_110`(通常是`.fbx`或`.obj`文件)。
2. **启用Read/Write**:
在Inspector面板的**Model**标签下:
✅ 勾选 `Read/Write Enabled`
✅ 点击 **Apply** 按钮保存设置
```plaintext
Model Import Settings:
┌───────────────────────┐
│ Read/Write Enabled │ ← 必须勾选
│ Optimize Mesh │
│ Generate Colliders │
└───────────────────────┘
```
3. **重新导入模型**:
右键点击网格文件 → **Reimport**
---
#### **2. 代码层验证**
在访问网格顶点前添加安全检查:
```csharp
Mesh mesh = GetComponent<MeshFilter>().mesh;
if (mesh.isReadable) {
Vector3[] vertices = mesh.vertices; // 安全访问
} else {
Debug.LogError("网格未启用Read/Write!");
}
```
---
### **进阶注意事项**
1. **内存开销**
- 启用`Read/Write`会使网格数据在内存中保留两份(CPU可读+GPU渲染),**大网格慎用**。
- 建议在编辑器中启用,发布时根据需求关闭。
2. **批量处理(需编写编辑器脚本)**
```csharp
#if UNITY_EDITOR
using UnityEditor;
public class MeshReadWriteEnabler : Editor {
[MenuItem("Tools/Enable Mesh ReadWrite")]
static void FixAllMeshes() {
foreach (string guid in AssetDatabase.FindAssets("t:Model")) {
string path = AssetDatabase.GUIDToAssetPath(guid);
ModelImporter importer = AssetImporter.GetAtPath(path) as ModelImporter;
if (importer != null && !importer.isReadable) {
importer.isReadable = true;
importer.SaveAndReimport();
}
}
}
}
#endif
```
3. **第三方插件兼容性**
- 若使用模型优化工具(如Mesh Baker),需检查其是否自动关闭了`Read/Write`。
---
### **替代方案**
若无法修改原始模型:
1. **运行时复制网格**
```csharp
Mesh originalMesh = GetComponent<MeshFilter>().mesh;
Mesh clonedMesh = Instantiate(originalMesh); // 创建可写副本
clonedMesh.vertices = ... // 可修改顶点
```
2. **使用`MeshCollider`间接访问**
```csharp
MeshCollider collider = GetComponent<MeshCollider>();
if (collider != null) {
Mesh colliderMesh = collider.sharedMesh; // 可能可读
}
```
---
### **典型应用场景**
- 动态修改顶点(地形变形、布料模拟)
- 运行时生成碰撞体
- 自定义拾取检测(如报错中的`BoxSelection`工具)
建议在项目初期规划好网格用途,避免发布后因内存问题返工。
阅读全文
相关推荐















