Better bullet traces and raycast for hitscan
This commit is contained in:
@ -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")
|
||||
|
Reference in New Issue
Block a user