Brackeys:
NavMesh组件与Example project:GitHub - Brackeys/NavMesh-Tutorial: Tutorial project files on using NavMesh in Unity.
目标,鼠标点击一个地方,Player将选择最短的到达该目的地
首先,Create Empty并命名为Navmesh,并添加NavMeshSurface
然后点击Bake ,那些蓝绿色的地方就是可以行走的地方
NavMeshSurface
NavMesh Surface组件表示特定NavMeshAgent类型的可以行走区域,并定义场景中应构建NavMesh的部分。
Agent Type:使用NavMesh Surface的NavMesh agent的类型。用于Bake设置,并在寻路期间将NavMeshAgent与正确的Surface匹配。
可以在Agent Type中场景自己想要的类型
并设置Name(名称),Radius(该代理的半径大小),Height(该代理的高度),Step Height(每行走一步的距离),Max Slope(最大斜率,爬坡能力)
再次在NavSurface中Agent Type设置自己的Agent Type会有不一样的行走路径
Collect Objects:定义用于烘培的游戏对象。
Include Layers:定义Bake中包含的对象层。
Use Geometry:选择要用于Bake的几何图形;
--Render Meshed(渲染网格):使用渲染网格和地形中的几何体
--Physisc Collider(物理碰撞器):使用碰撞器和地形中的几何体。与渲染网格选项相比,使用此选项的代理可以更加靠近物理环境的边缘。
绿色的圆柱体是我们的玩家Player,可以看到Player也被当成场景中的一部分给Bake了。但是我们不希望Player被Bake。
我们可以改变Player的层使其不被Bake
创建一个Player层,并将它赋值给Player
然后在NavMesh的include Layers中的Player层取消掉。
再次点击Bake,我们可以看到,Player已经没有被Bake了
在上图中我们可以看到墙里面还是被允许走动的,但是我们并不希望它被允许走在里面。
所以给Walls去添加NavMesh Modifier组件去修改 Walls
NavMesh Modifier:
NavMesh Modifier调整特点游戏对象在NavMesh期间的行为
NavMesh Modifier按层次影响游戏对象,这意味着组件所吸附着的游戏对象及其所有子对象都会受到影响。此外,如果在变化层次的更下方发现另一个NavMeshModifier,则下面的NavMeshModifier则会覆盖层次的上方的NavMeshModifer
Ignore Form Bulid:选择此复选框可以将游戏对象的所有子对象从BuildProcess中排除
Override Area Type:选择此复选框可以更改包含修改器及其所有子对象的GameObject的区域类型
Area Type:下拉菜单中选择要应用的新面积类型
Affected Agents:Modifier影响的agent选择。例如,可以选择从特点代理在排除某障碍
并且给Player添加NavMeshAgent组件
NavMeshAgent:该组件连接到游戏中的移动角色,以允许其使用NavMesh的导航场景
接下来我们需要编写代码让Player自动寻找最短路径到达目的地
值得特别注意的是,需要给Ground添加Box Collider组件,因为射线的投射需要碰撞器才能撞击地面
摄像机获取射线:
Ray:
Ray:射线是一条从原点开始并沿某个方向沿某个方向延伸的无限线。
RaycastHit:
Description:用于从射线投射中获取信息的结构
RayCastHit.Point:世界空间中射线碰撞碰撞器的碰撞点
ScreenPointToRay()函数的实现原理:
返回从摄像机穿过屏幕点的射线。生成的射线在世界空间中,从相机的近屏幕上的位置(x,y)像素坐标(忽略z轴)。
Unity 中的 ScreenPointToRay 方法:https://blog.lujun.co/2019/08/14/unity_camera_screen_point_to_ray/
Physics.Raycast: