godot2D游戏教程系列二(22)

0 阅读5分钟

前言:

  • 我是根据b站上的视频进行学习,并且总结写下笔记,然后做此分享。笔记非常详细以至于你可以通过查看文章进行快速学习并且制作出游戏出来。当然视频学习的链接我也放在下面了:
  • 视频学习:www.bilibili.com/video/BV1Nd…
  • 音频/美术资源包下载: pan.baidu.com/s/1mY05SbG3…

完成目标:

实现敌人自动朝向玩家,并添加可视化调试线。


一、添加调试线(Line2D)

  • 给 Enemy 添加 Line2D 子节点
  • 设置两个点(起点在中心,终点向外)
  • 调整粗细、颜色
  • 提高显示层级

作用:

用一条线实时显示“敌人 → 玩家”的方向。


二、通过脚本控制方向线

在敌人脚本中:

  • 获取 Line2D 节点(Ctrl 拖入)

  • 声明 player 变量

  • _ready() 中获取玩家节点

    • 主场景根节点重命名为 SceneRoot
  • _process() 中:

    • 计算 playerDirection = player.global_position - global_position

    • 更新 Line2D 的第二个点:

      • points[1] = playerDirection

注意:

  • 第一个点保持在 (0,0)
  • 未使用的 delta 前加 _ 消除警告

三、把方向向量转换为角度

步骤:

  1. 反转 Y 轴 (Godot 的 Y 轴向下为正)
  2. 使用:
playerDirection.angle()
  1. 得到弧度
  2. rad2deg() 转换为度数

结果:

得到一个角度值。


四、规范角度范围

  • 如果角度 < 0 → 加 360
  • 保证角度在 0~360 之间

目的:

方便判断四个方向。


五、根据角度切换方向

敌人只允许四方向:

  • 45°~135° → Up
  • 135°~225° → Left
  • 225°~315° → Down
  • 其他 → Right

做法:

  • 在 Enemy 脚本中
  • 重写基础角色的方向函数
  • 根据 playerAngle 设置方向

最终效果

  • 敌人始终面向玩家

  • 调试线清晰指示方向

  • 成功实现:

    • 向量 → 弧度 → 角度 → 四方向

敌人具备基础“朝向AI”。

实现过程:

  • 敌人如何判断自己应该朝向哪个方向?是由导航AI系统来控制它的行为。我们希望敌人始终面向玩家
  • 我们希望敌人始终面向玩家。我们即将编写的代码有点复杂,所以最好添加一些视觉调试指示器,添加一条始终指向玩家方向的2D线条
  • 我们右键点击敌人节点,添加一个新的子节点,叫做line2d。这个line2d节点可以帮助我们在屏幕上绘制一条线。这样我们就能在脚本中更新它的属性,让它指向玩家的方向

  • 然后我们来尝试观察一下,我们设置2个点,然后设置第二个点的位置,调整粗细,然后设置颜色,并且将显示图层放到最上面

  • 然后我们来通过脚本让这个线始终指向玩家,我们回到敌人场景脚本中,进行获取这个line2d的节点,按ctrl+拖动这个节点到脚本代码中

  • 接着我们还需要获取玩家的位置,我们来声明一个名为player的变量

  • 然后我们还需要一个变量来追踪玩家的方向

  • 然后我们新建一下ready函数进行获取玩家对象,这里我们先将主场景的根节点重新重命名一下,重命名为SceneRoot

  • 然后我们再到游戏初始化的时候去获取到玩家节点

  • 然后到更新函数里面去更新我们的line2d

  • 然后获取到方向

  • 接下来设置这个line2d节点的第二个点的位置,我们可以通过point属性获取点,point是一个数组,所以需要传入我们想要的点的索引

  • 注意我们不需要改变第一个点,因为第一个点应该始终位于敌人节点的中心位置。所以不用管第一个点,然后我们启动游戏就可以看到这个线了

  • 另外我们处理一下代码中的黄色警告,这个是因为我们并没有使用到这个delta这个参数,所以在这个参数前面加上下划线

  • 接下来我们开始处理敌人的转向功能,我们先声明一个变量var playerAngle: float。我们的敌人只能转向四个方向,所以我们需要找到一种方法,将玩家方向转换为角度值,然后我们可以根据角度来决定敌人应该朝向哪个方向

  • 首先需要反转玩家方向的y值,因为Godot中的y轴是反向的,所以让我们将玩家方向的y值设为其自身的负值

  • 目前,玩家方向是二维向量,我们需要将其转换为角度,所以让我们设置playerAngle的值,然后我们调用一个名为radianToDegree 的函数,将 playerDirection 作为函数参数传入,接着对其调用angle函数。我们在玩家方向上调用的angle 函数是 Vector2的内置函数,它接收一个Vector2并根据其方向转换为角度但返回值是以弧度为单位,而不是度数。通常我们确实需要弧度值来进行某些计算但这里我们希望角度以度数表示。因为用度数表示的值更容易让我们理解。所以我们使用radianToDegree函数将值从弧度转换为度数
  • 相当于就是先把二维向量转换为弧度然后转换为度数

  • 另外我们希望度数在0到360度之间,但我们这里得到的度数可能是负值,当数值大于180度时可能会出现这种情况,所以我们要加一个判断

  • 但是我们如何改变敌人的方向呢?要做到这一点我们需要重写一下基础角色脚本中的方向函数,我们只需要在敌人脚本中再次声明同名函数即可

  • 然后我们启动游戏就可以看到了