Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 27.08.2021
Сообщений: 18

Trigger плохо работает с Rigidbody (2d)

15.05.2022, 12:20. Показов 2047. Ответов 32
Метки 2d, unity (Все метки)

Студворк — интернет-сервис помощи студентам
Есть объект с триггером. Когда в нём игрок, он опускается, а если игрока нет - поднимается. Проблема в том, что без Rigidbody2d всё хорошо работает, но если его добавить, то при опускание триггер не находит игрока и начинает подниматься (хотя игрок в триггере). Rb необходим. Настройки rb перетыкал - не помогло.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.05.2022, 12:20
Ответы с готовыми решениями:

Не работает IsGrounded с Rigidbody в 3D игре
Решил перейти с CharacterContoroller на Rigidbody и столкнулся с проблемой. Проверку на луч проводил, касается земли. Так же пробовал...

GetComponent<Rigidbody>().AddForce работает не корректно
Добрый день! Применяю вот такой код: void FixedUpdate() { GetComponent&lt;Rigidbody&gt;().AddForce(transform.right...

последовательный порт, receive level trigger (rx trigger)
Господа, может кто знает как установить значение receive level trigger'a (или триггер уровня заполнения буфера FIFO)? У меня он скачет,...

32
0 / 0 / 0
Регистрация: 27.08.2021
Сообщений: 18
15.05.2022, 16:50  [ТС]
Студворк — интернет-сервис помощи студентам
А вы не знаете объяснение данного явления? Почему когда на триггере rb, триггер так себя ведёт (при перемещении теряет коллайдеры находящиеся в нём)? Может это от порядка выполнения зависит?
0
566 / 363 / 208
Регистрация: 18.10.2019
Сообщений: 1,231
15.05.2022, 16:52
_OrioN_, дело не в Rigidbody, а в том, что ты добавил вместе с ним (Joint'е)
0
0 / 0 / 0
Регистрация: 27.08.2021
Сообщений: 18
15.05.2022, 16:55  [ТС]
Я тестировал и без него - результат один. Все снимки были сделаны без джоина.
0
566 / 363 / 208
Регистрация: 18.10.2019
Сообщений: 1,231
15.05.2022, 16:56
_OrioN_, тогда зачем Rigidbody?

В общем, хватит тратить время впустую. Меняй реализацию. Вот и всё.
0
0 / 0 / 0
Регистрация: 27.08.2021
Сообщений: 18
15.05.2022, 17:07  [ТС]
Rb для джоина, но ,чтобы выявить в чём ошибка, я отбросил лишнее. Основная проблема - c rb не корректно работает trigger. Конечно, можно всё переделать, но ,как по мне, это будет костыль. Мне кажется, что у этой проблемы есть решение. Я учусь на ошибках и понятие не имею что в данном случае я сделал не так. Поменять реализацию можно всегда, но лучше понять в чём ошибка.
0
566 / 363 / 208
Регистрация: 18.10.2019
Сообщений: 1,231
15.05.2022, 17:14
_OrioN_, костыль в данной ситуации реализован у тебя, дружище. Я предложил более лаконичное и оптимальное решение для которого тебе всего-то нужно: две точки, один триггер на пупырке и скрипт, который будет двигать.

Добавлено через 5 минут
Никогда не поздно осознать, что пошёл не по тому пути и всё изменить
0
0 / 0 / 0
Регистрация: 27.08.2021
Сообщений: 18
15.05.2022, 17:16  [ТС]
Если не знаете в чём проблема - так и скажите. Я дал исходные данные, но вы жалуетесь, что я о чём-то умалчиваю. Я и сам знаю, что всегда можно всё сделать по-другому. Ещё раз говорю, что моя цель - узнать в чём проблема, а не как можно сделать.
0
566 / 363 / 208
Регистрация: 18.10.2019
Сообщений: 1,231
15.05.2022, 17:20
_OrioN_,
Цитата Сообщение от _OrioN_ Посмотреть сообщение
не знаете в чём проблема
Конечно я не знаю. Мы тут с тобой и пытаемся её УЗНАТЬ. Но, к сожалению, если ты считаешь, что предоставил мне ВСЕ исходные данные, то спешу тебя огорчить, ведь я так и не увидел ВЕСЬ код "пупырки" (вместе с методами OnTrigger), да и в целом ты так и не объяснил зачем нужен Joint, для которого ты и применяешь Rigidbody.
0
0 / 0 / 0
Регистрация: 27.08.2021
Сообщений: 18
15.05.2022, 17:23  [ТС]
Какая разница для чего джоин? Я же не говорю какой у меня размер камеры. Если так настаиваете, то вот полный код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class multi : MonoBehaviour
{
    public GameObject empty;
    private GameObject empty_1;
    private GameObject empty_2;
    private float sto_proc;
    public float repulsive;
 
    //public List<Vector3> player_poz = new List<Vector3>(6);
    public Vector2 naprav;
    public Vector2 imp;
    private GameObject player;
    private Player player_script;
    //private float time = 1f;
    //private bool b;
    //public int i;
    public bool touch;
    public bool jump;
    public bool null_speed;
    public Vector2 pos_start;
    public float pos_end;
    public float start_speed;
    private float speed;
    public Growth_point point;
    public Transform direction_point;
    public Vector2 direction;
    public float pos;
 
 
    void Start()
    {
        player = GameObject.FindGameObjectWithTag("Player");
        player_script = player.GetComponent<Player>();
        pos_start = transform.localPosition;
        speed = start_speed;
        direction = direction_point.position - transform.position;
    }
 
    void FixedUpdate()
    {
        if (touch && player_script.time_KD <= 0 && player_script.W && player_script.jump != 0)
        {
            if (direction.x != -1 || direction.x != 1 && player_script.jump != 1)
            {
                jump = true;
                pos = -0.167f;
                speed = 0;
            }
        }
 
        if (speed < start_speed)
        { speed += Time.fixedDeltaTime * start_speed * 0.5f; }
        else if (speed > start_speed)
        {
            speed = start_speed;
            null_speed = true;
        }
 
        if (transform.localPosition.y > pos_start.y && null_speed)
        {
            speed = 0;
            null_speed = false;
        }
 
        if (jump)
        {
            if (!point.touch && !touch)
            {
                if (transform.localPosition.y > pos_start.y * 1.1f && transform.localPosition.y < pos_start.y * 0.9f && transform.localPosition.y != pos_start.y)
                {
                    jump = false;
                    pos = pos_start.y;
                }
                else if (transform.localPosition.y < pos_start.y)
                {
                    pos += speed * Time.fixedDeltaTime;
                }
                else if (transform.localPosition.y > pos_start.y)
                {
                    //transform.localPosition = new Vector2(transform.localPosition.x, pos_start);
                    pos -= speed * Time.fixedDeltaTime;
                }
            }
            else if (point.touch)
            {
                if (transform.localPosition.y > pos_end)
                {
                    pos -= speed * Time.fixedDeltaTime;
                }
                else if (transform.localPosition.y < pos_end)
                {
                    pos = pos_end;
                }
            }
        }
 
        if (!point.touch && !touch)
        {
            if (transform.localPosition.y > pos_start.y * 1.10f && transform.localPosition.y < pos_start.y * 0.90f && transform.localPosition.y != pos_start.y)
            {
                transform.localPosition = new Vector3(0, pos_start.y, transform.localPosition.z);
            }
            else if (transform.localPosition.y < pos_start.y)
            {
                transform.localPosition += new Vector3(0, speed * Time.fixedDeltaTime, 0);
            }
            else if (transform.localPosition.y > pos_start.y)
            {
                //transform.localPosition = new Vector2(transform.localPosition.x, pos_start);
                transform.localPosition -= new Vector3(0, speed * Time.fixedDeltaTime, 0);
            }
        }
        else if (point.touch)
        {
            if (transform.localPosition.y > pos_end)
            {
                transform.localPosition -= new Vector3(0, speed * Time.fixedDeltaTime, 0);
            }
            else if (transform.localPosition.y < pos_end)
            {
                transform.localPosition = new Vector3(0, pos_end, transform.localPosition.z);
            }
        }
    }
 
    void Update()
    {
        if (!jump)
        {
            transform.localPosition = new Vector3(pos_start.x, transform.localPosition.y, transform.localPosition.z);
        }
        else
        {
            transform.localPosition = new Vector3(pos_start.x, pos, transform.localPosition.z);
        }
    }
 
    void OnTriggerStay2D(Collider2D collider)
    {
        if (collider.gameObject.CompareTag("Player"))
        {
            //player_script.repulsive_growth = true;
            touch = true;
        }
    }
 
    void OnTriggerEnter2D(Collider2D collider)
    {
        if (collider.gameObject.CompareTag("Player"))
        {
            touch = true;
 
            player_script.repulsive_growth += 1;
            player_script.jump_boost = direction;
            //player_script.repulsive_growth = true;
            //player = collider.gameObject;
            if (player_script.action == 0 && player_script.time_KD <= 0 && speed == start_speed)
            {
                //i++;
                //f = transform.rotation;
                empty_1 = Instantiate(empty, player_script.player_poz[0], player.transform.rotation);
                empty_2 = Instantiate(empty, new Vector3(0, 0, 1), player.transform.rotation);
                empty_1.transform.parent = empty_2.transform;
                empty_2.transform.rotation = Quaternion.Euler(-transform.rotation.eulerAngles);
                empty_1.transform.position = new Vector3(empty_1.transform.position.x, -empty_1.transform.position.y, 1);
                empty_2.transform.rotation = player.transform.rotation;
                naprav = empty_1.transform.position;
                sto_proc = Mathf.Abs(empty_1.transform.position.x) + Mathf.Abs(empty_1.transform.position.y);
 
                if (empty_1.transform.position.x < 0)
                { player_script.movement = -1; }
                else
                { player_script.movement = 1; }
 
                imp = new Vector2((empty_1.transform.position.x / sto_proc) * repulsive, (empty_1.transform.position.y / sto_proc) * repulsive);
                player.GetComponent<Rigidbody2D>().velocity = new Vector2((empty_1.transform.position.x / sto_proc) * repulsive, (empty_1.transform.position.y / sto_proc) * repulsive);
                Destroy(empty_2);
                pos = -0.167f; //-0.0075f
                jump = true;
                speed = 0;
            }
        }
    }
 
    void OnTriggerExit2D(Collider2D collider)
    {
        if (collider.gameObject.CompareTag("Player"))
        {
            //player_script.jump_boost = new Vector3(0, 0, 0);
            player_script.repulsive_growth -= 1;
            touch = false;
            //player_script.repulsive_growth = false;
        }
    }
}
0
566 / 363 / 208
Регистрация: 18.10.2019
Сообщений: 1,231
15.05.2022, 17:42
_OrioN_,
Цитата Сообщение от _OrioN_ Посмотреть сообщение
Какая разница для чего джоин?
Именно из-за него и началась вся эта заварушка изначально.
Цитата Сообщение от _OrioN_ Посмотреть сообщение
какой у меня размер камеры
Сколько? Желательно в метрах.

А теперь серьёзно:

1) Нет смысла в OnTriggerStay постоянно делать поле true. Достаточно это сделать в Enter.
2) Почему у тебя какая-то "пупырка" решает все проблемы мира (и игроку импульс даст, и скорость поменяет, и какие-то empty_1/empty_2 создаст)?
3) Если point.touch - это маленький круг, который находится под большим (согласно твоему скрину), то как себе представить касание маленького без касания большого? (этого требуют некоторые условия в коде.
4) В FixedUpdate ты пытаешься двигать "пупырку", но при этом в Update каждый кадр ей даётся какая-то позиция. Конечно она будет дёргаться, если ты постоянно меняешь координаты.
5) В целом, код очень нагромождён, содержит очень много Ctrl+C/Ctrl+V строк, пытается сделать всё, но не делает в итоге ничего. Это не придирки, а реальные проблемы, к которым стоит прислушаться, не взирая на своё самолюбие. Программирование и, в частности, разработка игр - это не только про исправление ошибок и решение поставленных задач, но и про создание удобной и универсальной архитектуры всего проекта и его поддержка.
0
0 / 0 / 0
Регистрация: 27.08.2021
Сообщений: 18
15.05.2022, 18:00  [ТС]
1) Можно и без OnTriggerStay, но я решил перестраховаться. Вы правы.
2) Если на неё упасть - она оттолкнёт. Эмпти нужны для определения угла отскока (лучше не придумал. Материал поменять на пружинистый не вариант - нужен импульс постоянной силы). Если игрок зайдёт на них, то они пригибаются, а если прыгнет - они дадут импульс.
3) Ни одно условие не требует "point.touch && !touch"
4) Если заметите, то это нужно, чтобы пупырка на месте стояла по x и джоин её двигал только вверх и низ (фризом по х нельзя, пупырки могут быть наклонены)
5) Всё работает как и задумано (кроме триггера). Я не отрицаю, что можно проще. Это толька разработка и во время неё много всего будет меняться.
0
566 / 363 / 208
Регистрация: 18.10.2019
Сообщений: 1,231
15.05.2022, 18:21
_OrioN_,
Цитата Сообщение от _OrioN_ Посмотреть сообщение
4) Если заметите, то это нужно, чтобы пупырка на месте стояла по x и джоин её двигал только вверх и низ (фризом по х нельзя, пупырки могут быть наклонены)
Она не будет стоять на месте по x. Хотя бы из-за таких строк:
Цитата Сообщение от _OrioN_ Посмотреть сообщение
transform.localPosition = new Vector3(0, pos_start.y, transform.localPosition.z);
Цитата Сообщение от _OrioN_ Посмотреть сообщение
transform.localPosition = new Vector3(0, pos_end, transform.localPosition.z);
Ты в них явно указываешь в оси x - 0, а не pos_start.x. Может быть из-за этого конфликт происходит?
0
0 / 0 / 0
Регистрация: 27.08.2021
Сообщений: 18
15.05.2022, 22:05  [ТС]
Нет, поменял - всё также, но спасибо, что на ошибку указали

Добавлено через 3 часа 29 минут
Новая информация: триггер теряет игрока не из-за смены положения, а из-за того, что коллайдер стены входит в него
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.05.2022, 22:05

Не работает Trigger
Не могу понять в чем дело. Не работает TriggerEnter, при том, что сделано всё как надо. Есть объект Player без тега(он и не нужен вроде),...

Некорректно работает trigger
В общем, столкнулся с такой проблемой. Есть тригер, и есть объект с которым гг взаимодействует(для примера лампа). Как бы все...

Kinematic Rigidbody vs no rigidbody
Есть ли какая то разница с точки зрения обработки столкновений, если у объекта есть rigidbody с isKinematic true, или если у объекта нет...

Ошибка с event trigger: не работает нажатие кнопки
Так вот в чом заключаеться загвоздка. Я делаю 2D игру на Unity и решил добавить не только в Steam а и в Google play. Но тип надо сделать...

Интернет работает, но Chrome и IE не открывают сайты. Firefox работает, но плохо
Добрый день! У меня два компьютера получают интернет от одного роутера. На одном компьютере всё нормально, на втором началась такая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru