基于腾讯地图SDK的Unity定位交友功能的实现

》层级处理

    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的吧。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值