今天也要直播魔法,求科学的!

  欢迎来到小妖精Balous的完美游戏教室!

  在上节课,小妖精介绍了怪物路径的实现办法,相信米娜桑已经成功了呢。既然我们已经设计好路径,接下来肯定是要让怪物在路径中移动起来,对吧?所以这节课主要介绍如何让怪物在路径中移动。小妖精相信感兴趣的同学在上周已经在网上查阅过相关的资料,你会发现大家的实现方式都大同小异,这是肯定的嘛,毕竟一些落后的方法已经被淘汰掉了。所以,小妖精教给大家的,都是目前最通用的实现方法啦,希望能帮助到大家。

  好啦,言归正传,如果实现怪物的移动。

  其实移动,说白了就是改变怪物的世界坐标,世界坐标改变了,在玩家看上去就是移动啦。所以呢,要实现移动,就是要算出下一帧,怪物的新坐标。在上节课,我们已经实现了路径,而路径是个链表,也就是说,只要怪物保留了路径链表的头结点,就能够沿着路径走到终点啦,是不是很简单呢。

  既然如此,怪物除了坐标系统外,应该还有下面这些额外的属性:

  /// <summary>
  /// 怪物移动速度
  /// </summary>
  public float moveSpeed;

  /// <summary>
  /// 怪物起始结点
  /// </summary>
  public PathNode startNode;

  拥有这些属性后,加上坐标系统,怪物就能够移动咯^o^,下面我用目前市场占比最高的游戏引擎unity为例子,示范最简单的移动代码该怎么写。

  

/// <summary>
/// 怪物移动方法
/// </summary>
private void Move()
{
  Vector3 currentPos = transform.position;

  //起始结点在运行时用作目标结点
  Vector3 goalPos = startNode.transform.position;

  //如果到达目标结点,更新下一个目标结点
  if(Vector2.Distance(new Vector2(goalPos.x,goalPos.y),new Vector2(currentPos.x,currentPos.y)) < 0.01f)
  {
    //如果到达终点
    if(startNode.nextNode == null)
    {
      Destroy(gameObject);
    }
    startNode = startNode.nextNode;
  }

  //计算移动方向
  Vector3 dir = new Vector3(goalPos.x - currentPos.x, goalPos.y - currentPos.y).normalized;
  transform.Translate(dir * moveSpeed * Time.deltaTime);
}

 

  好啦,这节课就到这里,小妖精会在下节课跟大家见面,byebye~~