Unity3D 個人嘗試經驗總結


1.   通過StaticBatchingUtility.Combine(GameObject[], RootGameObject)的GameObject可以通過SetActive()控制顯示與隱藏。並且在運行過程中可以將GameObject[]中的元素移出來改變位置與材質,並將原位置設置為null,在改動完成后再賦值回去。

2.   Unity3d發布Android遇到問題,提示無法找到可用的android設備,原因可能為華為自帶的手機助手影響了查找設備,關閉了華為助手的連接,用360手機助手連接上手機后再發布就好用了。(前提是android的sdk,java等安裝完成)。

3.   Unity3d動態添加Text的方法:   不能直接Text  tttt = new Text(),要在一個gameobject里面添加Text組件

        Text tempt = scrollcontent.AddComponent<Text>();
        tempt.name = "text1";   //一定要起名字
        Debug.Log("生成");
        tempt.rectTransform.anchoredPosition = new Vector2(0, -100); //相對於父對象的插入位置
        tempt.rectTransform.sizeDelta =new Vector2(300, 200);       //設置寬與高
        tempt.horizontalOverflow = HorizontalWrapMode.Overflow;     //設置橫豎文字溢出模式
        tempt.font = Font.CreateDynamicFontFromOSFont("Arial", 40); //設置字體
        tempt.text = "sdfasdfasdfasdfsdfsdfsdf\r\nsfasdfasdfasdfasdfsf\r\nasdfsdfasdf";//設置文字
        tempt.fontSize = 40;                //文字大小
        tempt.color = Color.black;          //顏色

 4.   Unity3D UI元素點擊選中方法:用GraphicRaycaster來做

        if (Input.GetMouseButtonDown(0))
        {
            //Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            //RaycastHit hitinfo;
            PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
            eventDataCurrentPosition.position = new Vector2(Input.mousePosition.x,Input.mousePosition.y);

            GraphicRaycaster uiRaycaster = canvas.gameObject.GetComponent<GraphicRaycaster>();
            List<RaycastResult> results = new List<RaycastResult>();
            uiRaycaster.Raycast(eventDataCurrentPosition, results);
            if (results.Count > 0)
            {
                GuiManager.Instance.SetText(results.Count.ToString() + ",第一個元素類別:" + results[0].gameObject.GetType().ToString() + ",第一個元素名:" + results[0].gameObject.name);
                return;
            }
        }

 5. Unity3d中的模型看起來光滑的方法:網格節點的normal要設置好,可以使網格看起來不楞。如果使用unity3d自帶的mesh.RecalculateNormals()重新計算節點的normal,一定要注意mesh的Vertices與triangles的設置,處於光滑曲面處的節點不能在Vertices里重復出現,否則這個點就會出現楞。結果如下圖:左面是沒有處理好Vertices,直接RecalculateNormals的,右面是處理好的效果。網格都一樣但是看起來很光滑。

 6. 貼圖的UV設置。Unity3d導出的程序運行時生成的網格需要貼圖的時候需要設置每個網格節點的UV,否則默認都為相同的數。與Normal可以通過Mesh.RecalculateNormals()重新生成所有點的Normal不同,UV只能自己計算然后賦值。如果是比較大面積的貼圖,不考慮重復的影響,可以自己根據投影至某個平面上的橫縱坐標設置每個點的UV。需要注意的是,有的網格是經過原始網格Scale之后得到的,所以計算UV值時需要考慮scale,否則這個網格上的貼圖會跟周圍其他相同貼圖的地方尺度不一樣。貼圖計算非常耗時,而且每個gameobject都需要計算,如果僅顯示純顏色的object還是不算uv比較好。另外單個gameobject重新計算bounds也非常耗時,與uv相當,也要根據情況有所取舍。

7. 關於警告帶來的效率降低:在代碼中用mesh.combinemeshes(cis,false)進行網格的合並,發現運行速度奇慢,由於一直沒有錯誤出現,一直沒有注意這里。后來偶然在editer中運行發現出現了600多個警告信息,才發現是combinemesh中的combineinstance[]中元素的submeshindex設置有問題,我是自己設置的數值。其實不需要自己設置數值,運行時會根據combineinstance[]的順序自動配置submeshindex。去掉后速度就正常了。

 tempmg.mesh = new Mesh();
                CombineInstance[] cis = new CombineInstance[tempmg.submesh.Length];
                for (j = 0; j < tempmg.submesh.Length; j++)
                {
                    cis[j].mesh = tempmg.submesh[j];
                    cis[j].transform = Matrix4x4.identity;
                    //cis[j].subMeshIndex = j;
                }
                tempmg.mesh.CombineMeshes(cis, false, false);

8. 關於內存逐漸增大的問題:游戲運行時發現內存會漸漸的變大,每10秒鍾0.1mb左右。經檢查發現是因為在update或fixupdate中用了string str += "saaaa"這樣的形式進行字符串拼接,因此導致內存的漸漲,去掉后內存使用就很穩定了。

9. 多攝像頭UI設置問題:想要實現雙攝像頭,其中一個不渲染UI。需要將UI的canvas的render mode設置成 screen space camera,然后希望看到UI的camera拖到canvas的render camera屬性上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM