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属性上。

更多unity2018的功能介绍请到paws3d学习中心查找。链接https://www.paws3d.com/learn/,也可以加入unity学习讨论群935714213

猜你喜欢

转载自blog.csdn.net/qq_38456196/article/details/87634010