Hi, what code should I write so that when my player enters the enemy raycast range

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By abbas zangaraky

Hi, what code should I write so that when my player enters the enemy raycast range, my player is killed and the game starts again?

 extends KinematicBody

const MOVE_SPEED = 4
const MOUSE_SENS = 0.5

onready var anim_player = $AnimationPlayer
onready var raycast = $RayCast

func _ready():
	Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
	yield(get_tree(), "idle_frame")
	get_tree().call_group("zombies", "set_player", self)

func _input(event):
	if event is InputEventMouseMotion:
		rotation_degrees.y -= MOUSE_SENS * event.relative.x

func _process(delta):
	if Input.is_action_pressed("exit"):
		get_tree().quit()
	if Input.is_action_pressed("restart"):
		kill()

func _physics_process(delta):
	var move_vec = Vector3()
	if Input.is_action_pressed("move_forwards"):
		move_vec.z -= 1
	if Input.is_action_pressed("move_backwards"):
		move_vec.z += 1
	if Input.is_action_pressed("move_left"):
		move_vec.x -= 1
	if Input.is_action_pressed("move_right"):
		move_vec.x += 1
	move_vec = move_vec.normalized()
	move_vec = move_vec.rotated(Vector3(0, 1, 0), rotation.y)
	move_and_collide(move_vec * MOVE_SPEED * delta)
	
	if Input.is_action_pressed("shoot") and !anim_player.is_playing():
		anim_player.play("shoot")
		var coll = raycast.get_collider()
		if raycast.is_colliding() and coll.has_method("kill"):
			coll.kill()

func kill():
	get_tree().reload_current_scene()

This my player script
And

extends KinematicBody

const MOVE_SPEED = 3

onready var raycast = $RayCast
onready var anim_player = $AnimationPlayer

var player = null
var dead = false

func _ready():
	anim_player.play("walk")
	add_to_group("zombies")

func _physics_process(delta):
	if dead:
		return
	if player == null:
		return
	
	var vec_to_player = player.translation - translation
	vec_to_player = vec_to_player.normalized()
	raycast.cast_to = vec_to_player * 1.5
	
	move_and_collide(vec_to_player * MOVE_SPEED * delta)
	
	if raycast.is_colliding():
		var coll = raycast.get_collider()
		if coll != null and coll.name == "Player":
			coll.kill()

func kill():
	dead = true
	$CollisionShape.disabled = true
	anim_player.play("die")

func set_player(p):
	player = p

This my zombie script

I’m not seeing any problem in your scripts. It could be a collision layer issue, or it could be that the raycast’s collide_with_bodies property has been set to false.

What is the problem exactly? Is there nothing happening when zombies get close to the player?

Could you post which collision layers and masks you’ve set on the player, zombies and raycasts? Could you also check that your raycasts have collide_with_bodies equal to true in the inspector?

Bernard Cloutier | 2020-10-14 14:44

:bust_in_silhouette: Reply From: Magso

Your script is fine except for this part

var coll = raycast.get_collider()
    if raycast.is_colliding() and coll.has_method("kill"):
        coll.kill()

Like in the zombie script you need to check if is_colliding is true before get_collider or else it will throw an error return null.

if raycast.is_colliding()
    var coll = raycast.get_collider()
    if coll.has_method("kill"):
        coll.kill()

https://docs.godotengine.org/en/stable/classes/class_raycast.html#class-raycast-method-get-collider

get_collider() returns null if is_colliding() is false. His script won’t throw since he checks is_colliding() before using coll.

Bernard Cloutier | 2020-10-14 14:38

You’re right, I was thinking along the lines of intersect_ray() which throws an error if it returns null and is used regardless.

Magso | 2020-10-14 14:51