》层级处理
1)地图 、 UI 层级处理
UI摄像机有五个,camera的depth从49-56。地图的要在所有UI之下,所以depth设为48。
2)UI,特效层级
特效要夹在在UI之间,所有特效之下的UI的RenderQ改成StartAt调到2600。
3)Camera depth、panel depth、width depth 、renderQ关系
Camera的Depths是指不同相机之前的深度属性,在渲染顺序的优先度里面是最高的,Depth越大,渲染的图像越靠前,和空间无关。
StartAt:如果AB两个panel,A panel显示在前,那么A panel的Start At值就是B panel 的Start At值加上B panel的Drawcall数量。如下图:
panel depth:RenderQueue.Automatic从3000开始计算。StartAt是从设置的值开始计算。
当我们不选择Automatic时,Panel的Depth对于Panel的渲染层级已经没有任何影响了。如下图:
panel depth的优先级高于width depth。
首先如果一个Panel中包含多个Drawcall,这些Drawcall的Renderqueue是由其渲染的Wiget的Depth决定的。其次,Wiget的Depth只会影响同一个Drawcall中的Wiget层次(不同Drawcall还是由Drawcall的Renderqueue决定)。原来Wiget的Depth是通过影响Drawcall中的顶点缓存序列来达到影响层级的效果的。NGUI的一个Drawcall中包含一个Mesh, 它是由Drawcall内所有Wiget的顶点信息生成的,顶点信息存储的顺序是由Depth决定的,越靠后的层级就越高。(注:所以游戏中改变Wiget的Depth可能会导致Mesh重新生成相当影响效率)
》预设的Layer处理
地图有单独的摄像机,而且地图的坐标和 NGUI都在 原点处,地图的坐标又不能改等,否则会影响地图的定位坐标,逻辑封装在了sdk内部。所以地图要用一个独立的layer,否则会出现和其他物体穿插的问题
》LBS资源的管理
地图是通过Resource加载的。因为Resource中的所有内容都会被打包到包里,所有Resource里只留Data 和 Prefab。引用的Materials如果也放在Resources里会不会变成打包双份?
》手势处理
双指滑动
四种手势
》基于json的网络消息
》数据驱动逻辑
》坐标转换
》100个人缓存 刷新 优化
将所有收到的数据一次缓存到一个list里。从最前端插入。
从前向后遍历,剔除id重复的人。
因为只缓存100个人,然后剔除索引100之后的人。
》单点多人的散开处理
当在同一坐标点出现多个人的时候会叠加在一起,要把这些人的经纬度散开。
算法思想:
新建一个空列表。
local nearbyList ; --收到的服务器传来的附近的人100个
local spreadList = {} --散开后的列表
local offsetList; --散开偏移量列表,目前定义了37个散开偏移量,围绕中心点的多个方型结点
for i = 1, #nearbyList do
isInserted = false
for j = 1, #offsetList do
if (nearbyList[i]经纬度 + offsetList[j]偏移量) 和 spreadList 里的所有结点的距离都大于某一值 then
table.insert(spreadList, nearbyList[i])
isInserted = true
break
end
end
if isInserted == false then --暂时只设置了37个偏移量,如果单点超过37个,会出现散不开的情况,就直接显示原始位置
table.insert(spreadList, nearbyList[i])
end
end
》公司位置处转移到附近的某大学。
公司里的人员特殊处理,为了不暴露公司内部玩家。
》手机定位服务器关闭的识别。
两个开关,手机系统定位的总开关 和 每个应用的单独开关。
Input.location.isEnabledByUser 对应的是总开关,当总开关关闭的时候,值为false。开启时值为true。
Input.location.status 是定位的当前状态,有四种。总开关开启状态 值始终未 Stop, 总开关关闭状态值为Failed。这样无法判断当前应用是否开启了定位,只有调用了Input.location:Start()方法,值才会有对应的变化。当应用开关是关闭状态时,值始终为Initializing,当应用开关是开启状态时在几秒后会变为Running,不同手机的响应时间不同,所有我设置的是20秒。在地图关闭的时候调用Input.location:Stop()来关闭定位,节省电力。其实腾讯的地图sdk和手机的定位开关关系并不大,策划要求捆绑在一起,也是调了好一会才弄好。
》腾讯地图的墨卡托坐标
不依赖于手机的定位开关的开关。
墨卡托(Mercator)投影,又名“等角正轴圆柱投影”,荷兰地图学家墨卡托(Mercator)在1569年拟定,假设地球被围在一个中空的圆柱里,其赤道与圆柱相接触,然后再假想地球中心有一盏灯,把球面上的图形投影到圆柱体上,再把圆柱体展开,这就是一幅标准纬线为零度(即赤道)的“墨卡托投影”绘制出的世界地图。
》NGUI UIGrid 在列表没铺满还能滚动问题。
》关注列表的循环滚动效率
》android 9.0系统的Api不兼容
用Unity的定位API的话,在9.0系统里start后,使用返回的status是Initializing。所以最后选择改用sdk里的获取坐标的api,如果没获取到坐标就认为定位没开启。开始的时候想自己写一套通过android 或 ios自己的api判断定位的,时间不充裕,所哟没写。现在一想,直接用sdk里的获取坐标的接口,通过获没获取到来判断就可以了。sdk肯定要兼容 安卓9.0的吧。