godot4人物移动一段距离后随机旋转代码,(死循环)

extends CharacterBody3D

@export var move_speed:float = 2.0
@export var rotation_speed:float = 1.5
@export var move_distance:float = 5

var current_direction:Vector3 = Vector3.MODEL_FRONT
var distance_moved:float = 0.0
enum Action {idle,move,rotate}
var current_action = Action.idle

var target_random_rotate_rand

func _ready() -> void:
    current_action = Action.move
    
func _physics_process(delta: float) -> void:
    match current_action:
        Action.move:
            handle_move(delta)
        Action.rotate:
            handle_rotate(delta)
func handle_move(delta):
    velocity = current_direction * move_speed
    move_and_slide()
    distance_moved += move_speed * delta
    if distance_moved >= move_distance:
        distance_moved = 0.0
        #target_random_rotate_rand = rotation.y+randf_range(-90,90)
        #约-45°到45°
        target_random_rotate_rand = rotation.y + randf_range(-PI/4, PI/4)
        #print_debug(target_random_rotate_angle)
        current_action = Action.rotate
func handle_rotate(delta):
    var current_angle = rotation.y
    var new_rand = lerp_angle(current_angle,target_random_rotate_rand,delta*rotation_speed)
    rotation.y = new_rand
    # 计算角度差值(考虑角度循环性)
    var diff = abs(target_random_rotate_rand - new_rand)
    var rotation_diff = min(diff,2*PI - diff)
    if rotation_diff < 0.1:
        current_direction = Vector3.MODEL_FRONT.rotated(Vector3.UP,new_rand)
        current_action = Action.move
    #self.rotation_degrees.y = target_random_rotate_angle
    
    pass

 

posted on 2025-09-15 14:32  小沙盒工作室  阅读(11)  评论(0)    收藏  举报