improved aiming accuracy
This commit is contained in:
parent
42492595df
commit
e12ca0bb66
5 changed files with 78 additions and 44 deletions
|
@ -19,6 +19,10 @@ config/icon="res://icon.svg"
|
||||||
|
|
||||||
PhantomCameraManager="*res://addons/phantom_camera/scripts/managers/phantom_camera_manager.gd"
|
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]
|
[editor_plugins]
|
||||||
|
|
||||||
enabled=PackedStringArray("res://addons/FreeControl/plugin.cfg", "res://addons/godot_object_serializer/plugin.cfg", "res://addons/phantom_camera/plugin.cfg")
|
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]
|
[layer_names]
|
||||||
|
|
||||||
3d_physics/layer_2="interaction"
|
3d_physics/layer_2="interaction"
|
||||||
|
3d_physics/layer_3="ground"
|
||||||
|
|
||||||
[physics]
|
[physics]
|
||||||
|
|
||||||
|
|
|
@ -33,11 +33,13 @@ transform = Transform3D(50, 0, 0, 0, 50, 0, 0, 0, 50, 0, 0, 0)
|
||||||
mesh = SubResource("PlaneMesh_rd3vj")
|
mesh = SubResource("PlaneMesh_rd3vj")
|
||||||
|
|
||||||
[node name="StaticBody3D" type="StaticBody3D" parent="MeshInstance3D"]
|
[node name="StaticBody3D" type="StaticBody3D" parent="MeshInstance3D"]
|
||||||
|
collision_layer = 5
|
||||||
|
|
||||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="MeshInstance3D/StaticBody3D"]
|
[node name="CollisionShape3D" type="CollisionShape3D" parent="MeshInstance3D/StaticBody3D"]
|
||||||
shape = SubResource("WorldBoundaryShape3D_w7c3h")
|
shape = SubResource("WorldBoundaryShape3D_w7c3h")
|
||||||
|
|
||||||
[node name="Player" parent="." instance=ExtResource("1_2q6dc")]
|
[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")]
|
[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)
|
transform = Transform3D(1, 0, 0, 0, 0.707106, 0.707106, 0, -0.707106, 0.707106, 0, 10, 10)
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
[ext_resource type="PackedScene" uid="uid://dpmbimh6m4ari" path="res://scenes/player_mesh.tscn" id="1_3vyb7"]
|
[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://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://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://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"]
|
[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"]]
|
[node name="Player" type="CharacterBody3D" node_paths=PackedStringArray("input", "interactor", "equipment") groups=["persist"]]
|
||||||
script = ExtResource("1_qhqgy")
|
script = ExtResource("1_qhqgy")
|
||||||
|
aim_offset = Vector3(0, 6, 0)
|
||||||
input = NodePath("Input")
|
input = NodePath("Input")
|
||||||
interactor = NodePath("Interactor")
|
interactor = NodePath("Interactor")
|
||||||
equipment = NodePath("Weapon")
|
equipment = NodePath("Weapon")
|
||||||
|
|
||||||
[node name="Input" type="Node" parent="."]
|
[node name="Input" type="Node" parent="."]
|
||||||
script = ExtResource("3_dqkch")
|
script = ExtResource("3_dqkch")
|
||||||
|
ground_collision_mask = 4
|
||||||
|
|
||||||
[node name="Inventory" type="Node" parent="."]
|
[node name="Inventory" type="Node" parent="."]
|
||||||
script = ExtResource("5_qlg0r")
|
script = ExtResource("5_qlg0r")
|
||||||
inventory = ExtResource("6_tuyoq")
|
inventory = ExtResource("6_tuyoq")
|
||||||
|
|
||||||
[node name="Weapon" type="BoneAttachment3D" parent="."]
|
[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_name = "mixamorigRightHandMiddle1"
|
||||||
bone_idx = 24
|
bone_idx = 24
|
||||||
use_external_skeleton = true
|
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")
|
shape = SubResource("CapsuleShape3D_g2els")
|
||||||
|
|
||||||
[node name="Mesh" parent="." instance=ExtResource("1_3vyb7")]
|
[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="."]
|
[node name="AnimationTree" type="AnimationTree" parent="."]
|
||||||
root_node = NodePath("../Mesh")
|
root_node = NodePath("../Mesh")
|
||||||
|
|
|
@ -2,6 +2,7 @@ class_name Player extends CharacterBody3D
|
||||||
|
|
||||||
@export var walk_speed: float = 4.0
|
@export var walk_speed: float = 4.0
|
||||||
@export var run_speed: float = 6.0
|
@export var run_speed: float = 6.0
|
||||||
|
@export var aim_offset: Vector3 = Vector3(0, 1.3, 0)
|
||||||
|
|
||||||
@export var input: PlayerInput
|
@export var input: PlayerInput
|
||||||
@export var interactor: Interactor
|
@export var interactor: Interactor
|
||||||
|
@ -37,7 +38,15 @@ func rotate_toward_look(_delta: float):
|
||||||
velocity = Vector3.ZERO
|
velocity = Vector3.ZERO
|
||||||
var target = input.get_look_target(global_position)
|
var target = input.get_look_target(global_position)
|
||||||
if target.is_some():
|
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():
|
func _on_interact():
|
||||||
interactor.interact_nearest()
|
interactor.interact_nearest()
|
||||||
|
|
|
@ -34,6 +34,8 @@ signal ready_weapon
|
||||||
signal unready_weapon
|
signal unready_weapon
|
||||||
signal fire
|
signal fire
|
||||||
|
|
||||||
|
@export_flags_3d_physics var ground_collision_mask: int = 0
|
||||||
|
|
||||||
var last_known_device: Device = Device.Unknown
|
var last_known_device: Device = Device.Unknown
|
||||||
|
|
||||||
var _is_running: bool = false
|
var _is_running: bool = false
|
||||||
|
@ -76,19 +78,11 @@ var movement_dir: Vector2:
|
||||||
'move_up', 'move_down'
|
'move_up', 'move_down'
|
||||||
).normalized()
|
).normalized()
|
||||||
|
|
||||||
var _mouse_position: Vector2:
|
var _active_camera: Camera3D:
|
||||||
get:
|
get: return get_viewport().get_camera_3d()
|
||||||
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 result = space_state.intersect_ray(query)
|
var _mouse_position: Vector2:
|
||||||
var position = result.get('position') as Vector3
|
get: return get_viewport().get_mouse_position()
|
||||||
return Vector2(position.x, position.z)
|
|
||||||
|
|
||||||
var _analog_dir: Vector2:
|
var _analog_dir: Vector2:
|
||||||
get: return Input.get_vector(
|
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:
|
func next_velocity(speed: float, dir: Vector2 = movement_dir) -> Vector3:
|
||||||
return Vector3(dir.x, 0, dir.y) * speed
|
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:
|
func get_look_target(position: Vector3) -> Option:
|
||||||
match last_known_device:
|
match last_known_device:
|
||||||
Device.KeyboardMouse:
|
Device.KeyboardMouse:
|
||||||
var pos = _mouse_position
|
return Option.some(get_mouse_look())
|
||||||
return Option.some(Vector3(pos.x, position.y, pos.y))
|
|
||||||
Device.Gamepad:
|
Device.Gamepad:
|
||||||
var pos = _analog_dir
|
var pos = _analog_dir
|
||||||
if pos.is_zero_approx():
|
if pos.is_zero_approx():
|
||||||
|
|
Loading…
Add table
Reference in a new issue