person interaction update

This commit is contained in:
Nikolai Fesenko
2025-08-17 20:49:29 +02:00
parent c073bb555f
commit a62d2e29bc
12 changed files with 128 additions and 21 deletions

View File

@@ -1,6 +1,8 @@
class_name Interactable
extends Node
signal action_stoped
var can_pick: bool
var can_store: bool
@@ -8,12 +10,41 @@ var stored_objects: Array
var max_person_using
var persons_using: Array
var persons_position: Array
func action(person, object):
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.ActionNode.action(person, object)
object.ActionNode.start_action(person, object)

View File

@@ -1,26 +1,17 @@
extends Interactable
var transform_pos1: Vector3
var transform_rot1: Vector3
var transform_pos2: Vector3
var transform_rot2: Vector3
func _init() -> void:
can_pick = false
can_store = false
max_person_using = 2
transform_pos1 = Vector3(-0.18,-0.753,-0.275)
transform_rot1 = Vector3(84.2,-90.0, 0)
transform_pos2 = Vector3(-0.18,1.226,-0.275)
transform_rot2 = Vector3(84.2,-90.0, 0)
func _ready() -> void:
persons_position.append($PersonPos1)
func action(person, object):
person.global_position = object.to_global(transform_pos1)
person.rotation = transform_rot1
print(person.position)
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,19 +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:
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