FPS Controller
This commit is contained in:
249
demo/levels/prototype_level.tscn
Normal file
249
demo/levels/prototype_level.tscn
Normal file
@@ -0,0 +1,249 @@
|
||||
[gd_scene load_steps=15 format=3 uid="uid://yr0ymw4fpseu"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://dwhdp7spars2b" path="res://assets/textures/texture.png" id="1_htrvu"]
|
||||
[ext_resource type="Texture2D" uid="uid://doknmohl75xnp" path="res://assets/textures/t_floormetal1.png" id="2_6lfjr"]
|
||||
[ext_resource type="PackedScene" uid="uid://bm4jq3rokgbn2" path="res://scenes/environment/world_environment.tscn" id="3_qd0o6"]
|
||||
[ext_resource type="PackedScene" uid="uid://dh8v00nh02l1" path="res://scenes/player/player_controller.tscn" id="4_6lfjr"]
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_i5e4g"]
|
||||
albedo_texture = ExtResource("1_htrvu")
|
||||
uv1_triplanar = true
|
||||
|
||||
[sub_resource type="BoxMesh" id="BoxMesh_pvbb1"]
|
||||
size = Vector3(50, 1, 50)
|
||||
|
||||
[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_0bul0"]
|
||||
data = PackedVector3Array(-25, 0.5, 25, 25, 0.5, 25, -25, -0.5, 25, 25, 0.5, 25, 25, -0.5, 25, -25, -0.5, 25, 25, 0.5, -25, -25, 0.5, -25, 25, -0.5, -25, -25, 0.5, -25, -25, -0.5, -25, 25, -0.5, -25, 25, 0.5, 25, 25, 0.5, -25, 25, -0.5, 25, 25, 0.5, -25, 25, -0.5, -25, 25, -0.5, 25, -25, 0.5, -25, -25, 0.5, 25, -25, -0.5, -25, -25, 0.5, 25, -25, -0.5, 25, -25, -0.5, -25, 25, 0.5, 25, -25, 0.5, 25, 25, 0.5, -25, -25, 0.5, 25, -25, 0.5, -25, 25, 0.5, -25, -25, -0.5, 25, 25, -0.5, 25, -25, -0.5, -25, 25, -0.5, 25, 25, -0.5, -25, -25, -0.5, -25)
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_rl8gb"]
|
||||
albedo_texture = ExtResource("2_6lfjr")
|
||||
|
||||
[sub_resource type="BoxMesh" id="BoxMesh_3sjje"]
|
||||
size = Vector3(4, 1, 4)
|
||||
|
||||
[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_1wlit"]
|
||||
data = PackedVector3Array(-2, 0.5, 2, 2, 0.5, 2, -2, -0.5, 2, 2, 0.5, 2, 2, -0.5, 2, -2, -0.5, 2, 2, 0.5, -2, -2, 0.5, -2, 2, -0.5, -2, -2, 0.5, -2, -2, -0.5, -2, 2, -0.5, -2, 2, 0.5, 2, 2, 0.5, -2, 2, -0.5, 2, 2, 0.5, -2, 2, -0.5, -2, 2, -0.5, 2, -2, 0.5, -2, -2, 0.5, 2, -2, -0.5, -2, -2, 0.5, 2, -2, -0.5, 2, -2, -0.5, -2, 2, 0.5, 2, -2, 0.5, 2, 2, 0.5, -2, -2, 0.5, 2, -2, 0.5, -2, 2, 0.5, -2, -2, -0.5, 2, 2, -0.5, 2, -2, -0.5, -2, 2, -0.5, 2, 2, -0.5, -2, -2, -0.5, -2)
|
||||
|
||||
[sub_resource type="GDScript" id="GDScript_i5e4g"]
|
||||
script/source = "@tool
|
||||
|
||||
extends Line2D
|
||||
|
||||
@export var camera : Camera3D
|
||||
@export var start_position : Vector3
|
||||
@export var end_position: Vector3
|
||||
@export var line_color : Color
|
||||
@export var target : Node
|
||||
@export var offset : Vector3
|
||||
@export_range(0.0, 1.0) var alpha : float
|
||||
|
||||
var start_point
|
||||
var end_point
|
||||
var line_points : PackedVector2Array
|
||||
var direction : int = 0
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
default_color = line_color
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
var pos = target.global_position
|
||||
start_point = camera.unproject_position(pos)
|
||||
end_point = camera.unproject_position(pos + offset)
|
||||
|
||||
if start_point and end_point:
|
||||
var a = start_point
|
||||
var b = lerp(start_point, end_point, alpha)
|
||||
line_points = [a, b]
|
||||
|
||||
set_points(line_points)
|
||||
|
||||
|
||||
func enter() -> void:
|
||||
var tween = get_tree().create_tween()
|
||||
tween.tween_property(self, \"alpha\", 1.0, 1.0).set_ease(Tween.EASE_IN_OUT).set_trans(Tween.TRANS_CUBIC)
|
||||
|
||||
|
||||
func exit() -> void:
|
||||
var tween = get_tree().create_tween()
|
||||
tween.tween_property(self, \"alpha\", 0.0, 1.0).set_ease(Tween.EASE_IN_OUT).set_trans(Tween.TRANS_CUBIC)
|
||||
"
|
||||
|
||||
[sub_resource type="Animation" id="Animation_q6206"]
|
||||
resource_name = "Camera_Pan"
|
||||
length = 2.0
|
||||
loop_mode = 1
|
||||
tracks/0/type = "value"
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = false
|
||||
tracks/0/path = NodePath("Camera3D:position")
|
||||
tracks/0/interp = 2
|
||||
tracks/0/loop_wrap = false
|
||||
tracks/0/keys = {
|
||||
"times": PackedFloat32Array(0, 1),
|
||||
"transitions": PackedFloat32Array(1, 1),
|
||||
"update": 0,
|
||||
"values": [Vector3(0, 0.6, 0), Vector3(2.864, 0.6, -5.781)]
|
||||
}
|
||||
tracks/1/type = "method"
|
||||
tracks/1/imported = false
|
||||
tracks/1/enabled = true
|
||||
tracks/1/path = NodePath("CanvasLayer/TutLine")
|
||||
tracks/1/interp = 1
|
||||
tracks/1/loop_wrap = true
|
||||
tracks/1/keys = {
|
||||
"times": PackedFloat32Array(0.1, 1.66667),
|
||||
"transitions": PackedFloat32Array(1, 1),
|
||||
"values": [{
|
||||
"args": [],
|
||||
"method": &"enter"
|
||||
}, {
|
||||
"args": [],
|
||||
"method": &"exit"
|
||||
}]
|
||||
}
|
||||
|
||||
[sub_resource type="Animation" id="Animation_6aore"]
|
||||
length = 0.001
|
||||
tracks/0/type = "bezier"
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/path = NodePath("Camera3D:position:x")
|
||||
tracks/0/interp = 1
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/keys = {
|
||||
"handle_modes": PackedInt32Array(0),
|
||||
"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0),
|
||||
"times": PackedFloat32Array(0)
|
||||
}
|
||||
tracks/1/type = "bezier"
|
||||
tracks/1/imported = false
|
||||
tracks/1/enabled = true
|
||||
tracks/1/path = NodePath("Camera3D:position:y")
|
||||
tracks/1/interp = 1
|
||||
tracks/1/loop_wrap = true
|
||||
tracks/1/keys = {
|
||||
"handle_modes": PackedInt32Array(0),
|
||||
"points": PackedFloat32Array(1.84113, -0.25, 0, 0.25, 0),
|
||||
"times": PackedFloat32Array(0)
|
||||
}
|
||||
tracks/2/type = "bezier"
|
||||
tracks/2/imported = false
|
||||
tracks/2/enabled = true
|
||||
tracks/2/path = NodePath("Camera3D:position:z")
|
||||
tracks/2/interp = 1
|
||||
tracks/2/loop_wrap = true
|
||||
tracks/2/keys = {
|
||||
"handle_modes": PackedInt32Array(0),
|
||||
"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0),
|
||||
"times": PackedFloat32Array(0)
|
||||
}
|
||||
tracks/3/type = "value"
|
||||
tracks/3/imported = false
|
||||
tracks/3/enabled = true
|
||||
tracks/3/path = NodePath("Camera3D:position")
|
||||
tracks/3/interp = 1
|
||||
tracks/3/loop_wrap = true
|
||||
tracks/3/keys = {
|
||||
"times": PackedFloat32Array(0),
|
||||
"transitions": PackedFloat32Array(1),
|
||||
"update": 0,
|
||||
"values": [Vector3(0, 1.84113, 0)]
|
||||
}
|
||||
|
||||
[sub_resource type="AnimationLibrary" id="AnimationLibrary_i0w0i"]
|
||||
_data = {
|
||||
&"Camera_Pan": SubResource("Animation_q6206"),
|
||||
&"RESET": SubResource("Animation_6aore")
|
||||
}
|
||||
|
||||
[node name="PrototypeLevel" type="Node3D"]
|
||||
|
||||
[node name="Geometry" type="Node3D" parent="."]
|
||||
|
||||
[node name="Floor" type="StaticBody3D" parent="Geometry"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0)
|
||||
|
||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="Geometry/Floor"]
|
||||
material_override = SubResource("StandardMaterial3D_i5e4g")
|
||||
mesh = SubResource("BoxMesh_pvbb1")
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="Geometry/Floor"]
|
||||
shape = SubResource("ConcavePolygonShape3D_0bul0")
|
||||
|
||||
[node name="CrouchCheck" type="StaticBody3D" parent="Geometry"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, -7)
|
||||
|
||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="Geometry/CrouchCheck"]
|
||||
material_override = SubResource("StandardMaterial3D_rl8gb")
|
||||
mesh = SubResource("BoxMesh_3sjje")
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="Geometry/CrouchCheck"]
|
||||
shape = SubResource("ConcavePolygonShape3D_1wlit")
|
||||
|
||||
[node name="CrouchCheck2" type="StaticBody3D" parent="Geometry"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4, 0.5, -7)
|
||||
|
||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="Geometry/CrouchCheck2"]
|
||||
material_override = SubResource("StandardMaterial3D_rl8gb")
|
||||
mesh = SubResource("BoxMesh_3sjje")
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="Geometry/CrouchCheck2"]
|
||||
shape = SubResource("ConcavePolygonShape3D_1wlit")
|
||||
|
||||
[node name="CrouchCheck3" type="StaticBody3D" parent="Geometry"]
|
||||
transform = Transform3D(0.3, 0, 0, 0, 0.3, 0, 0, 0, 0.3, 0, 0.17173958, 0)
|
||||
|
||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="Geometry/CrouchCheck3"]
|
||||
material_override = SubResource("StandardMaterial3D_rl8gb")
|
||||
mesh = SubResource("BoxMesh_3sjje")
|
||||
skeleton = NodePath("../../CrouchCheck3")
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="Geometry/CrouchCheck3"]
|
||||
shape = SubResource("ConcavePolygonShape3D_1wlit")
|
||||
|
||||
[node name="CrouchCheck4" type="StaticBody3D" parent="Geometry"]
|
||||
transform = Transform3D(0.3, 0, 0, 0, 0.3, 0, 0, 0, 0.3, -1.1974242, 0.45065737, 0)
|
||||
|
||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="Geometry/CrouchCheck4"]
|
||||
material_override = SubResource("StandardMaterial3D_rl8gb")
|
||||
mesh = SubResource("BoxMesh_3sjje")
|
||||
skeleton = NodePath("../../CrouchCheck3")
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="Geometry/CrouchCheck4"]
|
||||
shape = SubResource("ConcavePolygonShape3D_1wlit")
|
||||
|
||||
[node name="PlayerController" parent="." instance=ExtResource("4_6lfjr")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.84185, 1, -3.5)
|
||||
|
||||
[node name="WorldEnvironment" parent="." instance=ExtResource("3_qd0o6")]
|
||||
|
||||
[node name="Animator" type="Node" parent="."]
|
||||
|
||||
[node name="CanvasLayer" type="CanvasLayer" parent="Animator"]
|
||||
follow_viewport_enabled = true
|
||||
|
||||
[node name="TutLine" type="Line2D" parent="Animator/CanvasLayer" node_paths=PackedStringArray("camera", "target")]
|
||||
visible = false
|
||||
points = PackedVector2Array(998, 477.933, 998, 477.933)
|
||||
joint_mode = 2
|
||||
begin_cap_mode = 2
|
||||
end_cap_mode = 2
|
||||
round_precision = 32
|
||||
antialiased = true
|
||||
script = SubResource("GDScript_i5e4g")
|
||||
camera = NodePath("../../Camera3D")
|
||||
line_color = Color(1, 1, 1, 1)
|
||||
target = NodePath("../../../Geometry/CrouchCheck")
|
||||
offset = Vector3(0, -2, 0)
|
||||
|
||||
[node name="Camera3D" type="Camera3D" parent="Animator"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.84113, 0)
|
||||
|
||||
[node name="AnimationPlayer" type="AnimationPlayer" parent="Animator"]
|
||||
libraries = {
|
||||
&"": SubResource("AnimationLibrary_i0w0i")
|
||||
}
|
||||
autoplay = "Camera_Pan"
|
||||
speed_scale = 0.5
|
||||
Reference in New Issue
Block a user