new build mechanic

This commit is contained in:
Nikolai Fesenko
2025-08-13 21:00:22 +02:00
parent 67182b4ccd
commit 43fb8410c3
12 changed files with 123 additions and 36 deletions

View File

@@ -5,3 +5,4 @@
[node name="DoubleBeds" type="Node3D"]
[node name="DoubleBeds" parent="." instance=ExtResource("1_kkvf5")]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -1.83435, 0, 0)

View File

@@ -1,15 +1,16 @@
[gd_scene load_steps=7 format=3 uid="uid://dim2geqhn6d35"]
[gd_scene load_steps=8 format=3 uid="uid://dim2geqhn6d35"]
[ext_resource type="Script" uid="uid://dhls6unflalvd" path="res://Scripts/cart.gd" id="1_esjgi"]
[ext_resource type="ArrayMesh" uid="uid://p3d7iitismhf" path="res://Blends/Cart/cart-bottom.obj" id="1_ux2tx"]
[ext_resource type="ArrayMesh" uid="uid://docto7iocves6" path="res://Blends/Cart/wheels.obj" id="2_2wj72"]
[ext_resource type="ArrayMesh" uid="uid://cayqoyyq7nbij" path="res://Blends/Cart/cart-top.obj" id="3_2wj72"]
[ext_resource type="Script" uid="uid://bcmd74mxocn7e" path="res://Scripts/building_area.gd" id="5_eosii"]
[sub_resource type="BoxShape3D" id="BoxShape3D_esjgi"]
size = Vector3(22.2341, 4.23804, 0.494629)
[sub_resource type="BoxShape3D" id="BoxShape3D_eosii"]
size = Vector3(17.5376, 0.0286865, 2.28394)
size = Vector3(5.40002, 4.29805, 2.28394)
[node name="Cart" type="Node3D" node_paths=PackedStringArray("cartTop")]
script = ExtResource("1_esjgi")
@@ -60,15 +61,21 @@ shape = SubResource("BoxShape3D_esjgi")
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.282789, 1.61902, -2.6054)
shape = SubResource("BoxShape3D_esjgi")
[node name="BuildingArea2" type="StaticBody3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8.23003, 0, 0)
script = ExtResource("5_eosii")
metadata/is_building_area = true
[node name="smallBuildingArea2" type="CollisionShape3D" parent="BuildingArea2"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.69414, 1.02766, -1.22106)
shape = SubResource("BoxShape3D_eosii")
metadata/is_building_area = true
[node name="BuildingArea" type="StaticBody3D" parent="."]
script = ExtResource("5_eosii")
metadata/is_building_area = true
[node name="CollisionShape3D" type="CollisionShape3D" parent="BuildingArea"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.374649, -0.275452, 2.38014)
shape = SubResource("BoxShape3D_eosii")
metadata/is_building_area = true
[node name="CollisionShape3D2" type="CollisionShape3D" parent="BuildingArea"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.374649, -0.275452, -1.22106)
[node name="smallBuildingArea2" type="CollisionShape3D" parent="BuildingArea"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.69414, 1.02766, -1.22106)
shape = SubResource("BoxShape3D_eosii")
metadata/is_building_area = true

View File

@@ -1,10 +1,28 @@
[gd_scene load_steps=8 format=3 uid="uid://bj7y7q2qkpnci"]
[gd_scene load_steps=11 format=3 uid="uid://bj7y7q2qkpnci"]
[ext_resource type="ArrayMesh" uid="uid://622ethh2pdfa" path="res://Blends/road/road.obj" id="4_jjvhh"]
[ext_resource type="PackedScene" uid="uid://dim2geqhn6d35" path="res://Scenes/Prefabs/cart.tscn" id="6_21xkr"]
[ext_resource type="PackedScene" uid="uid://dy03tqug33fep" path="res://Blends/ground.blend" id="6_344ge"]
[ext_resource type="Script" uid="uid://drrp1k2q71hq2" path="res://Scripts/camera_3d.gd" id="7_6bp64"]
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_jjvhh"]
sky_top_color = Color(0.654771, 0.60129, 0.578102, 1)
sky_horizon_color = Color(0.866942, 0.845822, 0.831025, 1)
ground_horizon_color = Color(0.866942, 0.845822, 0.831025, 1)
[sub_resource type="Sky" id="Sky_kry3j"]
sky_material = SubResource("ProceduralSkyMaterial_jjvhh")
[sub_resource type="Environment" id="Environment_21xkr"]
background_mode = 2
sky = SubResource("Sky_kry3j")
tonemap_mode = 2
ssao_enabled = true
glow_enabled = true
fog_mode = 1
fog_density = 1.0
fog_depth_curve = 4.75681
[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_21xkr"]
lifetime_randomness = 0.55
emission_shape = 3
@@ -18,7 +36,10 @@ size = Vector2(0.5, 0.5)
[sub_resource type="BoxShape3D" id="BoxShape3D_21xkr"]
[node name="Node3D" type="Node3D"]
[node name="Main" type="Node3D"]
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource("Environment_21xkr")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
transform = Transform3D(-0.866025, -0.5, -2.18557e-08, 0, -4.37114e-08, 1, -0.5, 0.866025, 3.78552e-08, 0, 0, 0)
@@ -30,13 +51,13 @@ mesh = ExtResource("4_jjvhh")
skeleton = NodePath("../Road")
[node name="Road" type="MeshInstance3D" parent="."]
transform = Transform3D(10.9512, 0, 0, 0, 1, 0, 0, 0, 1, -53.9758, 37.1737, -62.1734)
transform = Transform3D(10.9512, 0, 0, 0, 1, 0, 0, 0, 1, -54.4288, 36.9927, -61.8752)
mesh = ExtResource("4_jjvhh")
[node name="GPUParticles3D" type="GPUParticles3D" parent="."]
transform = Transform3D(3.70763, 0, 0, 0, 2.24982, 0, 0, 0, 3.71542, -7.77808, 47.2887, -60.0289)
emitting = false
amount = 500
amount = 1006
speed_scale = 5.17
randomness = 1.0
trail_lifetime = 1.01
@@ -62,7 +83,7 @@ axis_lock_angular_z = true
mass = 0.001
gravity_scale = 0.0
[node name="Camera3D" type="Camera3D" parent="RigidBody3D" node_paths=PackedStringArray("ownRigidBody", "endZoom")]
[node name="Camera3D" type="Camera3D" parent="RigidBody3D" node_paths=PackedStringArray("ownRigidBody", "endZoom", "particlesSystem", "worldEnvironmentSystem")]
transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 17.894, 14)
current = true
script = ExtResource("7_6bp64")
@@ -70,6 +91,8 @@ rayLength = 1000.0
camera_speed = 2.0
ownRigidBody = NodePath("..")
endZoom = NodePath("../endZoom")
particlesSystem = NodePath("../../GPUParticles3D")
worldEnvironmentSystem = NodePath("../../WorldEnvironment")
[node name="DebugLabel1" type="Label" parent="RigidBody3D/Camera3D"]
offset_right = 40.0

41
Scripts/building_area.gd Normal file
View File

@@ -0,0 +1,41 @@
extends StaticBody3D
@onready var beds = preload("res://Scenes/Prefabs/DoubleBeds.tscn")
var areas
var previewObject: Node3D
var is_placed = false
func _ready() -> void:
areas = get_children()
Global.exit_build_mode.connect(_on_exit_build_mode)
func _input_event(camera: Camera3D, event: InputEvent, event_position: Vector3, normal: Vector3, shape_idx: int) -> void:
if event.is_action_pressed("mouse_click") and Global.build_mode:
place_object()
func _mouse_enter() -> void:
if !is_placed and Global.build_mode:
show_preview()
func _mouse_exit() -> void:
if !is_placed and Global.build_mode:
hide_preview()
func show_preview():
previewObject = beds.instantiate()
areas[0].add_child(previewObject)
func hide_preview():
if is_placed != true:
if previewObject != null:
previewObject.queue_free()
func place_object():
is_placed = true
func _on_exit_build_mode():
hide_preview()

View File

@@ -0,0 +1 @@
uid://bcmd74mxocn7e

View File

@@ -4,6 +4,8 @@ extends Camera3D
@export var camera_speed: float
@export var ownRigidBody: RigidBody3D
@export var endZoom: Node3D
@export var particlesSystem: GPUParticles3D
@export var worldEnvironmentSystem: WorldEnvironment
var debugLabel
var global_delta
var default_pos
@@ -11,9 +13,13 @@ var default_pos
func _ready() -> void:
default_pos = self.position
debugLabel = $DebugLabel1
particlesSystem.emitting = true
var environment = worldEnvironmentSystem.environment
environment.fog_enabled = true
func _process(delta: float) -> void:
debugLabel.text = "Mode: " + str(Global.build_mode)
global_delta = delta
look_at(ownRigidBody.position)
self.position.y = -0.1 * pow(self.position.z,2) + 40

View File

@@ -5,31 +5,10 @@ extends Node3D
@export var cartTop: MeshInstance3D
@export var mainCamera: Camera3D
var build_mode = false
var previewObject
var targetPos
func _input(event: InputEvent) -> void:
if event.is_action_pressed("hide_top"):
cartTop.visible = !cartTop.visible
if event.is_action_pressed("enter_build_mode"):
build_mode = !build_mode
add_preview()
func _process(_delta: float) -> void:
if build_mode:
targetPos = mainCamera.getGlobalRayTargetObject()
#mainCamera.debugLabel.text = targetPos.collider.name
if is_instance_valid(targetPos):
if targetPos.collider.has_meta("is_building_area"):
#if targetPos.collider.is_building_area == true:
previewObject.visible = true
previewObject.global_position = targetPos.position
else:
previewObject.visible = false
func add_preview():
previewObject = beds.instantiate()
get_tree().root.get_child(0).add_child(previewObject)
#add_preview()

17
Scripts/global_script.gd Normal file
View File

@@ -0,0 +1,17 @@
extends Node3D
@export var debugLabel1: Label
signal exit_build_mode
var build_mode: bool = false
func _input(event: InputEvent) -> void:
if event.is_action_released("enter_build_mode"):
if build_mode:
exit_build_mode.emit()
build_mode = false
else:
build_mode = true

View File

@@ -0,0 +1 @@
uid://be4romsmai6jd

View File

@@ -0,0 +1 @@
extends CollisionShape3D

View File

@@ -0,0 +1 @@
uid://c3sewowdqkd83

View File

@@ -15,6 +15,10 @@ run/main_scene="uid://bj7y7q2qkpnci"
config/features=PackedStringArray("4.4", "Forward Plus")
config/icon="res://icon.svg"
[autoload]
Global="*res://Scripts/global_script.gd"
[input]
hide_top={
@@ -38,3 +42,8 @@ camera_zoom={
, Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":16,"position":Vector2(72, 17),"global_position":Vector2(81, 65),"factor":0.0300018,"button_index":5,"canceled":false,"pressed":true,"double_click":false,"script":null)
]
}
mouse_click={
"deadzone": 0.2,
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":1,"position":Vector2(146, 26),"global_position":Vector2(155, 74),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null)
]
}