微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在运行时刷新Unity?

enter image description here


在上面的简短片段中,您将看到我在Unity中的设置非常少.每隔一帧(在Update中)就会增加一个计数器,此计数器称为“ UnityEditor.SceneView.RepaintAll()”.您可以看到一个计数器,该计数器已输出到“控制台”框中.

一旦我进入“游戏”视图并单击左下角的按钮(突出显示的按钮按下),它将调用一个脚本,该脚本在运行时将网格导入场景并进行渲染.在此期间,尽管短暂但非常明显,您会注意到柜台和重新粉刷的调用冻结.实际上,在此加载时间内,场景中的所有内容都会冻结.

我一直在搜寻如何刷新Unity的场景,以便实质上可以在运行时加载网格,同时保持对播放器的响应能力.到目前为止,什么都没有.

定期刷新/更新场景的最佳做法是什么,以使播放器不会因加载时间暂停而受到困扰?

编辑:RepaintAll()调用对我不起作用.以前应该已经添加了.这种方法不像我希望的那样起作用,实际上,我不确定如果不刷新场景,其目的是什么.

网格导入代码

    const int MAX_FACETS_PER_MESH = 65535 / 3;

    class Facet
    {
        public Vector3 normal;
        public Vector3 a, b, c;

        public override string ToString()
        {
            return string.Format("{0:F2}: {1:F2}, {2:F2}, {3:F2}", normal, a, b, c);
        }
    }

    private static Mesh[] ImportBinary(string path)
    {
        Facet[] facets;

        using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
        {
            using (BinaryReader br = new BinaryReader(fs, new ASCIIEncoding()))
            {
                // read header
                byte[] header = br.ReadBytes(80);
                uint facetCount = br.ReadUInt32();
                facets = new Facet[facetCount];

                for(uint i = 0; i < facetCount; i++)
                {
                    facets[i] = new Facet();

                    facets[i].normal.x = br.ReadSingle();
                    facets[i].normal.y = br.ReadSingle();
                    facets[i].normal.z = br.ReadSingle();

                    facets[i].a.x = br.ReadSingle();
                    facets[i].a.y = br.ReadSingle();
                    facets[i].a.z = br.ReadSingle();

                    facets[i].b.x = br.ReadSingle();
                    facets[i].b.y = br.ReadSingle();
                    facets[i].b.z = br.ReadSingle();

                    facets[i].c.x = br.ReadSingle();
                    facets[i].c.y = br.ReadSingle();
                    facets[i].c.z = br.ReadSingle();

                    // padding
                    br.ReadUInt16();
                }
            }
        }

        return CreateMeshWithFacets(facets);
    }

    private static Mesh[] CreateMeshWithFacets(IList<Facet> facets)
    {
        int fl = facets.Count, f = 0, mvc = MAX_FACETS_PER_MESH * 3;
        Mesh[] meshes = new Mesh[fl / MAX_FACETS_PER_MESH + 1];

        for(int i = 0; i < meshes.Length; i++)
        {
            int len = System.Math.Min(mvc, (fl - f) * 3);
            Vector3[] v = new Vector3[len];
            Vector3[] n = new Vector3[len];
            int[] t = new int[len];

            for(int it = 0; it < len; it += 3)
            {
                v[it  ] = facets[f].a;
                v[it+1] = facets[f].b;
                v[it+2] = facets[f].c;

                n[it  ] = facets[f].normal;
                n[it+1] = facets[f].normal;
                n[it+2] = facets[f].normal;

                t[it  ] = it;
                t[it+1] = it+1;
                t[it+2] = it+2;

                f++;
            }

            meshes[i] = new Mesh();
            meshes[i].vertices = v;
            meshes[i].normals = n;
            meshes[i].triangles = t;
        }

        return meshes;
    }

解决方法:

您正在尝试同步执行文件IO,从而将其锁定在正在运行的任何线程上.在这种情况下,主线程.

您可以在剪辑的所有三个区域中看到此锁定的效果

>场景视图不更新
>游戏视图不会更新
>控制台停止记录

这是因为Update()根本没有运行.

为了解决这个问题,您需要异步加载文件.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐