Unity3D 个人尝试经验总结

简介: 通过StaticBatchingUtility.Combine(GameObject[], RootGameObject)的GameObject可以通过SetActive()控制显示与隐藏。并且在运行过程中可以将GameObject[]中的元素移出来改变位置与材质,并将原位置设置为null,在改动完成后再赋值回去。
  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();

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 = "sdfasdfasdfasdfsdfsdfsdfrnsfasdfasdfasdfasdfsfrnasdfsdfasdf";//设置文字
tempt.fontSize = 40; //文字大小
tempt.color = Color.black; //颜色

  1. Unity3D UI元素点击选中方法:用GraphicRaycaster来做
  2. (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();
List results = new List();
uiRaycaster.Raycast(eventDataCurrentPosition, results);
if (results.Count > 0)
{
GuiManager.Instance.SetText(results.Count.ToString() + ",第一个元素类别:" + results[0].gameObject.GetType().ToString() + ",第一个元素名:" + results[0].gameObject.name);
return;
}
}

  1. Unity3d中的模型看起来光滑的方法:网格节点的normal要设置好,可以使网格看起来不楞。如果使用unity3d自带的mesh.RecalculateNormals()重新计算节点的normal,一定要注意mesh的Vertices与triangles的设置,处于光滑曲面处的节点不能在Vertices里重复出现,否则这个点就会出现楞。结果如下图:左面是没有处理好Vertices,直接RecalculateNormals的,右面是处理好的效果。网格都一样但是看起来很光滑。
  2. 贴图的UV设置。Unity3d导出的程序运行时生成的网格需要贴图的时候需要设置每个网格节点的UV,否则默认都为相同的数。与Normal可以通过Mesh.RecalculateNormals()重新生成所有点的Normal不同,UV只能自己计算然后赋值。如果是比较大面积的贴图,不考虑重复的影响,可以自己根据投影至某个平面上的横纵坐标设置每个点的UV。需要注意的是,有的网格是经过原始网格Scale之后得到的,所以计算UV值时需要考虑scale,否则这个网格上的贴图会跟周围其他相同贴图的地方尺度不一样。贴图计算非常耗时,而且每个gameobject都需要计算,如果仅显示纯颜色的object还是不算uv比较好。另外单个gameobject重新计算bounds也非常耗时,与uv相当,也要根据情况有所取舍。
  3. 关于警告带来的效率降低:在代码中用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);

  1. 关于内存逐渐增大的问题:游戏运行时发现内存会渐渐的变大,每10秒钟0.1mb左右。经检查发现是因为在update或fixupdate中用了string str += "saaaa"这样的形式进行字符串拼接,因此导致内存的渐涨,去掉后内存使用就很稳定了。
  2. 多摄像头UI设置问题:想要实现双摄像头,其中一个不渲染UI。需要将UI的canvas的render mode设置成 screen space camera,然后希望看到UI的camera拖到canvas的render camera属性上。
    更多unity2018的功能介绍请到paws3d学习中心查找。
相关文章
|
XML 编解码 编译器
Unity跨平台UI解决方案:可能是最全的FairyGUI系列教程-第八天
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
1489 0
|
4月前
|
开发框架 数据可视化 前端开发
【Unity 3D】GameFramework、QFramework框架简介及应用实战(超详细 附源码)
【Unity 3D】GameFramework、QFramework框架简介及应用实战(超详细 附源码)
124 0
|
4月前
|
人工智能 C# 图形学
Unity入门
Unity入门
|
10月前
|
JavaScript 前端开发 vr&ar
【游戏开发】unity入门教程
Unity是一款非常受欢迎的游戏引擎,它可以用于开发2D和3D游戏以及虚拟现实和增强现实应用程序。如果你是一个刚开始接触Unity的开发者,这篇教程将为你提供一些有用的指导。
220 0
|
10月前
|
前端开发 C# 图形学
unity入门必备的案例你还不知道?
unity入门必备的案例你还不知道?
131 0
|
10月前
|
前端开发 C# 图形学
unity入门必备的案例2.0
unity入门必备的案例你还不知道?
63 0
|
图形学
Unity实战之见缝插针
Unity实现见缝插针小游戏
Unity实战之见缝插针
|
XML 前端开发 图形学
Unity跨平台UI解决方案:可能是最全的FairyGUI系列教程-第五天
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
390 0
|
前端开发 图形学 Android开发
Unity跨平台UI解决方案:可能是最全的FairyGUI系列教程-第六天
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
1487 0
|
XML JSON 缓存
Unity跨平台UI解决方案:可能是最全的FairyGUI系列教程-第四天
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
1195 0