Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как сделать чтоб когда я подходил к персонажу в игре, к его коллизии и нажимал пробел запускался диалог с ним Godot 4.3

Ваня Лис Ученик (121), на голосовании 5 дней назад
Я использую Dialogic 2 с Godot4.3 и у меня есть 2 таймлайна: timeline1 и timline2 и мне нужно чтоб когда я подходил к первому персонажу, касался его коллизии и жал пробел запускался timline1 а у второго персонажа timeline2. Но как?! Помогите!

Вот скрипт:
func _input(event: InputEvent):
# check if a dialog is already running
if Dialogic.current_timeline != null:
return

if event is InputEventKey and event.keycode == KEY_SPACE and event.pressed:
Dialogic.start('chapterA')
get_viewport().set_input_as_handled()

Всё что я смог сделать это то что я могу нажать пробел в любом месте и на экране запустится диалог, запускается последний сделанный timeline2.
Голосование за лучший ответ
Рустам Абдрашитов Мудрец (10562) 1 месяц назад
1. **Создайте область взаимодействия (CollisionShape2D):**
- Убедитесь, что у каждого персонажа есть область взаимодействия, например, `Area2D`. Это позволит вам определить, когда игрок находится рядом с персонажем.

2. **Используйте сигнал для определения взаимодействия:**
- Подключите сигнал `body_entered` на `Area2D` каждого персонажа. Это позволит вам узнать, когда игрок входит в зону взаимодействия с персонажем.

3. **Определите, с каким персонажем взаимодействует игрок:**
- Создайте переменную, которая будет хранить текущего персонажа, с которым взаимодействует игрок. Например, `var current_npc`.

4. **Обработайте нажатие клавиши:**
- В функции `_input` проверьте, находится ли игрок в зоне взаимодействия и если да, запустите соответствующий таймлайн.
 extends CharacterBody2D 

# Переменная для хранения текущего персонажа
var current_npc: Node = null

# Функция обработки входных событий
func _input(event: InputEvent):
if Dialogic.current_timeline != null:
return

if event is InputEventKey and event.keycode == KEY_SPACE and event.pressed:
if current_npc != null:
if current_npc.name == "NPC1":
Dialogic.start('timeline1')
elif current_npc.name == "NPC2":
Dialogic.start('timeline2')

get_viewport().set_input_as_handled()

# Функция обработки входа в зону взаимодействия
func _on_area_entered(area: Area2D):
if area.is_in_group("NPC"):
current_npc = area

# Функция обработки выхода из зоны взаимодействия
func _on_area_exited(area: Area2D):
if area == current_npc:
current_npc = null
5. **Назначьте сигналы в редакторе:**
- Для каждого персонажа добавьте `Area2D`, убедитесь, что у него есть `CollisionShape2D`.
- Назначьте сигнал `body_entered` и `body_exited` к функциям `_on_area_entered` и `_on_area_exited`.

6. **Добавьте персонажей в группу:**
- Убедитесь, что все персонажи, с которыми можно взаимодействовать, находятся в одной группе, например, "NPC".

Этот подход позволит вам обрабатывать взаимодействие с разными персонажами и запускать соответствующие таймлайны в зависимости от того, с кем игрок взаимодействует.
Ваня ЛисУченик (121) 4 недели назад
1) Как добавить персонажей в группу(я сделал это но нечего не происходит);
2) Как назначить сигнал `body_entered` и `body_exited` к функциям `_on_area_entered` и `_on_area_exited`.
Ваня ЛисУченик (121) 4 недели назад
Забыл упомянуть что использую Area3D и CollisionShape3D
(если это на что-то влияет)
Похожие вопросы