上一个篇的最后,我们已经彻底被源码中的计算物体坐标的地方搞晕了,这个真的不太好懂,幸好的断点下的地方比较准确,才促使这个问题得以解决。

首先,我们在这个地方输出一个log:

可以看到当角色的位置达到了-200之后,再继续走一点,z小于-200,那么此时,currentMove.z=300,而转换之后的pos.z=playerPos.z - currentMove.z

其实呢,pos是目前角色真正的位置,因为一直沿着z的负方向移动,z一直减小,怎么可能突然从-200.2变为99.6了呢?所以在用于计算的时候,pos是角色真正的世界的坐标位置。也就是说这个代码:

public void CheckPositionTiles ()
{Vector3 pos = player.position; //人物的假距离pos -= currentMove; //人物真正的距离int xPosCurrent = (sceneCollection.xSize != 0) ? (int)(Mathf.FloorToInt (pos.x / sceneCollection.xSize)) : 0;int yPosCurrent = (sceneCollection.ySize != 0) ? (int)(Mathf.FloorToInt (pos.y / sceneCollection.ySize)) : 0;int zPosCurrent = (sceneCollection.zSize != 0) ? (int)(Mathf.FloorToInt (pos.z / sceneCollection.zSize)) : 0;

用人物真正的距离各个分量,求得当前是在第几块地形。比如上面的当pos.z=-200.2的时候,-200.2/100=-2.002,向下取整,得到-3。
ok,这个我们明白了,那么问题又来了,currentMove是怎么计算的呢?

我们找到脚本Streamer中的这个变量的引用,可以发现在WorldMover中,对其做了赋值操作:
调用的顺序是这样的,Streamer中的CheckPositionTiles-》worldMover.CheckMoverDistance-》MoveWorld
MoveWorld中进行赋值操作。

worldMover.CheckMoverDistance这个传递过去的参数是xPosCurrent, yPosCurrent, zPosCurrent,是当前要加载的地形的索引。
CheckMoverDistance接收这个参数之后,进行判断处理:
第一个判断:Mathf.Abs (xPosCurrent - xCurrentTile) > xTileRange
这里有3个变量,xPosCurrent自不必说,是传入的当前的地块索引x。
xCurrentTile,这个是计算当前所在地块索引,如果不清楚继续往下看。
xTileRange,这个在WorldMover中的有个注释:Frequency distance of world position restarting, distance in is grid elements.
就是说每个多少块,世界坐标就会重置,如果是2,那么则隔2块格子就进行重置世界坐标。

回到上面,如果加上当前的xCurrentTile为3,而xCurrentTile=0,xTileRange=2,那么3-0>2成立,于是进入if里,执行函数MoveWorld。

Vector3 moveVector = new Vector3 ((xPosCurrent - xCurrentTile) * streamerMajor.sceneCollection.xSize, (yPosCurrent - yCurrentTile) * streamerMajor.sceneCollection.ySize, (zPosCurrent - zCurrentTile) * streamerMajor.sceneCollection.zSize);

moveVector的x分量计算方式为:(xPosCurrent - xCurrentTile) * streamerMajor.sceneCollection.xSize,
(3-0)* 100=300
其他分量类似计算。

接着:

currentMove -= moveVector;

用了一个减号,也就是说,如果世界坐标好过300,那么则将其减去300,回归到初始点在继续走。

再接着:

streamerMajor.player.position -= moveVector;

人物的世界坐标也做同样的处理。

foreach (var item in streamerMajor.loadedScenes) {if (item.loaded && item.sceneGo != null)item.sceneGo.transform.position -= moveVector;}

将所有已经加载的场景,其世界坐标都减去这个moveVector。

将所有跟随地块移动的物体都减去这个moveVector。

foreach (var item in objectsToMove) {if (item != null) {//Debug.Log (item.name);item.position -= moveVector;}}

再接着:

xCurrentTile = xPosCurrent;
yCurrentTile = yPosCurrent;
zCurrentTile = zPosCurrent;streamerMajor.currentMove = currentMove;

更新当前记录值xCurrentTitle,yCurrentTitle,zCurrentTitle。以及streamerMajor中的currentMove。

再接着:

foreach (var item in streamerMinors) {item.currentMove = currentMove;foreach (var scene in item.loadedScenes) {if (scene.loaded && scene.sceneGo != null)scene.sceneGo.transform.position -= moveVector;}}

更新小物件流的中的每个加载场景的世界坐标。

也许你这里看晕了,我们用个图展示下:


不知道上图你能看得懂哇,比如说我们的保持x,y不懂,沿着z轴正向走,那么当走到3的时候,满足了上面的if语句,即3-0=3>2,那么此时将第三块,移动的0的位置,如下图:

再往下走:

再往下走:

ok,你现在应该清楚的知道了,这个是怎样的过程了。

但是还有一个问题,就是AddSceneGO方法中的这个代码是什么意思:

sceneGO.transform.position += currentMove + new Vector3 (scenesArray [posInt].posXLimitMove, scenesArray [posInt].posYLimitMove, scenesArray [posInt].posZLimitMove);

前面的+=currentMove我知道什么意思,但是后面那一坨是什么意思。

不好意思,我好像又懂了,我是多么滴聪明呀,哈哈哈哈。
下面我将一步一步还原这个加载的过程,借助图的方式进行展示。我相信经过和这个图示之后,你们会特别清晰作者的思想是啥。

World Streamer学习5相关推荐

  1. World Streamer学习4

    打开场景:Tutorial World Streamer - Advanced_Game_Float_Fix_Looped_Safe_Place 只显示一个: 选中这个物体之后: 提示将这个strea ...

  2. World Streamer学习2

    reference--World Streamer Manual.pdf chapter4--world streamer details and settings Streaming solutio ...

  3. World Streamer学习1

    1.首先找到插件包,可以淘宝买个便宜的. 2.导入到unity项目:World Streamer v1.9.6.unitypackage 3.文件夹: 4.读World Streamer Manual ...

  4. 计算机操作系统 - 目录1

    目录 概述 进程管理 死锁 内存管理 设备管理 链接 参考资料 Tanenbaum A S, Bos H. Modern operating systems[M]. Prentice Hall Pre ...

  5. 计算机操作系统 - 目录

    计算机操作系统 概述 进程管理 死锁 内存管理 设备管理 链接 参考资料 Tanenbaum A S, Bos H. Modern operating systems[M]. Prentice Hal ...

  6. 香侬科技Service Streamer:加速深度学习Web服务、极大提高GPU利用率。| 百万人学AI评选

    2020 无疑是特殊的一年,而 AI 在开年的这场"战疫"中表现出了惊人的力量.站在"新十年"的起点上,CSDN[百万人学AI]评选活动正式启动.本届评选活动在 ...

  7. FFMPEG开源音视频项目学习汇总

    ~非常感谢雷霄骅老师的无私帮助,本文转载自:http://blog.csdn.net/leixiaohua1020/article/details/42658139~       本文汇总一下自己视音 ...

  8. Openvino学习之openvino2022.1版安装配置

    Openvino学习之openvino2022.1版安装配置 文章目录 Openvino学习之openvino2022.1版安装配置 前言 一.从安装角度看新版本的变化 二.安装 1.官网地址 2.安 ...

  9. ethereum-etl学习3

    ethereum-etl学习3 > ethereumetl stream --start-block 500000 -e block,transaction,log,token_transfer ...

最新文章

  1. CSS综合复习笔记 01
  2. c++中用于字符输入的函数
  3. 图解JavaScript算法排序
  4. Educational Codeforces Round 76 (Rated for Div. 2) F. Make Them Similar 折半搜索
  5. spring中文参考手册-核心技术_ioc
  6. 字符串连接符(Java)
  7. Android USB Audio accessory设备
  8. 腾讯优测优分享 | 双卡双待-工程师难言的痛
  9. matlab 图例自定义,matlab中如何自定义图例_常见问题解析
  10. 吴恩达机器学习作业6---Support Vector Machines apply in Spam Classification(下)
  11. lua语言入门学习(三)lua语言的小demo之游戏2048
  12. HTTP 状态码,404,301,505网络状态码详细说明
  13. 基于Ogre1.9开发的3D场景编辑器
  14. linux下bcd文件还原,BCDEDIT命令详解 | 数据恢复实验室 Data Recovery Laboratory
  15. iphonex中全屏h5的适配
  16. Hyper-V 2016 系列教程30 机房温度远程监控方案
  17. 名帖78 苏轼 小楷《金刚经》
  18. vue 前端导出PDF文件学起来
  19. GitHub快速学习-一
  20. 旅行商问题(TSP)与局部搜索算法

热门文章

  1. java 反射为何耗性能_Java反射的性能成本
  2. java验证11位手机号_JAVA怎样用数组实现输入手机号码为11位
  3. 计算机组成原理笔算乘法改进,计算机组成原理(唐朔飞)运算方法 PPT.ppt
  4. 吉利汽车科创板上市终止:2019年利润腰斩,还存在两大风险问题
  5. 学习ofbiz 订单支付设计
  6. 学数据挖掘就要懂数据
  7. 控制儿童在什么时段使用计算机,win10系统设置控制孩子用电脑的时间的图文步骤...
  8. zsh: illegal hardware instruction
  9. 鸿蒙应用开发 | 文本框(Text)和编辑框(TextField)的功能与用法
  10. Google JavaScript规范