User Tools

Site Tools


events:getting_started_with_godot_in_3d_part_2

Notes for everyone

  • on the player object, add raycast to camera
  • enable it
  • set cast to to -100 on Z axis (y=0)
  • create a new node, call it weapon
  • map a new input map “primary_fire” mouse button
  • add a script to weapon (default empty)
  • set up some variables for the weapon, track ammo code
export var fire_rate = 0.5
export var clip_size = 5
export var reload_rate = 1
 
var current_ammo = clip_size
var can_fire = true
 
func _process(delta):
  if Input.is_action_just_pressed("primary_fire") and can_fire:
    print "Fired weapon"
  • Test that out
func _process(delta):
  if Input.is_action_just_pressed("primary_fire") and can_fire:
    print "Fired weapon"
    can_fire = false
 
    yield(get_tree().create_timer(fire_rate), "timeout")
    can_fire = true
  • Test those changes (try changing the fire rate in the properties box)
  • Simulate reloading
func _process(delta):
  if Input.is_action_just_pressed("primary_fire") and can_fire:
    if current_ammo > 0:
      print "Fired weapon"
      can_fire = false
      current_ammo -= 1
 
      yield(get_tree().create_timer(fire_rate), "timeout")
      can_fire = true
    else:
      print "Reloading"
      yield(get_tree().create_timer(reload_rate), "timeout")
      current_ammo = clip_size
      print "Reload complete"
  • Fix a reload issue (race condition):
export var fire_rate = 0.5
export var clip_size = 5
export var reload_rate = 1
 
var current_ammo = clip_size 
var can_fire = true
var reloading = false
 
func _process(delta):
  if Input.is_action_just_pressed("primary_fire") and can_fire:
    if current_ammo > 0 and not reloading:
      print "Fired weapon"
      can_fire = false
      current_ammo -= 1
 
      yield(get_tree().create_timer(fire_rate), "timeout")
 
      can_fire = true
    elif not reloading:
      print "Reloading"
      reloading = true
      yield(get_tree().create_timer(reload_rate), "timeout")
      current_ammo = clip_size
      reloading = false
      print "Reload complete"
  • Add a child node to the world, a static body, add a meshinstance to it as a child, called it enemy, make it a sphere
  • Add a child node to the staticbody, a collision shape sphere
  • Assign it to a group, (properties, node, “enemies”)
  • add new function:
onready var raycast = $"../Head/Camera/RayCast"
func check_collision():
  if raycast.is_colliding():
    var collider = raycast.get_collider()
     if collider.is_in_group("enemies"):
       collider.queue_free()
       print("Killed "+collider.name)
events/getting_started_with_godot_in_3d_part_2.txt · Last modified: 2020/03/31 17:18 by admin