许可协议
您可以自由地在 Action Game Maker 中使用或修改此插件,用于任何目的,无论是创建免费项目还是商业项目。但是,请勿重新分发它。
署名并非必需,但我们会非常感激。
插件效果
此插件的名称为 ArkAgmRotateToVelocity。其功能是每一帧旋转游戏对象,使其局部物理的“右侧”始终指向其实际速度的方向。
关键点
- 需要指定一个
GameObject。 - 您可以指定一个最小有效速度平方值(使用平方值效率更高),脚本仅在实际速度超过该值时激活。
- 支持两种旋转模式:即时和平滑。
- 在平滑模式下,您可以设置一个值来表示旋转的速度。
- 最初的设想是制作一个子弹对象,其动画方向始终指向右侧,配合此脚本,它可以根据实际移动方向旋转 360°。
核心
操作步骤
- 选择 GameObject 节点。
- 按
Ctrl+A添加一个类型为Node的节点,将其重命名为ArkAgmRotateToVelocity。 - 选择
ArkAgmRotateToVelocity并添加一个空的 GDscript。 - 复制下方的完整脚本并粘贴到脚本中,然后保存。
- 当选中
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)