自动寻径

来源:互联网 发布:php无法加载控制器 编辑:程序博客网 时间:2024/04/29 06:33

 

 
 

在以下这些游戏中都会用到自动寻径!

    MMO - - Massively Multiplayer Online,大型多人在线。

    策略类或战略类(MMOSLG) 

    动作类(MMOACT)。 

    冒险类(MMOAVG)。 

    模拟类游戏(MMOSG) 

    运动类(MMOSPT) 

    赛车类(MMORCG

    角色扮演类(MMORPG

 

    现在的大部分mmo游戏都有了自动寻路功能。点击场景上的一个位置,角色就会自动寻路过去。中间可能会有很多的障碍物,角色会自动绕过障碍物,最终达到终点。使用Unity来开发手游,自动寻路可以有很多种实现方式。

 

一、我们下面要实现一个功能:

    点击场景中的一个位置,角色可以自动寻路过去。角色会绕过各种复杂的障碍,找到一条理论上最短路径

 

接下来一步步完成:

    ①创建地形

    ②添加角色

    ③创建多个障碍物,尽量摆的复杂一点,来检查Navmesh的可用性和效率。

    ④选中地形,在Navigation窗口中,设置Navigation Static

    ⑤依次选中障碍物,在avigation窗口中,设置Navigation Static

    ⑥Navigation窗口中,选择Bake(烘焙)界面,点击Bake按钮,进程场景烘焙,就可以烘焙出寻路网格了

    ⑦为角色添加NavMeshAgent组件。Component->Navigation->Nav Mesh Agent

    ⑧为角色新增一个脚本PlayerController.cs,实现点击目标,自动寻路功能

 

地形效果图:

 

然后添加角色给它附一个脚本,就可以实现自动寻径了!

怪物身上的代码:

    private NavMeshAgent agent;

    private Animator anim;

    void Start () {

        agent = GetComponent<NavMeshAgent>();       //获取自动寻径组件

        anim = GetComponent<Animator>();            //获取动画组件

}

    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)

        {

            AnimationToldle();           //调用下面那个静止不动效果的方法

        }

        else

        {

            AnimationTowalk();          //开始走动方法

        }

}

    public void AnimationToldle()

    {

        anim.SetFloat("idle", 1F);

        anim.SetFloat("walk", 0.0F);

        anim.SetFloat("run", 0F);

    }

    public void AnimationTowalk()

    {

        anim.SetFloat("idle", 0F);

        anim.SetFloat("walk", 1F);

        anim.SetFloat("run", 0F);

    }

}

 

 

二、宠物跟随效果

 

    在一个游戏当中,有很多主角旁边都会更随着一些宠物,这个效果怎么实现的呢?

  看一下下面这段代码:

public Transform troll;              //troll为主角

    private NavMeshAgent agent;

    void Start () {

        agent = GetComponent<NavMeshAgent>();      

}

    void Update () {

    if(troll!=null)

        {

            agent.destination = troll.position - new Vector3(2, 2, 2);  //这是让宠物获取主角的位置,然后始终保持一段距离。

        }

}

注意:宠物也要添加NavMeshAgent 组件。

 

三、Navmesh Obstacle

 

    之前我们都是用固定的物体作为障碍物,然后烘焙场景Unity还提供了动态的障碍物任何一个GameObject都可以添加Navmesh Obstacle组件,变成一个障碍物。

    具体步骤是Component-->Navigation-->Navmesh Obstacle.它有两个属性:半径和高度,可以设置跟你的物品差不多的体积大小。

 

效果图:

 

四、主角从高空下

    1.设置Navigation里面BakeDrop Height的值     //这个值一定要比主角距离地面的高度要大

    2.勾选Navigation里面ObjectOffMeshLink Generatic

    3.点击Bake

 

五、寻路网格层的应用

    1.Navigation里面BakeDrop Height的值设为0

    2.取消勾选Navigation里面ObjectOffMeshLink Generatic

    3.点击Bake

    4.Navigation里面Layers创建两个Layers(LayersUpLayersDown)-->Bake

    5.选中主角,设置主角属性(NavMesh WalkableDefault  LayersUpLayersDown)

 

 

物体上Nav Mesh Agent 组件的属性:

 Radius 半径

Speed 速度,

Acceleration 加速度

Angular Speed 角速度

Stopping distance 制动距离

Auto Traverse OffMesh Link 自动遍历OffMesh链接

Auto Repath 自动重新寻路

Height 高度

Base offset 基本偏移

Obstacle Avoidance Type 障碍躲避类型

NavMesh Walkable 导航网格行走

 

 

更多精彩而尽在:http://www.gopedu.com/

0 0
原创粉丝点击