欢迎来到天天文库
浏览记录
ID:34497412
大小:71.16 KB
页数:6页
时间:2019-03-07
《角色控制-点击移动以及自动寻路》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、角色控制-点击移动以及自动寻路角色控制-点击移动以及自动寻路(一)之前在D3D中做的人物控制里,在空间中两点之间行走是一个比较复杂的制作过程。跟大家分享一下我的制作过程,可以一起研究改进改进。这里面需要解决几个问题:1.如何取得目标地点需要通过鼠标当前位置的屏幕二维坐标,逆矩阵变换到世界空间下,做从摄像机到这个点的射线。射线与地面mesh进行碰撞检测,获得一个交点,就是目标点。2.如何移动角色实时得出角色的移动方向向量,在两点之间做线性插值计算,移动的同时也要播放动画。3.两点之间有障碍怎么办这个过程是
2、一个比较复杂的过程,可以通过两种办法,一种是做一种转向机制,先移动监测点(我自己起的,意思是一个前进向量和一个向下的碰撞向量的假象交点),监测到碰撞了,就将角色转向,再次监测,直到碰撞不到,向当前挪一步,再重复刚才的操作,直到绕过这个障碍物;另一种是俗称的A*算法,需要预先准备好一个二维图来标记哪里可以走,哪里不可以走,并设置权值,以便于计算最短路径。4.Unity3D里的碰撞需要注意什么射线的碰撞检测是比较耗费CPU资源的,推荐的是尽量少用,比如当做场景内物体的鼠标拾取时,对备选对象队列进行筛选后,再
3、去逐一做检测。unity3d中也是一样,只不过没有提供像DX中提供的那种API,无法用自定义的结构去决定对哪些对象进行射线碰撞。所以要引入Layer的概念,具体的操作下节说。角色控制-点击移动以及自动寻路(二)针对上一节中第四点--筛选待测物体来说一下U3D中Layer的用法。U3D中的Layer可以简单地理解为一个集合,所有的GameObject都可以设置Layer,且只能设置一个Layer。设置方法:1.Edit->rojectSetting->Tags(tag和layer在同一个设置面板上)2.前
4、几个BuiltinLayer是系统默认的,不能修改,可以在后面几个Layer中,设置Layer的名称,比如"layers"3.在Hierarchy面板中选择GameObject,在Inspector面板上面的Layer下拉框中选择刚才设置好的Layer从此,该GameObject就属于这个Layer集合中的一员了。Layer的应用:LayerMaskLayerMask可以在射线碰撞过程中屏蔽掉一些GameObject。LayerMask的方法:LayerMask.NameToLayer("layers"
5、)返回该Layer的编号LayerMask.LayerToName(8)返回该Layer的名称varlayerMaskPlayersayerMask=1<6、layerMaskTerrains.value);varhi7、tt:RaycastHit;varray:Ray=mainCamera.ScreenPointToRay(Input.mousePosition);if(Physics.Raycast(ray, hitt,600,FinalMask.value)){...}上面代码描述一个鼠标拾取规则,射线仅与Layer属于Players和Terrains的GameObject做碰撞。LayerMask的使用是按位操作的,在设置新的Layer时可以看到一共只有32个,应该是因为记录Layer的变量是四个字节。Laye8、rMask.NameToLayer方法返回的LayerId是所要移位的位数,比如在设置Layer时,Players这个Layer的ID是8,则varlayerMaskPlayers:LayerMask=1<9、askPlayers=1<<8;则layerMaskPlayers=100000000;在双字长的情况下,~layerMaskPlayers.value=-257二进制表示:11111111111111111111111011111111角色控制-点击移动以及自动寻路(三)为鼠标点击的位置增加一个光圈。需求如下:鼠标右键点击地面,射线与地面的交点处出现一个光圈(纹理动画)。该纹理动画会旋转,跟游戏中一样。玩家移动到该光圈处,或者进入了其他状
6、layerMaskTerrains.value);varhi
7、tt:RaycastHit;varray:Ray=mainCamera.ScreenPointToRay(Input.mousePosition);if(Physics.Raycast(ray, hitt,600,FinalMask.value)){...}上面代码描述一个鼠标拾取规则,射线仅与Layer属于Players和Terrains的GameObject做碰撞。LayerMask的使用是按位操作的,在设置新的Layer时可以看到一共只有32个,应该是因为记录Layer的变量是四个字节。Laye
8、rMask.NameToLayer方法返回的LayerId是所要移位的位数,比如在设置Layer时,Players这个Layer的ID是8,则varlayerMaskPlayers:LayerMask=1<9、askPlayers=1<<8;则layerMaskPlayers=100000000;在双字长的情况下,~layerMaskPlayers.value=-257二进制表示:11111111111111111111111011111111角色控制-点击移动以及自动寻路(三)为鼠标点击的位置增加一个光圈。需求如下:鼠标右键点击地面,射线与地面的交点处出现一个光圈(纹理动画)。该纹理动画会旋转,跟游戏中一样。玩家移动到该光圈处,或者进入了其他状
9、askPlayers=1<<8;则layerMaskPlayers=100000000;在双字长的情况下,~layerMaskPlayers.value=-257二进制表示:11111111111111111111111011111111角色控制-点击移动以及自动寻路(三)为鼠标点击的位置增加一个光圈。需求如下:鼠标右键点击地面,射线与地面的交点处出现一个光圈(纹理动画)。该纹理动画会旋转,跟游戏中一样。玩家移动到该光圈处,或者进入了其他状
此文档下载收益归作者所有