feat: setup initial repo and smallest working scene
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
@@ -0,0 +1,7 @@
|
||||
# Normalize EOL for all files that Git considers text files.
|
||||
* text=auto eol=lf
|
||||
*.gd text eol=lf
|
||||
*.tscn text eol=lf
|
||||
*.tres text eol=lf
|
||||
*.shader text eol=lf
|
||||
*.gdshader text eol=lf
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
# Godot import cache
|
||||
.import/
|
||||
|
||||
# Godot editor generated files
|
||||
.godot/
|
||||
|
||||
# Export templates and builds
|
||||
/export/
|
||||
/exports/
|
||||
/build/
|
||||
/builds/
|
||||
|
||||
# Mono / C#
|
||||
.mono/
|
||||
data_*/
|
||||
mono_crash.*
|
||||
|
||||
# Visual Studio / Rider
|
||||
.vs/
|
||||
.idea/
|
||||
*.csproj
|
||||
*.sln
|
||||
*.user
|
||||
*.DotSettings.user
|
||||
|
||||
# macOS
|
||||
.DS_Store
|
||||
|
||||
# Linux
|
||||
.directory
|
||||
|
||||
# Windows
|
||||
Thumbs.db
|
||||
desktop.ini
|
||||
|
||||
# Logs
|
||||
*.log
|
||||
|
||||
# Temporary files
|
||||
*.tmp
|
||||
*.bak
|
||||
|
||||
# Godot crash reports
|
||||
crash_handler*
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128"><rect width="124" height="124" x="2" y="2" fill="#363d52" stroke="#212532" stroke-width="4" rx="14"/><g fill="#fff" transform="translate(12.322 12.322)scale(.101)"><path d="M105 673v33q407 354 814 0v-33z"/><path fill="#478cbf" d="m105 673 152 14q12 1 15 14l4 67 132 10 8-61q2-11 15-15h162q13 4 15 15l8 61 132-10 4-67q3-13 15-14l152-14V427q30-39 56-81-35-59-83-108-43 20-82 47-40-37-88-64 7-51 8-102-59-28-123-42-26 43-46 89-49-7-98 0-20-46-46-89-64 14-123 42 1 51 8 102-48 27-88 64-39-27-82-47-48 49-83 108 26 42 56 81zm0 33v39c0 276 813 276 814 0v-39l-134 12-5 69q-2 10-14 13l-162 11q-12 0-16-11l-10-65H446l-10 65q-4 11-16 11l-162-11q-12-3-14-13l-5-69z"/><path d="M483 600c0 34 58 34 58 0v-86c0-34-58-34-58 0z"/><circle cx="725" cy="526" r="90"/><circle cx="299" cy="526" r="90"/></g><g fill="#414042" transform="translate(12.322 12.322)scale(.101)"><circle cx="307" cy="532" r="60"/><circle cx="717" cy="532" r="60"/></g></svg>
|
||||
|
After Width: | Height: | Size: 995 B |
@@ -0,0 +1,43 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://cvx06gdtgk2fp"
|
||||
path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://icon.svg"
|
||||
dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
@@ -0,0 +1,39 @@
|
||||
; Engine configuration file.
|
||||
; It's best edited using the editor UI and not directly,
|
||||
; since the parameters that go here are not all obvious.
|
||||
;
|
||||
; Format:
|
||||
; [section] ; section goes between []
|
||||
; param=value ; assign values to parameters
|
||||
|
||||
config_version=5
|
||||
|
||||
[application]
|
||||
|
||||
config/name="the-steward"
|
||||
run/main_scene="uid://rs3hv73svbpa"
|
||||
config/features=PackedStringArray("4.5", "Forward Plus")
|
||||
config/icon="res://icon.svg"
|
||||
|
||||
[input]
|
||||
|
||||
move_forward={
|
||||
"deadzone": 0.2,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
move_backward={
|
||||
"deadzone": 0.2,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
move_left={
|
||||
"deadzone": 0.2,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
move_right={
|
||||
"deadzone": 0.2,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
[gd_scene load_steps=9 format=3 uid="uid://rs3hv73svbpa"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://4mg67crlim53" path="res://scenes/player/player.gd" id="1_o5qli"]
|
||||
[ext_resource type="Script" uid="uid://ii8ai801jur2" path="res://scenes/player/camera_rig.gd" id="2_0wfyh"]
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_o5qli"]
|
||||
albedo_color = Color(0.16862746, 0.52156866, 0.30588236, 1)
|
||||
|
||||
[sub_resource type="BoxMesh" id="BoxMesh_sgp6g"]
|
||||
|
||||
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_o5qli"]
|
||||
radius = 0.4
|
||||
height = 1.7
|
||||
|
||||
[sub_resource type="CapsuleMesh" id="CapsuleMesh_sgp6g"]
|
||||
|
||||
[sub_resource type="BoxMesh" id="BoxMesh_0wfyh"]
|
||||
|
||||
[sub_resource type="Environment" id="Environment_o5qli"]
|
||||
background_mode = 1
|
||||
background_color = Color(0.46428233, 0.7990817, 0.98692364, 1)
|
||||
ambient_light_source = 2
|
||||
ambient_light_color = Color(1, 1, 1, 1)
|
||||
ambient_light_energy = 0.5
|
||||
|
||||
[node name="Main" type="Node3D"]
|
||||
|
||||
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
|
||||
transform = Transform3D(0.8660254, -0.43301272, 0.24999999, 0, 0.49999997, 0.86602545, -0.5, -0.75, 0.43301266, 0, 0, 0)
|
||||
light_energy = 2.0
|
||||
|
||||
[node name="World" type="Node3D" parent="."]
|
||||
|
||||
[node name="Ground" type="MeshInstance3D" parent="World"]
|
||||
transform = Transform3D(30, 0, 0, 0, 0.1, 0, 0, 0, 30, 0, -0.05, 0)
|
||||
material_override = SubResource("StandardMaterial3D_o5qli")
|
||||
mesh = SubResource("BoxMesh_sgp6g")
|
||||
|
||||
[node name="Player" type="CharacterBody3D" parent="." node_paths=PackedStringArray("camera_rig")]
|
||||
script = ExtResource("1_o5qli")
|
||||
camera_rig = NodePath("../CameraRig")
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="Player"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.85, 0)
|
||||
shape = SubResource("CapsuleShape3D_o5qli")
|
||||
|
||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="Player"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.85, 0)
|
||||
mesh = SubResource("CapsuleMesh_sgp6g")
|
||||
|
||||
[node name="FaceMarker" type="MeshInstance3D" parent="Player"]
|
||||
transform = Transform3D(0.15, 0, 0, 0, 0.15, 0, 0, 0, 0.4, 0, 1.2, 0.6266626)
|
||||
mesh = SubResource("BoxMesh_0wfyh")
|
||||
|
||||
[node name="CameraRig" type="Node3D" parent="." node_paths=PackedStringArray("target")]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.57357645, 0.81915206, 0, -0.81915206, 0.57357645, 0, 10, 8)
|
||||
script = ExtResource("2_0wfyh")
|
||||
target = NodePath("../Player")
|
||||
follow_speed = 8.0
|
||||
deadzone_right = 2.0
|
||||
deadzone_forward = 2.0
|
||||
|
||||
[node name="Camera3D" type="Camera3D" parent="CameraRig"]
|
||||
current = true
|
||||
fov = 65.0
|
||||
|
||||
[node name="SimulationManager" type="Node" parent="."]
|
||||
|
||||
[node name="WorldViewManager" type="Node" parent="."]
|
||||
|
||||
[node name="EventBus" type="Node" parent="."]
|
||||
|
||||
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
|
||||
environment = SubResource("Environment_o5qli")
|
||||
@@ -0,0 +1,58 @@
|
||||
extends Node3D
|
||||
|
||||
@export var target: Node3D
|
||||
@export var follow_offset := Vector3(0, 10, 8)
|
||||
@export var follow_speed := 12.0
|
||||
@export var mouse_sensitivity := 0.002
|
||||
|
||||
@export var deadzone_right := 3.0
|
||||
@export var deadzone_forward := 3.0
|
||||
|
||||
var yaw := 0.0
|
||||
var focus_position := Vector3.ZERO
|
||||
|
||||
func _ready() -> void:
|
||||
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
|
||||
|
||||
if target:
|
||||
focus_position = target.global_position
|
||||
global_position = focus_position + follow_offset
|
||||
|
||||
|
||||
func _unhandled_input(event: InputEvent) -> void:
|
||||
if event is InputEventMouseMotion:
|
||||
yaw -= event.relative.x * mouse_sensitivity
|
||||
|
||||
if event.is_action_pressed("ui_cancel"):
|
||||
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
if target == null:
|
||||
return
|
||||
|
||||
rotation = Vector3(deg_to_rad(-55), yaw, 0)
|
||||
|
||||
var target_pos := target.global_position
|
||||
var diff := target_pos - focus_position
|
||||
|
||||
# Camera-relative horizontal axes
|
||||
var cam_right := Vector3.RIGHT.rotated(Vector3.UP, yaw).normalized()
|
||||
var cam_forward := Vector3.FORWARD.rotated(Vector3.UP, yaw).normalized()
|
||||
|
||||
var diff_right := diff.dot(cam_right)
|
||||
var diff_forward := diff.dot(cam_forward)
|
||||
|
||||
if abs(diff_right) > deadzone_right:
|
||||
focus_position += cam_right * (diff_right - sign(diff_right) * deadzone_right)
|
||||
|
||||
if abs(diff_forward) > deadzone_forward:
|
||||
focus_position += cam_forward * (diff_forward - sign(diff_forward) * deadzone_forward)
|
||||
|
||||
var rotated_offset := follow_offset.rotated(Vector3.UP, yaw)
|
||||
var desired_position := focus_position + rotated_offset
|
||||
|
||||
global_position = global_position.lerp(
|
||||
desired_position,
|
||||
1.0 - exp(-follow_speed * delta)
|
||||
)
|
||||
@@ -0,0 +1 @@
|
||||
uid://ii8ai801jur2
|
||||
@@ -0,0 +1,37 @@
|
||||
extends CharacterBody3D
|
||||
|
||||
@export var move_speed := 7.0
|
||||
@export var acceleration := 18.0
|
||||
@export var rotation_speed := 12.0
|
||||
@export var camera_rig: Node3D
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
var input := Input.get_vector(
|
||||
"move_left",
|
||||
"move_right",
|
||||
"move_forward",
|
||||
"move_backward"
|
||||
)
|
||||
|
||||
var forward := -camera_rig.global_transform.basis.z
|
||||
var right := camera_rig.global_transform.basis.x
|
||||
|
||||
forward.y = 0
|
||||
right.y = 0
|
||||
|
||||
forward = forward.normalized()
|
||||
right = right.normalized()
|
||||
|
||||
var direction := (right * input.x + forward * -input.y).normalized()
|
||||
|
||||
var target_velocity := direction * move_speed
|
||||
|
||||
velocity.x = move_toward(velocity.x, target_velocity.x, acceleration * delta)
|
||||
velocity.z = move_toward(velocity.z, target_velocity.z, acceleration * delta)
|
||||
velocity.y = 0.0
|
||||
|
||||
move_and_slide()
|
||||
|
||||
if direction.length() > 0.01:
|
||||
var target_angle := atan2(direction.x, direction.z)
|
||||
rotation.y = lerp_angle(rotation.y, target_angle, rotation_speed * delta)
|
||||
@@ -0,0 +1 @@
|
||||
uid://4mg67crlim53
|
||||
Reference in New Issue
Block a user