You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 05:25:55