[深入 AGMaker] 插件节点 - 将游戏对象旋转至移动速度方向

许可协议

您可以自由地在 Action Game Maker 中使用或修改此插件,用于任何目的,无论是创建免费项目还是商业项目。但是,请勿重新分发它。
署名并非必需,但我们会非常感激。

插件效果

此插件的名称为 ArkAgmRotateToVelocity。其功能是每一帧旋转游戏对象,使其局部物理的“右侧”始终指向其实际速度的方向。

关键点

  • 需要指定一个 GameObject
  • 您可以指定一个最小有效速度平方值(使用平方值效率更高),脚本仅在实际速度超过该值时激活。
  • 支持两种旋转模式:即时和平滑。
  • 在平滑模式下,您可以设置一个值来表示旋转的速度。
  • 最初的设想是制作一个子弹对象,其动画方向始终指向右侧,配合此脚本,它可以根据实际移动方向旋转 360°。

核心

操作步骤

  1. 选择 GameObject 节点。
  2. Ctrl+A 添加一个类型为 Node 的节点,将其重命名为 ArkAgmRotateToVelocity
  3. 选择 ArkAgmRotateToVelocity 并添加一个空的 GDscript。
  4. 复制下方的完整脚本并粘贴到脚本中,然后保存。
  5. 当选中 ArkAgmRotateToVelocity 节点时,您可以在检查器中根据需要调整参数,决定是否启用平滑旋转等功能。

脚本

class_name ArkAgmRotateToVelocity extends Node

enum RotationMode {
	INSTANT,     # 立即旋转
	SMOOTH,      # 平滑旋转
}

@export var game_object: GameObject
@export var rotation_mode: RotationMode = RotationMode.INSTANT  # 旋转模式
@export var rotation_speed: float = 5.0    # 旋转速度(当使用 SMOOTH 模式时使用)
@export var min_velocity_squared: float = 0.1  # 启动旋转的最小速度平方值

func _ready() -> void:
	if not game_object:
		# 尝试获取父节点作为 game_object
		var parent = get_parent()
		if parent and parent is GameObject:
			game_object = parent
		else:
			printerr("[ArkAgmRotateToVelocity] game_object 未设置且父节点不是 GameObject")

func _physics_process(delta: float) -> void:
	if not game_object:
		return
	
	var velocity: Vector2 = game_object.get_real_velocity()
	
	# 如果速度太小,不进行旋转
	if velocity.length_squared() < min_velocity_squared:
		return
		
	# 计算目标角度(速度方向的角度)
	var target_angle = velocity.angle()
	
	match rotation_mode:
		RotationMode.INSTANT:
			# 立即旋转到目标角度
			game_object.rotation = target_angle
		RotationMode.SMOOTH:
			# 平滑旋转到目标角度
			var current_angle = game_object.rotation
			var angle_diff = wrapf(target_angle - current_angle, -PI, PI)
			game_object.rotation = current_angle + angle_diff * min(1.0, rotation_speed * delta)
3 个赞