Add camera system
This commit is contained in:
parent
f1cb0ba83c
commit
337f18f9d6
@ -102,6 +102,10 @@ config/name="project-dung"
|
||||
run/main_scene="res://scenes/main.tscn"
|
||||
config/icon="res://icon.png"
|
||||
|
||||
[debug]
|
||||
|
||||
settings/stdout/print_fps=true
|
||||
|
||||
[display]
|
||||
|
||||
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]
|
||||
|
||||
common/enable_pause_aware_picking=true
|
||||
|
33
scenes/camera_room.tscn
Normal file
33
scenes/camera_room.tscn
Normal 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"]
|
138
scenes/main.tscn
138
scenes/main.tscn
@ -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://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/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="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 )]
|
||||
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"]
|
||||
|
@ -19,7 +19,7 @@ colors = PoolColorArray( 0, 0, 0, 1, 0, 0, 0, 0.429105, 0, 0, 0, 0 )
|
||||
gradient = SubResource( 4 )
|
||||
fill_to = Vector2( 0, 1 )
|
||||
|
||||
[node name="Player" type="KinematicBody"]
|
||||
[node name="Player" type="KinematicBody" groups=["player"]]
|
||||
axis_lock_motion_y = true
|
||||
move_lock_y = true
|
||||
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"]
|
||||
unique_name_in_owner = true
|
||||
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"]
|
||||
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 )
|
||||
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="Control" type="Control" parent="UI"]
|
||||
|
@ -10,7 +10,7 @@ var item_in_hand
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready():
|
||||
pass # Replace with function body.
|
||||
$hitbox.set_meta("owner", self)
|
||||
|
||||
func _physics_process(delta):
|
||||
var input = Vector3(Input.get_axis("left", "right"), 0.0, Input.get_axis("up", "down"))
|
||||
|
18
scripts/camera_room.gd
Normal file
18
scripts/camera_room.gd
Normal 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
31
scripts/cameras.gd
Normal 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)
|
@ -1,7 +1,7 @@
|
||||
extends Camera
|
||||
extends Spatial
|
||||
|
||||
export var target: NodePath
|
||||
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)
|
Loading…
x
Reference in New Issue
Block a user