{"id":867,"date":"2019-12-31T12:43:12","date_gmt":"2019-12-31T04:43:12","guid":{"rendered":"http:\/\/blog.coolcoding.cn\/?p=867"},"modified":"2020-12-17T21:33:05","modified_gmt":"2020-12-17T13:33:05","slug":"%e5%8a%a8%e6%80%81%e6%a0%91%e7%9a%84%e5%90%88%e6%89%b9","status":"publish","type":"post","link":"https:\/\/blog.coolcoding.cn\/?p=867","title":{"rendered":"[Unity]\u6811\u7684\u52a8\u6001\u5408\u6279"},"content":{"rendered":"\n<pre class=\"wp-block-code\"><code>using System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\n\nclass UwPlantInsDatas\n{\n    private List&lt;Matrix4x4> mMat44 = new List&lt;Matrix4x4>();\n    public List&lt;Matrix4x4[]> mTransData = new List&lt;Matrix4x4[]>();\n\tpublic Mesh mMesh;\n\tpublic Material mMaterial;\n\n    public int Init(string assetPath)\n    {\n        GameObject template = ResourceMgr.Load(assetPath, \"plants\") as GameObject;\n        if (template == null)\n        {\n            return -1;\n        }\n\n        var mrs = template.GetComponentsInChildren&lt;MeshRenderer>();\n        if (mrs == null || mrs.Length == 0)\n        {\n            return -2;\n        }\n\n        var mr= mrs[0];\n        if (mr == null)\n        {\n            return -3;\n        }\n\n        if (!mr.sharedMaterial.enableInstancing)\n        {\n            return -4;\n        }\n\n        var mf = mr.gameObject.GetComponent&lt;MeshFilter>();\n        if (mf == null)\n        {\n            return -5; \n        }\n\n        if (mf.sharedMesh == null)\n        {\n            return -6;\n        }\n\n        mMaterial = mr.sharedMaterial;\n        mMesh = mf.sharedMesh;\n\n        return 0;\n    }\n\n    public void Clear()\n    {\n        mTransData.Clear();\n        mMat44.Clear();\n    }\n\n    public void Add(Clp_Transform trans, Vector3 pos)\n    {\n        Matrix4x4 mt = Matrix4x4.TRS(pos, Quaternion.Euler(trans.rotation), trans.scale);\n        mMat44.Add(mt);\n    }\n\n    public void Submit()\n    {\n        var source = mMat44.ToArray();\n        var sourceLen = source.Length;\n        for(int i=0; i&lt;100 &amp;&amp; sourceLen > 0; ++i)\n        {\n            int len = sourceLen > 1023 ? 1023 : sourceLen;\n            Matrix4x4[] dst = new Matrix4x4[len];\n            System.Array.Copy(source, i*1023, dst, 0, len);\n            sourceLen -= len;\n            mTransData.Add(dst);\n        }\n    }\n\n    public void Render()\n    {\n        for(int i=0; i&lt;mTransData.Count; ++i)\n        {\n            Graphics.DrawMeshInstanced(mMesh, 0, mMaterial, mTransData[i]);\n        }\n    }\n};\n\npublic class UwPlantInsManager\n{\n    private Dictionary&lt;string, UwPlantInsDatas> mPlants = new Dictionary&lt;string, UwPlantInsDatas>();\n\n    public bool AddPlant(string assetPath, Clp_Transform data, Vector3 pos)\n    {\n        UwPlantInsDatas pid;\n        if (!mPlants.TryGetValue(assetPath, out pid))\n        {\n            pid = new UwPlantInsDatas();\n            var ret = pid.Init(assetPath);\n\n            if (ret == 0)\n            {\n                mPlants.Add( assetPath, pid);\n            }\n            else\n            {\n                mPlants.Add( assetPath, null);\n                pid = null;\n            }\n        }\n\n        if (pid != null)\n        {\n            pid.Add(data, pos);\n            return true;\n        }\n\n        return false;\n    }\n\n    public void RenderPlants()\n    {\n        foreach(var kv in mPlants)\n        {\n            var plant = kv.Value;\n            if (plant != null)\n            {\n                plant.Render();\n            }\n        } \n    }\n\n    public void SubmitPlants()\n    {\n        foreach(var kv in mPlants)\n        {\n            var plant = kv.Value;\n            if (plant != null)\n            {\n                plant.Submit();\n            }\n        }\n    }\n\n    public void ClearPlants()\n    {\n        foreach(var kv in mPlants)\n        {\n            var plant = kv.Value;\n            if (plant != null)\n            {\n                plant.Clear();\n            }\n        }\n    }\n};<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=\/wp\/v2\/posts\/867"}],"collection":[{"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=867"}],"version-history":[{"count":2,"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=\/wp\/v2\/posts\/867\/revisions"}],"predecessor-version":[{"id":948,"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=\/wp\/v2\/posts\/867\/revisions\/948"}],"wp:attachment":[{"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=867"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=867"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=867"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}