一、MMO - Massively Multiplayer Online,大型多人在线。
现在的大部分mmo游戏都有了自动寻路功能。点击场景上的一个位置,角色就会自动寻路过去。中间可能会有很多的障碍物,角色会自动绕过障碍物,最终达到终点。使用Unity来开发手游,自动寻路可以有很多种实现方式。
我们要实现一个功能:点击场景中的一个位置,角色可以自动寻路过去。角色会绕过各种复杂的障碍,找到一条理论上”最短路径“。
1.创建地形
2.添加角色
3.创建多个障碍物,尽量摆的复杂一点,来检查Navmesh的可用性和效率。
4.选中地形,在Navigation窗口中,设置Navigation Static
5.依次选中障碍物,在avigation窗口中,设置Navigation Static
6.Navigation窗口中,选择Bake(烘焙)界面,点击Bake按钮,进程场景烘焙,就可以烘焙出寻路网格了
7.为角色添加NavMeshAgent组件。Component->Navigation->Nav Mesh Agent
8.为角色新增一个脚本PlayerController.cs,实现点击目标,自动寻路功能
private NavMeshAgent agent;
private Animator anim;
void Start () {
agent =GetComponent <NavMeshAgent >();
anim =GetComponent <Animator>();
}
// Update is called once per frame
void Update () {
RaycastHit hit;
if(Input .GetMouseButtonDown (0)){
Ray ray=Camera.main.ScreenPointToRay (Input.mousePosition );
if (Physics .Raycast (ray,out hit)){
agent.SetDestination (hit.point );
}
}
if (agent.remainingDistance == 0) {
idle ();
}
else {
walk ();
}
}
void idle(){
anim.SetFloat("idle", 1F);
anim.SetFloat("walk", 0.0F);
anim.SetFloat("run", 0F);
}
void walk(){
anim.SetFloat("idle", 0F);
anim.SetFloat("walk", 1F);
anim.SetFloat("run", 0F);
}
void run(){
anim.SetFloat("idle", 0F);
anim.SetFloat("walk", 0.0F);
anim.SetFloat("run", 1F);
}
二、 之前我们都是用固定的物体作为障碍物,然后烘焙场景。
Unity还提供了动态的障碍物。任何一个GameObject都可以添加Navmesh Obstacle组件,变成一个障碍物。具体步骤是Component->Navigation->Navmesh Obstacle.它有两个属性:半径和高度,可以设置跟你的物品差不多的体积大小。
1、设置Navigation里面Bake的Drop Height的值
2、勾选Navigation里面Object的OffMeshLink Generatic
3、Bake
三、寻路网格层的应用
1、把Navigation里面Bake的Drop Height的值设为0
2、取消勾选Navigation里面Object的OffMeshLink Generatic
3、Bake
4、在Navigation里面Layers创建两个Layers(LayersUp LayersDown)-->Bake
5、选中巨魔,设置巨魔属性(NavMesh Walkable :Default LayersUp或LayersDown
如果大家还有什么困难的话可以关注我的日志:
http://unity.gopedu.com/home.php?mod=space&do=blog&view=me
还可以关注我们的狗刨网: