Unity C#中如何跨场景访问其他脚本静态变量的Mesh?
Unity跨场景访问静态Mesh变量并修改的方案
核心实现思路
静态变量属于类而非实例,跨场景访问的核心就是直接通过类名.静态变量名的方式调用,同时要确保Mesh实例在场景切换后依然有效。
步骤1:定义静态Mesh变量的脚本
在持有Mesh的脚本中,声明静态Mesh变量,并做好初始化和持久化处理:
public class MeshStorage : MonoBehaviour { // 静态Mesh变量,全局可访问 public static Mesh sharedMesh; void Awake() { // 从当前物体的MeshFilter获取Mesh实例 sharedMesh = GetComponent<MeshFilter>().mesh; // 标记物体不随场景卸载销毁,保证Mesh实例持续有效 DontDestroyOnLoad(gameObject); } }
补充:如果你的Mesh是从资源文件加载的,也可以直接在静态变量里初始化,无需挂载到物体上:
public static Mesh sharedMesh = Resources.Load<Mesh>("Path/To/Your/Mesh");
步骤2:跨场景访问并修改Mesh
在另一个场景的脚本中,直接通过类名访问静态Mesh,修改后记得更新Mesh的关键数据:
public class MeshEditor : MonoBehaviour { void Update() { // 先做空值判断,避免空引用报错 if (MeshStorage.sharedMesh == null) return; // 示例:修改Mesh顶点位置 Vector3[] vertices = MeshStorage.sharedMesh.vertices; for (int i = 0; i < vertices.Length; i++) { vertices[i] += Vector3.up * Time.deltaTime * 0.1f; } MeshStorage.sharedMesh.vertices = vertices; // 修改顶点后必须重新计算法线和包围盒,否则渲染会出错 MeshStorage.sharedMesh.RecalculateNormals(); MeshStorage.sharedMesh.RecalculateBounds(); } }
关键注意事项
- 持久化Mesh载体:如果Mesh挂载在物体上,必须用
DontDestroyOnLoad标记该物体,否则场景切换时物体会被销毁,静态变量会指向无效的Mesh实例。 - 空值校验:静态变量可能在未初始化时被访问,一定要加空值判断,避免运行时报错。
- Mesh修改规则:修改Mesh的顶点、三角面等数据后,必须调用
RecalculateNormals()和RecalculateBounds(),否则物体的光照和碰撞会出现异常。
内容的提问来源于stack exchange,提问作者Jano Wazir
相关产品推荐
相关产品推荐

