Add camera system

This commit is contained in:
Daniel Snider 2022-08-14 18:47:18 -07:00
parent a5567a8132
commit 1030891b8d
8 changed files with 237 additions and 12 deletions

View File

@ -102,6 +102,10 @@ config/name="project-dung"
run/main_scene="res://scenes/main.tscn" run/main_scene="res://scenes/main.tscn"
config/icon="res://icon.png" config/icon="res://icon.png"
[debug]
settings/stdout/print_fps=true
[display] [display]
window/size/width=2048 window/size/width=2048
@ -157,6 +161,14 @@ dialogic_default_action={
] ]
} }
[layer_names]
3d_physics/layer_1="Static"
3d_physics/layer_2="Player Hitbox"
3d_physics/layer_3="Player Interact Box"
3d_physics/layer_4="Interactable"
3d_physics/layer_5="Camera Zone"
[physics] [physics]
common/enable_pause_aware_picking=true common/enable_pause_aware_picking=true

33
scenes/camera_room.tscn Normal file
View File

@ -0,0 +1,33 @@
[gd_scene load_steps=4 format=2]
[ext_resource path="res://scripts/camera_room.gd" type="Script" id=1]
[sub_resource type="BoxShape" id=1]
extents = Vector3( 2.39087, 1.93969, 2.08096 )
[sub_resource type="CapsuleShape" id=2]
radius = 2.07384
height = 8.68195
[node name="camera_room0" type="Spatial"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 15.4075, 0, 0 )
script = ExtResource( 1 )
[node name="camera" type="Camera" parent="."]
transform = Transform( 0.054985, 0.806829, -0.588221, 0, 0.589112, 0.808052, 0.998487, -0.0444307, 0.0323923, -6.51055, 9.74907, 0 )
fov = 49.8
[node name="hitbox" type="Area" parent="."]
collision_layer = 16
collision_mask = 2
[node name="CollisionShape" type="CollisionShape" parent="hitbox"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -4.12314, 2.07098, 0.535633 )
shape = SubResource( 1 )
[node name="CollisionShape2" type="CollisionShape" parent="hitbox"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0097599, 0, -0.487964 )
shape = SubResource( 2 )
[connection signal="area_entered" from="hitbox" to="." method="_on_hitbox_area_entered"]
[connection signal="area_exited" from="hitbox" to="." method="_on_hitbox_area_exited"]

View File

@ -1,18 +1,140 @@
[gd_scene load_steps=4 format=2] [gd_scene load_steps=11 format=2]
[ext_resource path="res://assets/moonbase_whitebox/Moonbase_Whitebox.tscn" type="PackedScene" id=1] [ext_resource path="res://assets/moonbase_whitebox/Moonbase_Whitebox.tscn" type="PackedScene" id=1]
[ext_resource path="res://scripts/main_camera.gd" type="Script" id=2] [ext_resource path="res://scripts/cameras.gd" type="Script" id=2]
[ext_resource path="res://scenes/player.tscn" type="PackedScene" id=3] [ext_resource path="res://scenes/player.tscn" type="PackedScene" id=3]
[ext_resource path="res://scenes/camera_room.tscn" type="PackedScene" id=4]
[ext_resource path="res://scripts/camera_room.gd" type="Script" id=5]
[ext_resource path="res://scripts/tracking_camera.gd" type="Script" id=6]
[sub_resource type="CylinderShape" id=1]
height = 5.22615
radius = 8.72145
[sub_resource type="BoxShape" id=4]
extents = Vector3( 1.78436, 2.33105, 6.04815 )
[sub_resource type="Animation" id=3]
length = 0.001
tracks/0/type = "value"
tracks/0/path = NodePath(".:camera_lerp")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ 0.0 ]
}
[sub_resource type="Animation" id=2]
resource_name = "switch_camera"
length = 0.3
tracks/0/type = "value"
tracks/0/path = NodePath(".:camera_lerp")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0, 0.3 ),
"transitions": PoolRealArray( -2, 1 ),
"update": 0,
"values": [ 0.0, 1.0 ]
}
[node name="main" type="Spatial"] [node name="main" type="Spatial"]
[node name="Moonbase_Whitebox" parent="." instance=ExtResource( 1 )] [node name="Moonbase_Whitebox" parent="." instance=ExtResource( 1 )]
[node name="main_camera" type="Camera" parent="."]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 12.6083, 0 )
current = true
script = ExtResource( 2 )
target = NodePath("../Player")
[node name="Player" parent="." instance=ExtResource( 3 )] [node name="Player" parent="." instance=ExtResource( 3 )]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 5.27448 ) transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 5.27448 )
[node name="cameras" type="Spatial" parent="."]
script = ExtResource( 2 )
target = NodePath("../Player")
camera_lerp = 0.0
[node name="main_camera" type="Camera" parent="cameras"]
current = true
[node name="camera_room_center" type="Spatial" parent="cameras"]
script = ExtResource( 5 )
[node name="camera" type="Camera" parent="cameras/camera_room_center"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 12, 0 )
script = ExtResource( 6 )
target = NodePath("../../../Player")
[node name="hitbox" type="Area" parent="cameras/camera_room_center"]
collision_layer = 16
collision_mask = 2
[node name="CollisionShape" type="CollisionShape" parent="cameras/camera_room_center/hitbox"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.52689, 0 )
shape = SubResource( 1 )
[node name="camera_room_hallway" type="Spatial" parent="cameras"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0726166, 0, 17.4284 )
script = ExtResource( 5 )
[node name="camera" type="Camera" parent="cameras/camera_room_hallway"]
transform = Transform( -4.37114e-08, 0.965926, -0.258819, 0, 0.258819, 0.965926, 1, 4.2222e-08, -1.13133e-08, -1.397, 10, -2.312 )
[node name="hitbox" type="Area" parent="cameras/camera_room_hallway"]
collision_layer = 16
collision_mask = 2
[node name="CollisionShape" type="CollisionShape" parent="cameras/camera_room_hallway/hitbox"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.52689, -1.44831 )
shape = SubResource( 4 )
[node name="camera_room0" parent="cameras" instance=ExtResource( 4 )]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 15.408, 0, 0 )
[node name="camera_room1" parent="cameras" instance=ExtResource( 4 )]
transform = Transform( 0.707107, 0, 0.707107, 0, 1, 0, -0.707107, 0, 0.707107, 10.653, 0, -10.485 )
[node name="camera_room2" parent="cameras" instance=ExtResource( 4 )]
transform = Transform( -0.0170336, 0, 0.999855, 0, 1, 0, -0.999855, 0, -0.0170336, -0.079, 0, -15.007 )
[node name="camera_room3" parent="cameras" instance=ExtResource( 4 )]
transform = Transform( -0.70219, 0, 0.711989, 0, 1, 0, -0.711989, 0, -0.70219, -10.6346, 0, -10.3156 )
[node name="camera_room4" parent="cameras" instance=ExtResource( 4 )]
transform = Transform( -0.999986, 0, 0.00521851, 0, 1, 0, -0.00521851, 0, -0.999986, -15.0328, 0, 0.198143 )
[node name="camera_room5" parent="cameras" instance=ExtResource( 4 )]
transform = Transform( -0.661796, 0, -0.749684, 0, 1, 0, 0.749684, 0, -0.661796, -10.4671, 0, 10.8794 )
[node name="camera_room6" parent="cameras" instance=ExtResource( 4 )]
transform = Transform( 0.696427, 0, -0.717628, 0, 1, 0, 0.717628, 0, 0.696427, 10.8827, 0, 10.7342 )
[node name="AnimationPlayer" type="AnimationPlayer" parent="cameras"]
anims/RESET = SubResource( 3 )
anims/switch_camera = SubResource( 2 )
[connection signal="player_entered" from="cameras/camera_room_center" to="cameras" method="_on_camera_room_player_entered"]
[connection signal="player_exited" from="cameras/camera_room_center" to="cameras" method="_on_camera_room_player_exited"]
[connection signal="area_entered" from="cameras/camera_room_center/hitbox" to="cameras/camera_room_center" method="_on_hitbox_area_entered"]
[connection signal="area_exited" from="cameras/camera_room_center/hitbox" to="cameras/camera_room_center" method="_on_hitbox_area_exited"]
[connection signal="player_entered" from="cameras/camera_room_hallway" to="cameras" method="_on_camera_room_player_entered"]
[connection signal="player_exited" from="cameras/camera_room_hallway" to="cameras" method="_on_camera_room_player_exited"]
[connection signal="area_entered" from="cameras/camera_room_hallway/hitbox" to="cameras/camera_room_hallway" method="_on_hitbox_area_entered"]
[connection signal="area_exited" from="cameras/camera_room_hallway/hitbox" to="cameras/camera_room_hallway" method="_on_hitbox_area_exited"]
[connection signal="player_entered" from="cameras/camera_room0" to="cameras" method="_on_camera_room_player_entered"]
[connection signal="player_exited" from="cameras/camera_room0" to="cameras" method="_on_camera_room_player_exited"]
[connection signal="player_entered" from="cameras/camera_room1" to="cameras" method="_on_camera_room_player_entered"]
[connection signal="player_exited" from="cameras/camera_room1" to="cameras" method="_on_camera_room_player_exited"]
[connection signal="player_entered" from="cameras/camera_room2" to="cameras" method="_on_camera_room_player_entered"]
[connection signal="player_exited" from="cameras/camera_room2" to="cameras" method="_on_camera_room_player_exited"]
[connection signal="player_entered" from="cameras/camera_room3" to="cameras" method="_on_camera_room_player_entered"]
[connection signal="player_exited" from="cameras/camera_room3" to="cameras" method="_on_camera_room_player_exited"]
[connection signal="player_entered" from="cameras/camera_room4" to="cameras" method="_on_camera_room_player_entered"]
[connection signal="player_exited" from="cameras/camera_room4" to="cameras" method="_on_camera_room_player_exited"]
[connection signal="player_entered" from="cameras/camera_room5" to="cameras" method="_on_camera_room_player_entered"]
[connection signal="player_exited" from="cameras/camera_room5" to="cameras" method="_on_camera_room_player_exited"]
[connection signal="player_entered" from="cameras/camera_room6" to="cameras" method="_on_camera_room_player_entered"]
[connection signal="player_exited" from="cameras/camera_room6" to="cameras" method="_on_camera_room_player_exited"]

View File

@ -19,7 +19,7 @@ colors = PoolColorArray( 0, 0, 0, 1, 0, 0, 0, 0.429105, 0, 0, 0, 0 )
gradient = SubResource( 4 ) gradient = SubResource( 4 )
fill_to = Vector2( 0, 1 ) fill_to = Vector2( 0, 1 )
[node name="Player" type="KinematicBody"] [node name="Player" type="KinematicBody" groups=["player"]]
axis_lock_motion_y = true axis_lock_motion_y = true
move_lock_y = true move_lock_y = true
script = ExtResource( 1 ) script = ExtResource( 1 )
@ -33,6 +33,8 @@ transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.6244, 0 )
[node name="TriggerVolume" type="Area" parent="DungMan"] [node name="TriggerVolume" type="Area" parent="DungMan"]
unique_name_in_owner = true unique_name_in_owner = true
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.630386 ) transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.630386 )
collision_layer = 4
collision_mask = 8
[node name="CollisionShape" type="CollisionShape" parent="DungMan/TriggerVolume"] [node name="CollisionShape" type="CollisionShape" parent="DungMan/TriggerVolume"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.778807, 0.291356 ) transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.778807, 0.291356 )
@ -42,6 +44,13 @@ shape = SubResource( 3 )
transform = Transform( 1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0.641703, 0 ) transform = Transform( 1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0.641703, 0 )
shape = SubResource( 2 ) shape = SubResource( 2 )
[node name="hitbox" type="Area" parent="."]
collision_layer = 2
collision_mask = 16
[node name="CollisionShape" type="CollisionShape" parent="hitbox"]
shape = SubResource( 2 )
[node name="UI" type="CanvasLayer" parent="."] [node name="UI" type="CanvasLayer" parent="."]
[node name="Control" type="Control" parent="UI"] [node name="Control" type="Control" parent="UI"]

View File

@ -10,7 +10,7 @@ var item_in_hand
# Called when the node enters the scene tree for the first time. # Called when the node enters the scene tree for the first time.
func _ready(): func _ready():
pass # Replace with function body. $hitbox.set_meta("owner", self)
func _physics_process(delta): func _physics_process(delta):
var input = Vector3(Input.get_axis("left", "right"), 0.0, Input.get_axis("up", "down")) var input = Vector3(Input.get_axis("left", "right"), 0.0, Input.get_axis("up", "down"))

18
scripts/camera_room.gd Normal file
View File

@ -0,0 +1,18 @@
extends Spatial
signal player_entered(player, camera)
signal player_exited(player, camera)
func _on_hitbox_area_entered(area):
var owner = area
if area.has_meta("owner"):
owner = area.get_meta("owner")
if owner.is_in_group("player"):
emit_signal("player_entered", owner, $camera)
func _on_hitbox_area_exited(area):
var owner = area
if area.has_meta("owner"):
owner = area.get_meta("owner")
if owner.is_in_group("player"):
emit_signal("player_exited", owner, $camera)

31
scripts/cameras.gd Normal file
View File

@ -0,0 +1,31 @@
extends Spatial
export var target: NodePath
onready var target_node: Spatial = get_node(target)
export var camera_lerp := 1.0
var tracking_cameras = []
onready var prev_camera: Camera = $camera_room_center/camera
onready var current_camera: Camera = $camera_room_center/camera setget set_current_camera
func set_current_camera(new_value: Camera):
prev_camera = current_camera
current_camera = new_value
camera_lerp = 0.0
$AnimationPlayer.play("switch_camera")
func _on_camera_room_player_entered(player, camera):
assert(tracking_cameras.find(camera) == -1)
tracking_cameras.append(camera)
if tracking_cameras.size() == 1:
self.current_camera = tracking_cameras.back()
func _on_camera_room_player_exited(player, camera):
tracking_cameras.erase(camera)
assert(tracking_cameras.find(camera) == -1)
if tracking_cameras.size() == 1:
self.current_camera = tracking_cameras.back()
func _physics_process(delta):
$main_camera.global_transform.basis = Basis(prev_camera.global_transform.basis.get_rotation_quat().slerp(current_camera.global_transform.basis.get_rotation_quat(), camera_lerp))
$main_camera.global_transform.origin = lerp(prev_camera.global_transform.origin, current_camera.global_transform.origin, camera_lerp)

View File

@ -1,7 +1,7 @@
extends Camera extends Spatial
export var target: NodePath export var target: NodePath
onready var target_node: Spatial = get_node(target) onready var target_node: Spatial = get_node(target)
func _process(delta): func _physics_process(delta):
global_transform = global_transform.looking_at(target_node.global_transform.origin, Vector3.UP) global_transform = global_transform.looking_at(target_node.global_transform.origin, Vector3.UP)