You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测2D对象完成360度旋转?(Godot引擎场景)

检测2D对象完成360度旋转的简便实现

不需要用检查点数组,直接通过累计旋转增量的方式就能准确检测,这种方法代码更简洁,也能避免检查点带来的误差问题。下面分普通节点和RigidBody2D两种场景给出实现:

普通Node2D节点(用_process)

适合手动控制旋转或非物理驱动的节点:

extends Node2D

# 定义完成旋转的信号
signal full_rotation_completed

# 记录上一帧角度、累计旋转量、是否已触发信号
var last_rotation: float
var total_rotated: float = 0.0
var rotation_triggered: bool = false

func _ready():
    # 初始化上一帧角度为初始旋转值
    last_rotation = rotation
    # 若严格要求从0度开始,可强制设置:
    # rotation = 0.0
    # last_rotation = 0.0

func _process(delta):
    if rotation_triggered:
        return
    
    # 计算当前帧的旋转增量,处理角度自动wrap的情况
    var rotation_delta = rotation - last_rotation
    # 把差值限制在[-π, π],避免跨0度时的错误计算(比如350度到10度,实际是转了20度而非-340度)
    rotation_delta = wrapf(rotation_delta, -PI, PI)
    total_rotated += rotation_delta
    
    # 判断是否完成一圈(TAU等于2π,对应360度)
    if abs(total_rotated) >= TAU:
        full_rotation_completed.emit()
        rotation_triggered = true
        # 若需要重复检测旋转,取消注释下面两行:
        # total_rotated = wrapf(total_rotated, -PI, PI)
        # rotation_triggered = false
    
    # 更新上一帧角度
    last_rotation = rotation

RigidBody2D节点(用_integrate_forces)

物理驱动的刚体必须在物理回调里处理,避免状态不同步:

extends RigidBody2D

signal full_rotation_completed

var last_rotation: float
var total_rotated: float = 0.0
var rotation_triggered: bool = false

func _ready():
    # 从物理状态获取初始角度
    last_rotation = state.transform.rotation

func _integrate_forces(state):
    if rotation_triggered:
        return
    
    # 从物理状态获取当前实时角度
    var current_rotation = state.transform.rotation
    var rotation_delta = current_rotation - last_rotation
    rotation_delta = wrapf(rotation_delta, -PI, PI)
    total_rotated += rotation_delta
    
    if abs(total_rotated) >= TAU:
        full_rotation_completed.emit()
        rotation_triggered = true
        # 重复检测的话取消注释:
        # total_rotated = wrapf(total_rotated, -PI, PI)
        # rotation_triggered = false
    
    last_rotation = current_rotation

为什么这个方法更优

  • 无需预设检查点数组,减少代码冗余和维护成本
  • 逐帧累加增量,能准确处理所有旋转情况(包括快速旋转、跨0度边界)
  • 自动兼容顺时针和逆时针两种旋转方向
  • 可通过简单修改实现重复旋转检测

内容的提问来源于stack exchange,提问作者Monset

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 07:45:19