Compare commits

..

2 Commits

Author SHA1 Message Date
Nikolai Fesenko
a62d2e29bc person interaction update 2025-08-17 20:49:29 +02:00
Nikolai Fesenko
c073bb555f update interaction 2025-08-17 17:25:45 +02:00
13 changed files with 144 additions and 10 deletions

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=18 format=3 uid="uid://0t0cvsitlfmm"]
[gd_scene load_steps=19 format=3 uid="uid://0t0cvsitlfmm"]
[ext_resource type="Script" uid="uid://c61rr6to3q566" path="res://Scripts/build_object.gd" id="1_nn5da"]
[ext_resource type="ArrayMesh" uid="uid://cahq2fdeqqwhx" path="res://Blends/Mobel/DoubleBeds.obj" id="2_8ssp7"]
@@ -8,6 +8,7 @@
[ext_resource type="Shader" uid="uid://c08eg1piwoy3t" path="res://Shaders/outline.gdshader" id="5_c1046"]
[ext_resource type="Texture2D" uid="uid://kl1jplui8wfq" path="res://Blends/Mobel/textures/Material.003 Base Color.png" id="5_sp2kd"]
[ext_resource type="Script" uid="uid://fjdtka5s1dxi" path="res://Scripts/objects/DoubleBeds.gd" id="8_c1046"]
[ext_resource type="PackedScene" uid="uid://f7nkbsrxy4r6" path="res://Scenes/Prefabs/PersonPos.tscn" id="9_k1k40"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_dn7et"]
render_priority = 0
@@ -79,3 +80,13 @@ shape = SubResource("SphereShape3D_c1046")
[node name="CSGSphere3D" type="CSGSphere3D" parent="ActionNode/Area3d"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.839141, 0.470829)
radius = 0.886475
[node name="PersonPos1" parent="ActionNode" instance=ExtResource("9_k1k40")]
transform = Transform3D(0.0323901, -0.298156, -0.00732965, 0.298245, 0.0323998, 0, 0.000791598, -0.00728678, 0.29991, -0.0940391, -1.07055, -1.60941)
visible = false
[node name="Timer" type="Timer" parent="ActionNode"]
wait_time = 4.0
one_shot = true
[connection signal="timeout" from="ActionNode/Timer" to="ActionNode" method="_on_timer_timeout"]

View File

@@ -29,5 +29,10 @@ shape = SubResource("ConvexPolygonShape3D_dbviw")
avoidance_enabled = true
debug_enabled = true
[node name="Timer" type="Timer" parent="."]
wait_time = 4.0
one_shot = true
[connection signal="navigation_finished" from="NavigationAgent3D" to="." method="_on_navigation_agent_3d_navigation_finished"]
[connection signal="target_reached" from="NavigationAgent3D" to="." method="_on_navigation_agent_3d_target_reached"]
[connection signal="timeout" from="Timer" to="." method="_on_timer_timeout"]

View File

@@ -0,0 +1,16 @@
[gd_scene load_steps=5 format=3 uid="uid://f7nkbsrxy4r6"]
[ext_resource type="ArrayMesh" uid="uid://dwd6ylq5xn6kj" path="res://Blends/Person/Person.obj" id="1_njeso"]
[ext_resource type="Shader" uid="uid://bm15rdsdxldwl" path="res://Shaders/shirt.gdshader" id="2_hdsev"]
[ext_resource type="Script" uid="uid://cstn6v7wfnwwb" path="res://Scripts/person_pos.gd" id="3_q4csl"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_q4csl"]
render_priority = 0
shader = ExtResource("2_hdsev")
shader_parameter/shirt_color = Vector3(0, 0, 0)
[node name="PersonPos" type="MeshInstance3D"]
transform = Transform3D(0.3, 0, 0, 0, 0.3, 0, 0, 0, 0.3, 0, 0, 0)
mesh = ExtResource("1_njeso")
surface_material_override/1 = SubResource("ShaderMaterial_q4csl")
script = ExtResource("3_q4csl")

View File

@@ -146,4 +146,4 @@ focus_mode = 1
mouse_filter = 2
[node name="Marker3D" type="Marker3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.90278, -57.5436)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.439, 2.74, -59.25)

View File

@@ -1,10 +1,50 @@
class_name Interactable
extends Node
signal action_stoped
var can_pick: bool
var can_store: bool
var stored_objects: Array
func action(person):
var max_person_using
var persons_using: Array
var persons_position: Array
func start_action(person, object):
print("action!")
func stop_action(person, object):
person.is_in_action = false
var pose = find_pose(person)
pose.remove_person()
person.visible = true
action_stoped.emit()
func add_person_using(person):
persons_using.append(person)
func remove_person_using(person):
persons_using.erase(person)
func set_person_pos(person):
for pose in persons_position:
if pose.is_free:
pose.set_person(person)
func find_pose(person):
return persons_position[persons_position.find(person)]
func can_be_used():
var used_poses = 0
for pose in persons_position:
if !pose.is_free:
used_poses += 1
if used_poses < max_person_using:
return true
else:
return false

View File

@@ -12,4 +12,4 @@ func _ready() -> void:
interact.connect(_on_interact)
func _on_interact(person, object):
object.action(person)
object.ActionNode.start_action(person, object)

View File

@@ -1,9 +1,17 @@
extends Interactable
func _ready() -> void:
func _init() -> void:
can_pick = false
can_store = false
max_person_using = 2
func _ready() -> void:
persons_position.append($PersonPos1)
func action(person):
func start_action(person, object):
person.visible = false
set_person_pos(person)
print(str(person) + " is sleeping")
PersonAction.sleep(person, object, self)

View File

@@ -8,6 +8,12 @@ var meshI: MeshInstance3D
var start_pos: Vector3
var target_object: Node3D
var is_in_action: bool
var action: Interactable
var is_target_reached: bool
var timer: Timer
func _ready() -> void:
nav_agent = $NavigationAgent3D
meshI = $MeshInstance3D
@@ -19,11 +25,15 @@ func _ready() -> void:
start_pos = global_position
is_in_action = false
timer = $Timer
#nav_agent.target_position = Vector3(-15.955,3.486,-58.942)
func _physics_process(delta: float) -> void:
var new_velocity = global_position.direction_to(nav_agent.get_next_path_position()) * 5.0
look_at(nav_agent.target_position)
if !is_target_reached:
look_at(nav_agent.target_position)
velocity = new_velocity
move_and_slide()
@@ -42,18 +52,30 @@ func set_random_shirt():
func set_target(object):
target_object = object
#if !is_in_action and object.ActionNode.can_be_used():
if !is_in_action:
target_object = object
#nav_agent.target_position = target_object.ActionNode.global_position
func set_target_position():
is_target_reached = false
var newPos = target_object.ActionNode.global_position
newPos.y = self.position.y
nav_agent.target_position = newPos
print(target_object.ActionNode.can_be_used())
#nav_agent.target_position = start_pos
func _on_navigation_agent_3d_target_reached() -> void:
if target_object != null:
Global.interact.emit(self, target_object.ActionNode)
is_target_reached = true
nav_agent.target_position = self.global_position
Global.interact.emit(self, target_object)
pass
func _on_timer_timeout() -> void:
if action != null:
print("action stoped")
action.stop_action(self,target_object)

9
Scripts/person_action.gd Normal file
View File

@@ -0,0 +1,9 @@
extends Node
func sleep(person, object, action):
person.action = action
person.timer.wait_time = 2.0
person.timer.one_shot = true
person.timer.start()
person.timer.timeout.connect(person._on_timer_timeout)

View File

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

20
Scripts/person_pos.gd Normal file
View File

@@ -0,0 +1,20 @@
extends MeshInstance3D
var is_free: bool
var person: CharacterBody3D
var shirt_shader: ShaderMaterial
func _init() -> void:
is_free = true
func set_person(newPerson):
self.person = newPerson
self.shirt_shader = newPerson.shirt_shader
self.set_surface_override_material(1,self.shirt_shader)
self.visible = true
func get_person():
return person
func remove_person():
self.visible = false

View File

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

View File

@@ -19,6 +19,7 @@ config/icon="res://icon.svg"
Global="*res://Scripts/global_script.gd"
BuildManager="*res://Scripts/build_manager.gd"
PersonAction="*res://Scripts/person_action.gd"
[editor_plugins]