Unity中使物体自动寻路的方法

在做一个FPS游戏时,需要敌方自动找到玩家方位并向玩家移动,在查找资料(并走了不少坑)后,我试了三个方法,经测试,这三个方法都能实现自动寻路功能。

方法一:使用Mathf.Lerp()方法


代码很简单:

//在enemy.cs(即敌方的脚本)中更新如下代码:
Transmform m_transform;     //获得敌人组件

//在Update()函数中插入如下代码
m_transform.position = 
      new Vector3(Mathf.Lerp(m_transform.position.x,m_layer.m_transform.position.x,m_speed * Time.delta)),
          0,
          Mathf.Lerp(m_transform.position.z,m_layer.m_transform.position.z,m_speed * Time.delta)));

     //Mathf.Lerp(float a,float b,float t)函数表示:从点a以速度t移动至点b

这个方法似乎不需要自动寻路组件NavMeshAgent,不过NavMeshAgent用得更多一些,以下的两个方法都是基于NavMeshAgent的。


设置网格自动寻路的步骤:

1.将要进行Bake(烘焙)的场景设置为static(一定要保证Navigation Static是被勾选的):
这里写图片描述

2.通过Window -> Navgaition打开Navigation界面进行烘焙:
这里写图片描述
点击右下方的Bake(我第一次打开这个的时候一直没注意到这个Bake选项,还以为是这个选项没了!!!),等待它烘焙完成。还有另外一种烘焙方式,参见另一篇文章:http://blog.csdn.net/larry233/article/details/52022735

3.烘焙前:
这里写图片描述
烘焙后:
这里写图片描述

方法二:

简单到不知道怎么形容这个方法…
代码如下:

//先在Start()函数中获得玩家的组件:
m_player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>();

//将自动寻路的目标设置为玩家所在位置
GetComponent<NavMeshAgent>().destination = m_player.m_transform.position;

方法三:使用NavMeshAgent.Move()方法

这个方法是我最初使用的,但是出了很多意想不到的问题,我在正确烘焙场景后解决了这个问题,并使该方法正确执行了。代码如下:

NavMeshAgent m_agent;   //寻路组件

...   //省略中间代码

//在Start()函数中获得NavMeshAgent组件
void Start(){
    ...

    m_agent = GetComponent<NavMeshAgent>(); 
}

//将敌方的速度转化为以s为单位
float speed = m_speed * Time.delta * 0.1f;

m_agent.Move(m_transform.TransformDirection(new Vector3(0,0,speed)));

注1:不管哪种方法,都要将这些代码文件和enemy绑定在一起。

注2:虽然这三种方法都可行,但由于我初学unity,对它们的性能优劣以及差别并不了解,因此这些还有待研究。

posted @ 2016-07-27 21:00  larryking  阅读(21285)  评论(0编辑  收藏  举报