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

首先,我们在这个地方输出一个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. hdfs haadmin使用,DataNode动态上下线,NameNode状态切换管理,数据块的balance,HA下hdfs-api变化(来自学习资料)
  2. C++类静态成员与类静态成员函数
  3. 前端学习(2386):远程仓库的issue
  4. 会玩弹珠也可以拿来炫了?是的,这个技能燃爆了!
  5. mysql的dql_Mysql-DQL
  6. Count on a tree SPOJ 10628 主席树+LCA(树链剖分实现)(两种存图方式)
  7. php搭建h5商城,关于PHP的H5商城网站开发方案
  8. 关于CWMP基础(二)----TR069通信流程
  9. 解决百度网盘下载慢,提速下载
  10. 绿色风格资格证书学校培训机构网站源码 织梦dedecms模板 带手机版
  11. [CF235C] Cyclical Quest
  12. 小众但口碑好的便签软件
  13. HDU-6441-Find Integer-费马大定理+奇偶数列法则
  14. 如何把1个pdf拆分几个pdf
  15. 今年春节,全国物流很稳!
  16. 解决JDBC中Parameter number X is not an OUT parameter
  17. G16、G24、G32、G36、G60
  18. Molecular Psychiatry:海马及其相关网络在电休克抗抑郁中的机制研究
  19. 数据库数据表的创建练习
  20. 洛谷 4830 Tomoya loves Nagisa

热门文章

  1. PHP的realpath(...)
  2. matlab 矩阵分解
  3. SWF是什么文件,SWF文件用什么软件可以打开 1
  4. questasim的傻瓜式安装与仿真教程
  5. 应聘上海辉颐系统集成量化研究员需要什么条件?
  6. 通过Amazon SageMaker与Amazon Step Functions实现机器学习的CI/CD 方案
  7. RSD的PANSHARP融合——以GF2为例
  8. java1逻辑运算符作业(16道)
  9. 第三人称计算机获奖感言,玄彬获奖感言感谢女友孙艺珍 惹众网友羡慕
  10. 并发编程(五)——生产者消费者模式