Better bullet traces and raycast for hitscan

This commit is contained in:
2025-01-26 10:59:59 +01:00
parent 1c8458048c
commit 7da4a3d6bb
26 changed files with 1444 additions and 292 deletions

View File

@ -3,6 +3,8 @@
# ---------------------------------------------------------------------
class_name PlayerInput extends CharacterBody3D
var health: int = 100
@export_category("PlayerInput")
const SPEED = 5.0
@ -160,15 +162,39 @@ var bullet = load("res://scenes/weapon/bullet.tscn")
@onready var shooting_raycast: RayCast3D = $FirstPersonCameraMount/RayCast3D
@onready var bullet_starting_point: Node3D = $FirstPersonCameraMount/BulletStartingPoint
@onready var aim_ray: RayCast3D = $FirstPersonCameraMount/BulletStartingPoint/AimRay
# --find the gun node and exec shoot
func _shoot():
if aim_ray.is_colliding():
var collider := aim_ray.get_collider()
if collider != null and collider.is_in_group("target"):
aim_ray.get_collider().take_damage()
var root := get_tree().get_root()
#if !gun_anim.is_playing():
#gun_anim.play("Shoot")
gun_with_hands.shoot()
#gun_mount_anim.play("shooting")
var node: Node3D = bullet.instantiate()
node.position = bullet_starting_point.global_position
node.transform.basis = bullet_starting_point.global_transform.basis
root.add_child(node)
func _get_camera_collision():
var viewport = get_viewport().size
var ray_origin = first_view_camera.project_ray_origin(viewport / 2)
var ray_end = ray_origin + first_view_camera.project_ray_normal(viewport / 2 * 100)
var new_intersection = PhysicsRayQueryParameters3D.create(ray_origin, ray_end)
var intersection = get_world_3d().direct_space_state.intersect_ray(new_intersection)
if not intersection.is_empty():
var collision_point = intersection.position
print("gotcha")
return collision_point
else:
return ray_end
func _hit_scan_collision(collision_point):
var viewport = get_viewport().size
var ray_origin = first_view_camera.project_ray_origin(viewport / 2)
var ray_end = ray_origin + first_view_camera.project_ray_normal(viewport / 2 * 100)
var new_intersection = PhysicsRayQueryParameters3D.create(ray_origin, ray_end)
var bullet_collision = get_world_3d().direct_space_state.intersect_ray(new_intersection)
if bullet_collision:
print(bullet_collision)
_hit_scan_damage(bullet_collision.collider)
func _hit_scan_damage(Collider):
#if Collider.is_in_group("target") and Collider.has_method("take_damage"):
print("damaged")