World Streamer学习5
上一个篇的最后,我们已经彻底被源码中的计算物体坐标的地方搞晕了,这个真的不太好懂,幸好的断点下的地方比较准确,才促使这个问题得以解决。
首先,我们在这个地方输出一个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相关推荐
- World Streamer学习4
打开场景:Tutorial World Streamer - Advanced_Game_Float_Fix_Looped_Safe_Place 只显示一个: 选中这个物体之后: 提示将这个strea ...
- World Streamer学习2
reference--World Streamer Manual.pdf chapter4--world streamer details and settings Streaming solutio ...
- World Streamer学习1
1.首先找到插件包,可以淘宝买个便宜的. 2.导入到unity项目:World Streamer v1.9.6.unitypackage 3.文件夹: 4.读World Streamer Manual ...
- 计算机操作系统 - 目录1
目录 概述 进程管理 死锁 内存管理 设备管理 链接 参考资料 Tanenbaum A S, Bos H. Modern operating systems[M]. Prentice Hall Pre ...
- 计算机操作系统 - 目录
计算机操作系统 概述 进程管理 死锁 内存管理 设备管理 链接 参考资料 Tanenbaum A S, Bos H. Modern operating systems[M]. Prentice Hal ...
- 香侬科技Service Streamer:加速深度学习Web服务、极大提高GPU利用率。| 百万人学AI评选
2020 无疑是特殊的一年,而 AI 在开年的这场"战疫"中表现出了惊人的力量.站在"新十年"的起点上,CSDN[百万人学AI]评选活动正式启动.本届评选活动在 ...
- FFMPEG开源音视频项目学习汇总
~非常感谢雷霄骅老师的无私帮助,本文转载自:http://blog.csdn.net/leixiaohua1020/article/details/42658139~ 本文汇总一下自己视音 ...
- Openvino学习之openvino2022.1版安装配置
Openvino学习之openvino2022.1版安装配置 文章目录 Openvino学习之openvino2022.1版安装配置 前言 一.从安装角度看新版本的变化 二.安装 1.官网地址 2.安 ...
- ethereum-etl学习3
ethereum-etl学习3 > ethereumetl stream --start-block 500000 -e block,transaction,log,token_transfer ...
最新文章
- CSS综合复习笔记 01
- c++中用于字符输入的函数
- 图解JavaScript算法排序
- Educational Codeforces Round 76 (Rated for Div. 2) F. Make Them Similar 折半搜索
- spring中文参考手册-核心技术_ioc
- 字符串连接符(Java)
- Android USB Audio accessory设备
- 腾讯优测优分享 | 双卡双待-工程师难言的痛
- matlab 图例自定义,matlab中如何自定义图例_常见问题解析
- 吴恩达机器学习作业6---Support Vector Machines apply in Spam Classification(下)
- lua语言入门学习(三)lua语言的小demo之游戏2048
- HTTP 状态码,404,301,505网络状态码详细说明
- 基于Ogre1.9开发的3D场景编辑器
- linux下bcd文件还原,BCDEDIT命令详解 | 数据恢复实验室 Data Recovery Laboratory
- iphonex中全屏h5的适配
- Hyper-V 2016 系列教程30 机房温度远程监控方案
- 名帖78 苏轼 小楷《金刚经》
- vue 前端导出PDF文件学起来
- GitHub快速学习-一
- 旅行商问题(TSP)与局部搜索算法
热门文章
- java 反射为何耗性能_Java反射的性能成本
- java验证11位手机号_JAVA怎样用数组实现输入手机号码为11位
- 计算机组成原理笔算乘法改进,计算机组成原理(唐朔飞)运算方法 PPT.ppt
- 吉利汽车科创板上市终止:2019年利润腰斩,还存在两大风险问题
- 学习ofbiz 订单支付设计
- 学数据挖掘就要懂数据
- 控制儿童在什么时段使用计算机,win10系统设置控制孩子用电脑的时间的图文步骤...
- zsh: illegal hardware instruction
- 鸿蒙应用开发 | 文本框(Text)和编辑框(TextField)的功能与用法
- Google JavaScript规范