12 Commits
2.5.2 ... 2.6

Author SHA1 Message Date
Zakarya
b57da3669c fix README 3 2024-08-20 18:27:22 -07:00
Zakarya
e45406d35c fix README 2 2024-08-20 18:26:05 -07:00
Zakarya
7ace3c48b8 fix README 2024-08-20 18:24:39 -07:00
Zakarya
54a07cc6cf Slope/staircase guide 2024-08-20 18:23:22 -07:00
0e2a12ce5c Fix head rotation 2024-07-24 11:35:05 -07:00
aef3c9c0f9 Fixup #25
Make the PR code more readable and match the style of the codebase
2024-07-24 11:29:38 -07:00
3567b157c0 Improve editor module 2024-07-23 20:18:20 -07:00
6c719b52cc Add a toggle button for the debug panel and clean up some comments 2024-07-23 20:18:20 -07:00
Zakarya
7009032757 Merge pull request #25 from DanielKinsman/invert_pitch
Option to invert mouse/joystick y axis (pitch)
2024-07-23 19:03:48 -07:00
Daniel Kinsman
40f5d21452 Option to invert mouse/joystick y axis (pitch) 2024-07-24 11:31:18 +10:00
14a3fb15f0 Remove hardcoded controller sensitivity 2024-07-17 17:25:17 -07:00
bd603973d0 Add descriptions for exported values 2024-07-17 17:21:27 -07:00
3 changed files with 68 additions and 26 deletions

View File

@ -36,6 +36,10 @@ You can make this a super basic controller by just disabling everything.
- In the `handle_head_rotation` function, there is another block of commented code that says the same thing. Uncomment that too.
- You should now be able to look around with the joystick. Make sure you add the other controls to the input map. (movement, jumping, crouching, sprinting, etc.)
**Slope/staircase:**
Credit to @roberto-urbani23
In the character inspector, you can uncheck Stop on Slope and set the max angle to 89 (for some reason, 90 will make the player stuck). Also Snap Length to 1 otherwise your character will not remain attached to stairs if you sprint while going downstairs.
**How to change settings:**
Click on the character node and there should be settings in the "Feature Settings" group.

View File

@ -1,39 +1,40 @@
@tool
extends Node
# This module affects runtime nad
# This does not effect runtime yet but will in the future.
#TODO: Add descriptions
@export_category("Controller Editor Module")
@export var head_y_rotation : float = 0:
@export_range(-360.0, 360.0, 0.01, "or_greater", "or_less") var head_y_rotation : float = 0.0:
set(new_rotation):
head_y_rotation = new_rotation
HEAD.rotation.y = head_y_rotation
update_configuration_warnings()
if HEAD:
head_y_rotation = new_rotation
HEAD.rotation.y = deg_to_rad(head_y_rotation)
update_configuration_warnings()
@export_range(-90.0, 90.0, 0.01, "or_greater", "or_less") var head_x_rotation : float = 0.0:
set(new_rotation):
if HEAD:
head_x_rotation = new_rotation
HEAD.rotation.x = deg_to_rad(head_x_rotation)
update_configuration_warnings()
@export_group("Nodes")
@export var CHARACTER : CharacterBody3D
@export var head_path : String = "Head" # From this nodes parent node
@export var head_path : String = "Head" # Relative to the parent node
#@export var CAMERA : Camera3D
#@export var HEADBOB_ANIMATION : AnimationPlayer
#@export var JUMP_ANIMATION : AnimationPlayer
#@export var CROUCH_ANIMATION : AnimationPlayer
#@export var COLLISION_MESH : CollisionShape3D
var HEAD
@onready var HEAD = get_node("../" + head_path)
func _ready():
HEAD = get_node("../" + head_path)
if Engine.is_editor_hint():
pass
else:
HEAD.rotation.y = head_y_rotation
if !Engine.is_editor_hint():
print("not editor")
HEAD.rotation.y = deg_to_rad(head_y_rotation)
HEAD.rotation.x = deg_to_rad(head_x_rotation)
func _process(delta):
if Engine.is_editor_hint():
pass
func _get_configuration_warnings():
var warnings = []
@ -41,8 +42,8 @@ func _get_configuration_warnings():
if head_y_rotation > 360:
warnings.append("The head rotation is greater than 360")
if head_y_rotation < 0:
warnings.append("The head rotation is less than 0")
if head_y_rotation < -360:
warnings.append("The head rotation is less than -360")
# Returning an empty array gives no warnings
return warnings

View File

@ -6,21 +6,31 @@
extends CharacterBody3D
# TODO: Add descriptions for each value
## The settings for the character's movement and feel.
@export_category("Character")
## The speed that the character moves at without crouching or sprinting.
@export var base_speed : float = 3.0
## The speed that the character moves at when sprinting.
@export var sprint_speed : float = 6.0
## The speed that the character moves at when crouching.
@export var crouch_speed : float = 1.0
## How fast the character speeds up and slows down when Motion Smoothing is on.
@export var acceleration : float = 10.0
## How high the player jumps.
@export var jump_velocity : float = 4.5
## How far the player turns when the mouse is moved.
@export var mouse_sensitivity : float = 0.1
## Invert the Y input for mouse and joystick
@export var invert_mouse_y : bool = false # Possibly add an invert mouse X in the future
## Wether the player can use movement inputs. Does not stop outside forces or jumping. See Jumping Enabled.
@export var immobile : bool = false
## The reticle file to import at runtime. By default are in res://addons/fpc/reticles/. Set to an empty string to remove.
@export_file var default_reticle
@export_group("Nodes")
## The node that holds the camera. This is rotated instead of the camera for mouse input.
@export var HEAD : Node3D
@export var CAMERA : Camera3D
@export var HEADBOB_ANIMATION : AnimationPlayer
@ -35,29 +45,40 @@ extends CharacterBody3D
@export var RIGHT : String = "ui_right"
@export var FORWARD : String = "ui_up"
@export var BACKWARD : String = "ui_down"
## By default this does not pause the game, but that can be changed in _process.
@export var PAUSE : String = "ui_cancel"
@export var CROUCH : String = "crouch"
@export var SPRINT : String = "sprint"
# Uncomment if you want full controller support
# Uncomment if you want controller support
#@export var controller_sensitivity : float = 0.035
#@export var LOOK_LEFT : String = "look_left"
#@export var LOOK_RIGHT : String = "look_right"
#@export var LOOK_UP : String = "look_up"
#@export var LOOK_DOWN : String = "look_down"
@export_group("Feature Settings")
## Enable or disable jumping. Useful for restrictive storytelling environments.
@export var jumping_enabled : bool = true
## Wether the player can move in the air or not.
@export var in_air_momentum : bool = true
## Smooths the feel of walking.
@export var motion_smoothing : bool = true
@export var sprint_enabled : bool = true
@export var crouch_enabled : bool = true
@export_enum("Hold to Crouch", "Toggle Crouch") var crouch_mode : int = 0
@export_enum("Hold to Sprint", "Toggle Sprint") var sprint_mode : int = 0
## Wether sprinting should effect FOV.
@export var dynamic_fov : bool = true
## If the player holds down the jump button, should the player keep hopping.
@export var continuous_jumping : bool = true
## Enables the view bobbing animation.
@export var view_bobbing : bool = true
## Enables an immersive animation when the player jumps and hits the ground.
@export var jump_animation : bool = true
## This determines wether the player can use the pause button, not wether the game will actually pause.
@export var pausing_enabled : bool = true
## Use with caution.
@export var gravity_enabled : bool = true
@ -220,12 +241,19 @@ func handle_movement(delta, input_dir):
func handle_head_rotation():
HEAD.rotation_degrees.y -= mouseInput.x * mouse_sensitivity
HEAD.rotation_degrees.x -= mouseInput.y * mouse_sensitivity
if invert_mouse_y:
HEAD.rotation_degrees.x -= mouseInput.y * mouse_sensitivity * -1.0
else:
HEAD.rotation_degrees.x -= mouseInput.y * mouse_sensitivity
# Uncomment for controller support
#var controller_view_rotation = Input.get_vector(LOOK_DOWN, LOOK_UP, LOOK_RIGHT, LOOK_LEFT) * 0.035 # These are inverted because of the nature of 3D rotation.
#var controller_view_rotation = Input.get_vector(LOOK_DOWN, LOOK_UP, LOOK_RIGHT, LOOK_LEFT) * controller_sensitivity # These are inverted because of the nature of 3D rotation.
#HEAD.rotation.x += controller_view_rotation.x
#HEAD.rotation.y += controller_view_rotation.y
#if invert_mouse_y:
#HEAD.rotation.y += controller_view_rotation.y * -1.0
#else:
#HEAD.rotation.y += controller_view_rotation.y
mouseInput = Vector2(0,0)
HEAD.rotation.x = clamp(HEAD.rotation.x, deg_to_rad(-90), deg_to_rad(90))
@ -344,14 +372,23 @@ func _process(delta):
if pausing_enabled:
if Input.is_action_just_pressed(PAUSE):
# You may want another node to handle pausing, because this player may get paused too.
match Input.mouse_mode:
Input.MOUSE_MODE_CAPTURED:
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
#get_tree().paused = false
Input.MOUSE_MODE_VISIBLE:
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
#get_tree().paused = false
func _unhandled_input(event):
func _unhandled_input(event : InputEvent):
if event is InputEventMouseMotion and Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:
mouseInput.x += event.relative.x
mouseInput.y += event.relative.y
# Toggle debug menu
elif event is InputEventKey:
if event.is_released():
# Where we're going, we don't need InputMap
if event.keycode == 4194338: # F7
$UserInterface/DebugPanel.visible = !$UserInterface/DebugPanel.visible