为什么我无法在 Godot 中使用 GDScript 制作射弹武器

Why i am not able to make a projectile weapon using GDScript in Godot

我想用 GDScript 制作弹射武器,但出现错误:

the function " _physics _process " already exists in this class (at line 35)

我无法删除有错误的代码行,就像我这样做一样,我将无法让我的 FPS 控制器角色移动

代码如下:

extends KinematicBody

var speed = 9
const ACCEL_DEFAULT = 7
const ACCEL_AIR = 1
onready var accel = ACCEL_DEFAULT
var gravity = 9.8
var jump = 4
var damage = 100

var cam_accel = 40
var mouse_sense = 0.1
var snap

var direction = Vector3()
var velocity = Vector3()
var gravity_vec = Vector3()
var movement = Vector3()

onready var head = $Head
onready var camera = $Head/Camera
onready var bullet = preload("res://player/world/bullet/bullet.tscn")
onready var muzzle = $Head/Gun/Muzzle
func _ready():
    #hides the cursor
    Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)

func _input(event):
    
    if event is InputEventMouseMotion:
        rotate_y(deg2rad(-event.relative.x * mouse_sensitivity)) 
        head.rotate_x(deg2rad(-event.relative.y * mouse_sensitivity)) 
        head.rotation.x = clamp(head.rotation.x, deg2rad(-90), deg2rad(90))

func _physics_process(delta):
    
    direction = Vector3()
    
    if Input.is_action_just_pressed("fire"):
        if aimcast.is_colliding():
            var b = bullet.instance()
            muzzle.add_child(b)
            b.look_at(aimcast.get_collision_point(), Vector3.UP)
            b.shoot = true
    

func _process(delta):
    #camera physics interpolation to reduce physics jitter on high refresh-rate monitors
    if Engine.get_frames_per_second() > Engine.iterations_per_second:
        camera.set_as_toplevel(true)
        camera.global_transform.origin = camera.global_transform.origin.linear_interpolate(head.global_transform.origin, cam_accel * delta)
        camera.rotation.y = rotation.y
        camera.rotation.x = head.rotation.x
    else:
        camera.set_as_toplevel(false)
        camera.global_transform = head.global_transform
    
    # this is the line of code which is causing the error
(
func _physics_process(delta):
    #get keyboard input
    direction = Vector3.ZERO
    var h_rot = global_transform.basis.get_euler().y
    var f_input = Input.get_action_strength("move_backwards") - Input.get_action_strength("move_forward")
    var h_input = Input.get_action_strength("move_right") - Input.get_action_strength("move_left")
    direction = Vector3(h_input, 0, f_input).rotated(Vector3.UP, h_rot).normalized()
    
    #jumping and gravity
    if is_on_floor():
        snap = -get_floor_normal()
        accel = ACCEL_DEFAULT
        gravity_vec = Vector3.ZERO
    else:
        snap = Vector3.DOWN
        accel = ACCEL_AIR
        gravity_vec += Vector3.DOWN * gravity * delta
        
    if Input.is_action_just_pressed("jump") and is_on_floor():
        snap = Vector3.ZERO
        gravity_vec = Vector3.UP * jump
    
    #make it move
    velocity = velocity.linear_interpolate(direction * speed, accel * delta)
    movement = velocity + gravity_vec
    
    move_and_slide_with_snap(movement, snap, Vector3.UP)  )

错误:

"_physics_process" already exists in this class

告诉你,你的脚本中有两次 _physics_process。你只能拥有一个。

这是第一个:

func _physics_process(delta):
   
   direction = Vector3()
   
   if Input.is_action_just_pressed("fire"):
       if aimcast.is_colliding():
           var b = bullet.instance()
           muzzle.add_child(b)
           b.look_at(aimcast.get_collision_point(), Vector3.UP)
           b.shoot = true

这是第二个:

func _physics_process(delta):
   #get keyboard input
   direction = Vector3.ZERO
   var h_rot = global_transform.basis.get_euler().y
   var f_input = Input.get_action_strength("move_backwards") - Input.get_action_strength("move_forward")
   var h_input = Input.get_action_strength("move_right") - Input.get_action_strength("move_left")
   direction = Vector3(h_input, 0, f_input).rotated(Vector3.UP, h_rot).normalized()
   
   #jumping and gravity
   if is_on_floor():
       snap = -get_floor_normal()
       accel = ACCEL_DEFAULT
       gravity_vec = Vector3.ZERO
   else:
       snap = Vector3.DOWN
       accel = ACCEL_AIR
       gravity_vec += Vector3.DOWN * gravity * delta
       
   if Input.is_action_just_pressed("jump") and is_on_floor():
       snap = Vector3.ZERO
       gravity_vec = Vector3.UP * jump
   
   #make it move
   velocity = velocity.linear_interpolate(direction * speed, accel * delta)
   movement = velocity + gravity_vec
   
   move_and_slide_with_snap(movement, snap, Vector3.UP)

我猜你两者都想要。因此,将它们合并为一个,并使用来自两者的代码:

func _physics_process(delta):
   
   direction = Vector3()
   
   if Input.is_action_just_pressed("fire"):
       if aimcast.is_colliding():
           var b = bullet.instance()
           muzzle.add_child(b)
           b.look_at(aimcast.get_collision_point(), Vector3.UP)
           b.shoot = true

   #get keyboard input
   direction = Vector3.ZERO
   var h_rot = global_transform.basis.get_euler().y
   var f_input = Input.get_action_strength("move_backwards") - Input.get_action_strength("move_forward")
   var h_input = Input.get_action_strength("move_right") - Input.get_action_strength("move_left")
   direction = Vector3(h_input, 0, f_input).rotated(Vector3.UP, h_rot).normalized()
   
   #jumping and gravity
   if is_on_floor():
       snap = -get_floor_normal()
       accel = ACCEL_DEFAULT
       gravity_vec = Vector3.ZERO
   else:
       snap = Vector3.DOWN
       accel = ACCEL_AIR
       gravity_vec += Vector3.DOWN * gravity * delta
       
   if Input.is_action_just_pressed("jump") and is_on_floor():
       snap = Vector3.ZERO
       gravity_vec = Vector3.UP * jump
   
   #make it move
   velocity = velocity.linear_interpolate(direction * speed, accel * delta)
   movement = velocity + gravity_vec
   
   move_and_slide_with_snap(movement, snap, Vector3.UP)

这应该可以解决当前的错误。 我没有深入研究代码以解决任何其他可能的问题。