In the above diagram, we can see that size should be relatively appropriate, and there should not be any rotation. This could be a false assumption. What we do not see is the game object hierarchy, in which our problem object could still be parented1 under another game object.
Should the game object be parented to another game object, you still want to observe the scale and rotation of any parents. Both of these will be multiplied by local values, in order to give world values. World values are what really matter, in context of the error being displayed.
In this case, I believe this could point to additional rotation. You say that the circle collider works fine — this would not be the case, if world scale really did make the game object too small.
However, as discussed on the Unity Answers site, the box collider can still throw this error as it approaches 90 degree rotations. This is because the rotation converts to a skew in the interpreted size, and at 90 degrees, one of the axis is going to be approaching rather minimal values. As the error reports, we can’t have that.
Ultimately, if this is the case, you need to figure out if you need the parent. If you do, in turn, you should decide if you need rotation. If you need rotation, you should use a circle collider, instead.
Failing all that, due to the precise nature of your problem, I would honestly put this down to a Unity bug.
1 It occurs to me that I have missed the additional note that there is no parent, but it is still worth addressing the code where you instantiate objects. You can set a parent during instantiation without it visually displaying so in the hierarchy. I’m unsure why such a method would be useful, as it took me some time to figure it out, too.
Не могу добавить Box Collider 2D к модели. Модель 3D (отображается 2D, просто нужны тени), сама игра в 2D. Шкала масштабирования модели 50. Саи коллайдер по Х растягивается, а по Y нет. (Circle Collider работает)
The collider did not create any collision shapes as they all failed
verification. This could be because they were deemed too small or the
vertices were too close. Vertices can also become close under certain
rotations or very small scaling.
задан 22 мар 2019 в 15:04
ElorenEloren
2852 серебряных знака12 бронзовых знаков
6
Развернул в blender модель набок, чтобы внутри движка ничего не переворачивать по X, Z — Box Collider 2D создается и хорошо редактируется.
ответ дан 22 мар 2019 в 19:29
ElorenEloren
2852 серебряных знака12 бронзовых знаков
In the above diagram, we can see that size should be relatively appropriate, and there should not be any rotation. This could be a false assumption. What we do not see is the game object hierarchy, in which our problem object could still be parented1 under another game object.
Should the game object be parented to another game object, you still want to observe the scale and rotation of any parents. Both of these will be multiplied by local values, in order to give world values. World values are what really matter, in context of the error being displayed.
In this case, I believe this could point to additional rotation. You say that the circle collider works fine — this would not be the case, if world scale really did make the game object too small.
However, as discussed on the Unity Answers site, the box collider can still throw this error as it approaches 90 degree rotations. This is because the rotation converts to a skew in the interpreted size, and at 90 degrees, one of the axis is going to be approaching rather minimal values. As the error reports, we can’t have that.
Ultimately, if this is the case, you need to figure out if you need the parent. If you do, in turn, you should decide if you need rotation. If you need rotation, you should use a circle collider, instead.
Failing all that, due to the precise nature of your problem, I would honestly put this down to a Unity bug.
1 It occurs to me that I have missed the additional note that there is no parent, but it is still worth addressing the code where you instantiate objects. You can set a parent during instantiation without it visually displaying so in the hierarchy. I’m unsure why such a method would be useful, as it took me some time to figure it out, too.
Не могу добавить Box Collider 2D к модели. Модель 3D (отображается 2D, просто нужны тени), сама игра в 2D. Шкала масштабирования модели 50. Саи коллайдер по Х растягивается, а по Y нет. (Circle Collider работает)
The collider did not create any collision shapes as they all failed
verification. This could be because they were deemed too small or the
vertices were too close. Vertices can also become close under certain
rotations or very small scaling.
задан 22 мар 2019 в 15:04
6
Развернул в blender модель набок, чтобы внутри движка ничего не переворачивать по X, Z — Box Collider 2D создается и хорошо редактируется.
ответ дан 22 мар 2019 в 19:29
Как сделать след за объектом
Нужно сделать так чтобы шарик летя за собой оставлял линию (стену) по типу box collidera. Соответственно этот же шарик должен обрабатывать столкновения со своим «хвостом»
А визуальный эффект хочется как в trial renderering.
Подскажите в какую сторону смотреть?
- egorych8
- UNIт
- Сообщения: 71
- Зарегистрирован: 28 июл 2020, 16:06
Re: Как сделать след за объектом
Jarico 29 июл 2020, 13:25
Создаёшь копии, потом идёшь по массиву после каждого обновления прибавляешь индекс
Пример кода
Используется csharp
Object yourObject;
Object[] array;
uint index = 0;
void FixedUpdate()
{
array[index % array.Length].transform.position = yourObject.transform.position;
index++;
}
-
Jarico - Адепт
- Сообщения: 1044
- Зарегистрирован: 06 янв 2019, 17:37
- Откуда: 0xDEAD
- Skype: none
-
- Сайт
Re: Как сделать след за объектом
egorych8 29 июл 2020, 14:13
То есть только посредством кода? Нет ли в самом unity инструмента для подобного?
Ведь это не линия будет и просчёт столкновений будет как с множеством окружностей.
Как тогда найти длину этого пути после скажем 30 секунд?
- egorych8
- UNIт
- Сообщения: 71
- Зарегистрирован: 28 июл 2020, 16:06
Re: Как сделать след за объектом
egorych8 30 июл 2020, 06:29
Как я понял инструмент это mesh collder.
Но пока не понятно как им пользоваться.
- egorych8
- UNIт
- Сообщения: 71
- Зарегистрирован: 28 июл 2020, 16:06
Re: Как сделать след за объектом
samana 30 июл 2020, 22:00
Вы можете получить все точки текущего trail, и пускать широкий луч поочерёдно от первой точки до второй, от второй до третьей и т.д.
Таким образом у вас «создаётся» изогнутая «труба» своего рода коллайдеров, с которыми можно засечь пересечения.
Например в коде ниже использовался trail с настройками по-умолчанию.
Двигая объект по сцене, можно настроить ширину «трубопровода коллайдеров» с помощью Gizmo.
Так же в консоль выводятся имена объектов, который в данный момент пересекаются с trail.
Думаю в сети есть варианты получше, это всего лишь набросок идеи.
Используется csharp
using UnityEngine;
public class TrailTest : MonoBehaviour
{
public float radiusTest = 0.5f; // ширина trail для проверки на пересечения
public bool showRadiusGizmos; // вкл/выкл тестовый визуальный подбор ширины
private TrailRenderer _trail;
void Start()
{
_trail = GetComponent<TrailRenderer>();
}
void Update()
{
// получаем все точки следа (это точки по середине линии).
Vector3[] positions = new Vector3[_trail.positionCount];
_trail.GetPositions(positions);
// проходим по всем точкам, начиная со второй
for (int i = 1; i < positions.Length; i++)
{
// ссылки на текущю точку и предыдущую
Vector3 currentPoint = positions[i];
Vector3 previusPoint = positions[i — 1];
// получаем направление и расстояние от текущей точки до предыдущей
Vector3 direction = previusPoint — currentPoint;
float distance = direction.magnitude;
// создаём луч от текущей точки в направлении в предыдущей
Ray ray = new Ray(currentPoint, direction);
// запускаем круглый луч в ширину radiusTest, от текущей точки строго до предыдущей
RaycastHit hit;
if (Physics.SphereCast(ray, radiusTest, out hit, distance))
{
// игнорируем столкновение с самим собой
// и выводим в консоль объекты с которыми пересёкся текущий луч.
if (hit.collider.gameObject == gameObject) continue;
else Debug.Log(hit.collider.name);
}
}
}
// это метод для тестирования радиуса, чтобы увидеть на сцене его размер.
// можно удалить этот метод, он не задействован в расчётах.
private void OnDrawGizmos()
{
if (!showRadiusGizmos) return;
if (_trail == null) _trail = GetComponent<TrailRenderer>();
Vector3[] positions = new Vector3[_trail.positionCount];
_trail.GetPositions(positions);
foreach (var point in positions)
{
Gizmos.DrawWireSphere(point, radiusTest);
}
}
}
-
samana - Адепт
- Сообщения: 4733
- Зарегистрирован: 21 фев 2015, 13:00
- Откуда: Днепропетровск
Re: Как сделать след за объектом
Jarico 30 июл 2020, 22:03
samana писал(а):Думаю в сети есть варианты получше, это всего лишь набросок идеи.
Фризы будут из-за каста сферы, лучше использовать RaycastCommand и NativeArray для оптимизации
-
Jarico - Адепт
- Сообщения: 1044
- Зарегистрирован: 06 янв 2019, 17:37
- Откуда: 0xDEAD
- Skype: none
-
- Сайт
Re: Как сделать след за объектом
samana 30 июл 2020, 22:08
Jarico писал(а):
samana писал(а):Думаю в сети есть варианты получше, это всего лишь набросок идеи.
Фризы будут из-за каста сферы, лучше использовать RaycastCommand и NativeArray для оптимизации
Спасибо, даже не слышал об этих фишках!
-
samana - Адепт
- Сообщения: 4733
- Зарегистрирован: 21 фев 2015, 13:00
- Откуда: Днепропетровск
Re: Как сделать след за объектом
egorych8 31 июл 2020, 14:28
Нашел методику использования line renderering.
Создается префаб
и после создается объект с ссылкой на префаб.
Но вместо рисования мышкой кривой у меня рисует только точки в месте нажатия мышкой и всё…
не могу понять почему,ведь я написал точно также как в примере
.
Разобрался с визуализацией!
Однако линия не материальна, она не просчитывается на столкновения с другими объектами.
Пишет следующеее-
» The collider did not create any collision shapes as they all failed verification. This could be because they were deemed too small or the vertices were too close. Vertices can also become close under certain rotations or very small scaling. «
- egorych8
- UNIт
- Сообщения: 71
- Зарегистрирован: 28 июл 2020, 16:06
Re: Как сделать след за объектом
egorych8 01 авг 2020, 09:08
Разбираюсь с edge collider для придания физики объекту (линия).
Создаются лишь две точки с одной и той же координатой (координаты где первый раз нажатие на мышку) и никаких collisions нет с другими объектами.
Сцена выглядит так. Шарик пролетает сквозь линию. С обычным box collider всё работает.
Правильно ли в скрипте вызывается edgecollider2D? Line renderer работает как надо.
Разобрался.
- egorych8
- UNIт
- Сообщения: 71
- Зарегистрирован: 28 июл 2020, 16:06
Здравствуйте, я недавно начал изучать Юнити, так как подумал что хочется не только играть а и создать что-то своё, и спустя день столкнулся с тем чего не понимаю. Я создал два объекта и дал им компонент Сollider 2D, так как один из объектов герой, также я ему дал Rigidbody 2D и скрипт передвижения по клавишам. (У героя Body Type — Kinematic). Когда я запустил проверить персонаж к моей радости двигался и весьма неплохо, вот только он проходил сквозь объект насквозь место того что бы ударится об него.
Помогите!
Вот скрипт для передвижения, может в нём ошибка.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class control : MonoBehaviour
{
public float speed;
private Rigidbody2D rb;
private Vector2 moveVelocity;
void Start()
{
rb = GetComponent < Rigidbody2D > ();
}
void Update()
{
Vector2 moveInput = new Vector2(Input.GetAxisRaw(«Horizontal»), Input.GetAxisRaw(«Vertical»));
moveVelocity = moveInput.normalized * speed;
}
void FixedUpdate()
{
rb.MovePosition(rb.position + moveVelocity * Time.fixedDeltaTime);
}
}
-
Вопрос заданболее двух лет назад
-
1448 просмотров
>У героя Body Type — Kinematic
У героя Body Type должен быть Dynamic, иначе физика не заработает. Тип Kinematic — положение объектом полностью управляется скриптом, а не физикой. Значит, если вы хотите использовать физику, то используйте тип Dynamic.
Препятствия можно сделать кинематичными или даже статичными (например, земля или неподвижные платформы), тогда они не будут двигаться персонажем (кинематичные можно двигать скриптом), а если вы хотите расшвыривать булыжники или ящики (с помощью физики), то они тоже должны быть динамичными. Плюс для динамичных объектов нужно указывать правильную массу.
Для начала рекомендую серию из трёх статей (во второй см. комментарий для доработки старого кода в новых версиях юнити)
Пригласить эксперта
rb = GetComponent();
Это так не работает, потому что у тебя на обьекте много компонентов, поэтому нужно указать тип.rb = GetComponent<Rigidbody2D >();
И еще чтобы сработала функцияOnCollisionEnter2D
тебе нужно ее написать…
То есть:
private void OnCollisionEnter2D(Collision2D collision)
{
//и тут ты описываешь что тебе нужно сделать при столкновении.
}
И на следующий раз проверь все сам, а потом задавай вопрос)
-
Показать ещё
Загружается…
31 янв. 2023, в 07:51
50000 руб./за проект
31 янв. 2023, в 07:34
4500 руб./за проект
31 янв. 2023, в 04:30
200 руб./за проект
Минуточку внимания
Unity 3d — Помощь в написании скриптов. |
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
|
|
Loading
Как сделать след за объектом
Нужно сделать так чтобы шарик летя за собой оставлял линию (стену) по типу box collidera. Соответственно этот же шарик должен обрабатывать столкновения со своим «хвостом»
А визуальный эффект хочется как в trial renderering.
Подскажите в какую сторону смотреть?
- egorych8
- UNIт
- Сообщения: 71
- Зарегистрирован: 28 июл 2020, 16:06
Re: Как сделать след за объектом
Jarico 29 июл 2020, 13:25
Создаёшь копии, потом идёшь по массиву после каждого обновления прибавляешь индекс
Пример кода
Используется csharp
Object yourObject;
Object[] array;
uint index = 0;
void FixedUpdate()
{
array[index % array.Length].transform.position = yourObject.transform.position;
index++;
}
-
Jarico - Адепт
- Сообщения: 1075
- Зарегистрирован: 06 янв 2019, 17:37
- Откуда: 0xDEAD
- Skype: none
-
- Сайт
Re: Как сделать след за объектом
egorych8 29 июл 2020, 14:13
То есть только посредством кода? Нет ли в самом unity инструмента для подобного?
Ведь это не линия будет и просчёт столкновений будет как с множеством окружностей.
Как тогда найти длину этого пути после скажем 30 секунд?
- egorych8
- UNIт
- Сообщения: 71
- Зарегистрирован: 28 июл 2020, 16:06
Re: Как сделать след за объектом
egorych8 30 июл 2020, 06:29
Как я понял инструмент это mesh collder.
Но пока не понятно как им пользоваться.
- egorych8
- UNIт
- Сообщения: 71
- Зарегистрирован: 28 июл 2020, 16:06
Re: Как сделать след за объектом
samana 30 июл 2020, 22:00
Вы можете получить все точки текущего trail, и пускать широкий луч поочерёдно от первой точки до второй, от второй до третьей и т.д.
Таким образом у вас «создаётся» изогнутая «труба» своего рода коллайдеров, с которыми можно засечь пересечения.
Например в коде ниже использовался trail с настройками по-умолчанию.
Двигая объект по сцене, можно настроить ширину «трубопровода коллайдеров» с помощью Gizmo.
Так же в консоль выводятся имена объектов, который в данный момент пересекаются с trail.
Думаю в сети есть варианты получше, это всего лишь набросок идеи.
Используется csharp
using UnityEngine;
public class TrailTest : MonoBehaviour
{
public float radiusTest = 0.5f; // ширина trail для проверки на пересечения
public bool showRadiusGizmos; // вкл/выкл тестовый визуальный подбор ширины
private TrailRenderer _trail;
void Start()
{
_trail = GetComponent<TrailRenderer>();
}
void Update()
{
// получаем все точки следа (это точки по середине линии).
Vector3[] positions = new Vector3[_trail.positionCount];
_trail.GetPositions(positions);
// проходим по всем точкам, начиная со второй
for (int i = 1; i < positions.Length; i++)
{
// ссылки на текущю точку и предыдущую
Vector3 currentPoint = positions[i];
Vector3 previusPoint = positions[i — 1];
// получаем направление и расстояние от текущей точки до предыдущей
Vector3 direction = previusPoint — currentPoint;
float distance = direction.magnitude;
// создаём луч от текущей точки в направлении в предыдущей
Ray ray = new Ray(currentPoint, direction);
// запускаем круглый луч в ширину radiusTest, от текущей точки строго до предыдущей
RaycastHit hit;
if (Physics.SphereCast(ray, radiusTest, out hit, distance))
{
// игнорируем столкновение с самим собой
// и выводим в консоль объекты с которыми пересёкся текущий луч.
if (hit.collider.gameObject == gameObject) continue;
else Debug.Log(hit.collider.name);
}
}
}
// это метод для тестирования радиуса, чтобы увидеть на сцене его размер.
// можно удалить этот метод, он не задействован в расчётах.
private void OnDrawGizmos()
{
if (!showRadiusGizmos) return;
if (_trail == null) _trail = GetComponent<TrailRenderer>();
Vector3[] positions = new Vector3[_trail.positionCount];
_trail.GetPositions(positions);
foreach (var point in positions)
{
Gizmos.DrawWireSphere(point, radiusTest);
}
}
}
-
samana - Адепт
- Сообщения: 4738
- Зарегистрирован: 21 фев 2015, 13:00
- Откуда: Днепропетровск
Re: Как сделать след за объектом
Jarico 30 июл 2020, 22:03
samana писал(а):Думаю в сети есть варианты получше, это всего лишь набросок идеи.
Фризы будут из-за каста сферы, лучше использовать RaycastCommand и NativeArray для оптимизации
-
Jarico - Адепт
- Сообщения: 1075
- Зарегистрирован: 06 янв 2019, 17:37
- Откуда: 0xDEAD
- Skype: none
-
- Сайт
Re: Как сделать след за объектом
samana 30 июл 2020, 22:08
Jarico писал(а):
samana писал(а):Думаю в сети есть варианты получше, это всего лишь набросок идеи.
Фризы будут из-за каста сферы, лучше использовать RaycastCommand и NativeArray для оптимизации
Спасибо, даже не слышал об этих фишках!
-
samana - Адепт
- Сообщения: 4738
- Зарегистрирован: 21 фев 2015, 13:00
- Откуда: Днепропетровск
Re: Как сделать след за объектом
egorych8 31 июл 2020, 14:28
Нашел методику использования line renderering.
Создается префаб
и после создается объект с ссылкой на префаб.
Но вместо рисования мышкой кривой у меня рисует только точки в месте нажатия мышкой и всё…
не могу понять почему,ведь я написал точно также как в примере
.
Разобрался с визуализацией!
Однако линия не материальна, она не просчитывается на столкновения с другими объектами.
Пишет следующеее-
» The collider did not create any collision shapes as they all failed verification. This could be because they were deemed too small or the vertices were too close. Vertices can also become close under certain rotations or very small scaling. «
- egorych8
- UNIт
- Сообщения: 71
- Зарегистрирован: 28 июл 2020, 16:06
Re: Как сделать след за объектом
egorych8 01 авг 2020, 09:08
Разбираюсь с edge collider для придания физики объекту (линия).
Создаются лишь две точки с одной и той же координатой (координаты где первый раз нажатие на мышку) и никаких collisions нет с другими объектами.
Сцена выглядит так. Шарик пролетает сквозь линию. С обычным box collider всё работает.
Правильно ли в скрипте вызывается edgecollider2D? Line renderer работает как надо.
Разобрался.
- egorych8
- UNIт
- Сообщения: 71
- Зарегистрирован: 28 июл 2020, 16:06
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24