godot2D游戏教程系列二(22)

前言:


完成目标:

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


一、添加调试线(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()

  3. 得到弧度

  4. 用 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度时可能会出现这种情况,所以我们要加一个判断
  • 但是我们如何改变敌人的方向呢?要做到这一点我们需要重写一下基础角色脚本中的方向函数,我们只需要在敌人脚本中再次声明同名函数即可
  • 然后我们启动游戏就可以看到了
相关推荐
郝学胜-神的一滴1 小时前
游戏设计:原型与开发 08:我们到底在为谁做游戏
程序人生·游戏·游戏引擎·游戏开发·游戏策划
大叔学Linux1 小时前
FreeRTOS任务切换笔记
arm开发·笔记
别动我齐刘海2 小时前
机器人 C++ / 系统联调补强2——异常处理、Protobuf
linux·c++·人工智能·学习·算法·机器学习·机器人
五仁烧饼2 小时前
动手学 Shader Graph(二):溶解与边缘发光
游戏·unity·shader·shader graph
一直C2 小时前
嵌入式 Linux 驱动开发学习笔记:内核定时器、platform 总线与 I²C 驱动
linux·驱动开发·嵌入式硬件·学习·imx6ull
承渊政道3 小时前
Linux网络学习【传输层协议UDP】
linux·网络·网络协议·学习·ubuntu·udp
andrsted3 小时前
练题簿免费刷题小程序:和学习搭子共用一份题库,一起刷题复习
学习·面试·微信小程序·小程序·学习方法·刷题
fqbqrr3 小时前
2610学习,ahk学习技巧
学习
fengci.3 小时前
BUUCTF(困难部分)
android·开发语言·前端·学习·php
有Li4 小时前
基于超高分辨率CT智能分割与测量的单侧梅尼埃病内耳解剖特征定量研究文献速递/医学智能体前沿
大数据·人工智能·学习·文献·医学生