improved aiming accuracy

This commit is contained in:
Rowan 2025-06-21 23:48:43 -04:00
parent 42492595df
commit e12ca0bb66
5 changed files with 78 additions and 44 deletions

View file

@ -19,6 +19,10 @@ config/icon="res://icon.svg"
PhantomCameraManager="*res://addons/phantom_camera/scripts/managers/phantom_camera_manager.gd"
[debug_draw_3d]
settings/addon_root_folder="res://addons/debug_draw_3d/addons/debug_draw_3d"
[editor_plugins]
enabled=PackedStringArray("res://addons/FreeControl/plugin.cfg", "res://addons/godot_object_serializer/plugin.cfg", "res://addons/phantom_camera/plugin.cfg")
@ -123,6 +127,7 @@ ui_close_inventory={
[layer_names]
3d_physics/layer_2="interaction"
3d_physics/layer_3="ground"
[physics]

View file

@ -33,11 +33,13 @@ transform = Transform3D(50, 0, 0, 0, 50, 0, 0, 0, 50, 0, 0, 0)
mesh = SubResource("PlaneMesh_rd3vj")
[node name="StaticBody3D" type="StaticBody3D" parent="MeshInstance3D"]
collision_layer = 5
[node name="CollisionShape3D" type="CollisionShape3D" parent="MeshInstance3D/StaticBody3D"]
shape = SubResource("WorldBoundaryShape3D_w7c3h")
[node name="Player" parent="." instance=ExtResource("1_2q6dc")]
aim_offset = Vector3(0, 1.5, 1.25)
[node name="PhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")]
transform = Transform3D(1, 0, 0, 0, 0.707106, 0.707106, 0, -0.707106, 0.707106, 0, 10, 10)

View file

@ -2,7 +2,7 @@
[ext_resource type="PackedScene" uid="uid://dpmbimh6m4ari" path="res://scenes/player_mesh.tscn" id="1_3vyb7"]
[ext_resource type="Script" uid="uid://50vv0ta67tgl" path="res://src/player.gd" id="1_qhqgy"]
[ext_resource type="Script" uid="uid://877g2wvcupw6" path="res://src/player_input.gd" id="3_dqkch"]
[ext_resource type="Script" uid="uid://cngjp2wws4ld2" path="res://src/player_input.gd" id="3_dqkch"]
[ext_resource type="Script" uid="uid://c3wlcxy4vnm2i" path="res://src/interactor.gd" id="4_dqkch"]
[ext_resource type="Script" uid="uid://csjl56hf0fnoy" path="res://src/item_container.gd" id="5_qlg0r"]
[ext_resource type="Script" uid="uid://k1ihjmhj7ix" path="res://src/equipment_handler.gd" id="5_smehm"]
@ -195,19 +195,21 @@ transitions = ["Start", "Unarmed", SubResource("AnimationNodeStateMachineTransit
[node name="Player" type="CharacterBody3D" node_paths=PackedStringArray("input", "interactor", "equipment") groups=["persist"]]
script = ExtResource("1_qhqgy")
aim_offset = Vector3(0, 6, 0)
input = NodePath("Input")
interactor = NodePath("Interactor")
equipment = NodePath("Weapon")
[node name="Input" type="Node" parent="."]
script = ExtResource("3_dqkch")
ground_collision_mask = 4
[node name="Inventory" type="Node" parent="."]
script = ExtResource("5_qlg0r")
inventory = ExtResource("6_tuyoq")
[node name="Weapon" type="BoneAttachment3D" parent="."]
transform = Transform3D(0.00876506, 0.0120414, 0.00178277, 0.00882159, -0.00779736, 0.00929411, 0.00838767, -0.00438243, -0.0116379, -0.128585, 1.36723, 0.500051)
transform = Transform3D(0.00788866, 0.0124171, 0.00292984, 0.00882159, -0.00779736, 0.00929411, 0.00921674, -0.00316481, -0.0114033, -0.177614, 1.36723, 0.484807)
bone_name = "mixamorigRightHandMiddle1"
bone_idx = 24
use_external_skeleton = true
@ -232,6 +234,7 @@ transform = Transform3D(1.2, 0, 0, 0, 1.2, 0, 0, 0, 1.2, 0, 1, 0)
shape = SubResource("CapsuleShape3D_g2els")
[node name="Mesh" parent="." instance=ExtResource("1_3vyb7")]
transform = Transform3D(0.995056, 0, -0.0993198, 0, 1, 0, 0.0993198, 0, 0.995056, 0, 0, 0)
[node name="AnimationTree" type="AnimationTree" parent="."]
root_node = NodePath("../Mesh")

View file

@ -2,6 +2,7 @@ class_name Player extends CharacterBody3D
@export var walk_speed: float = 4.0
@export var run_speed: float = 6.0
@export var aim_offset: Vector3 = Vector3(0, 1.3, 0)
@export var input: PlayerInput
@export var interactor: Interactor
@ -37,7 +38,15 @@ func rotate_toward_look(_delta: float):
velocity = Vector3.ZERO
var target = input.get_look_target(global_position)
if target.is_some():
look_at(target.unwrap(), Vector3.UP, true)
var target_point = target.unwrap()
var mouse_dir = (target_point - global_position)
if mouse_dir.length_squared() > 0.0001:
var desired_basis = Basis.looking_at(mouse_dir.normalized(), Vector3.UP)
var yaw = desired_basis.get_euler().y
rotation.y = fmod(yaw + PI, TAU)
rotation.x = 0.0
rotation.z = 0.0
func _on_interact():
interactor.interact_nearest()

View file

@ -34,6 +34,8 @@ signal ready_weapon
signal unready_weapon
signal fire
@export_flags_3d_physics var ground_collision_mask: int = 0
var last_known_device: Device = Device.Unknown
var _is_running: bool = false
@ -76,19 +78,11 @@ var movement_dir: Vector2:
'move_up', 'move_down'
).normalized()
var _mouse_position: Vector2:
get:
var viewport = get_viewport()
var mouse_pos = viewport.get_mouse_position()
var cam = viewport.get_camera_3d()
var space_state = cam.get_world_3d().direct_space_state
var origin = cam.project_ray_origin(mouse_pos)
var end = origin + (cam.project_ray_normal(mouse_pos) * cam.far)
var query = PhysicsRayQueryParameters3D.create(origin, end)
var _active_camera: Camera3D:
get: return get_viewport().get_camera_3d()
var result = space_state.intersect_ray(query)
var position = result.get('position') as Vector3
return Vector2(position.x, position.z)
var _mouse_position: Vector2:
get: return get_viewport().get_mouse_position()
var _analog_dir: Vector2:
get: return Input.get_vector(
@ -131,11 +125,32 @@ func _unhandled_input(event: InputEvent) -> void:
func next_velocity(speed: float, dir: Vector2 = movement_dir) -> Vector3:
return Vector3(dir.x, 0, dir.y) * speed
func get_mouse_look() -> Vector3:
var cam: Camera3D = _active_camera # Use your convenient getter
if not cam:
return Vector3.ZERO # Should not happen, but good for safety
var mouse_pos = _mouse_position # Your 2D mouse position getter
var ray_origin = cam.project_ray_origin(mouse_pos)
var ray_direction = cam.project_ray_normal(mouse_pos)
var plane_normal = Vector3.UP # Normal vector of a horizontal plane
var plane_d = 1.5 # The 'D' in the plane equation Ax+By+Cz=D
var denominator = plane_normal.dot(ray_direction)
if abs(denominator) < 0.0001:
return Vector3(ray_origin.x, 1.5, ray_origin.z)
var t = (plane_d - plane_normal.dot(ray_origin)) / denominator
var intersection_point = ray_origin + ray_direction * t
return intersection_point
func get_look_target(position: Vector3) -> Option:
match last_known_device:
Device.KeyboardMouse:
var pos = _mouse_position
return Option.some(Vector3(pos.x, position.y, pos.y))
return Option.some(get_mouse_look())
Device.Gamepad:
var pos = _analog_dir
if pos.is_zero_approx():