#list #unity3d #collision-detection #rubiks-cube
#Список #unity3d #обнаружение столкновений #кубик-рубикс
Вопрос:
Я делаю симулятор кубика рубика. Чтобы заставить стороны поворачиваться, у меня есть коллайдер на каждой из сторон, и я заставляю коллайдеры отображать все внутри них по щелчку, а затем просто поворачивать сторону.
Чтобы получить каждый объект внутри коллайдеров, я использую Physics.OverlapBox
и помещаю каждый объект, кроме других сторон, в список, подобный этому:
public List<GameObject> children = new List<GameObject>();
private void Awake()
{
UpdateCubes();
}
void UpdateCubes()
{
Mesh mesh = GetComponent<MeshFilter>().mesh;
children.Clear();
foreach (Collider child in Physics.OverlapBox(transform.localPosition,
Vector3.Scale(mesh.bounds.size, transform.lossyScale) / 2, transform.rotation))
{
if (!child.transform.CompareTag("Side"))
{
children.Add(child.gameObject);
}
}
}
Вот в чем проблема:
Кажется Physics.OverlapBox
, что он слишком большой, потому что он получает каждую часть куба и некоторые странные недостающие игровые объекты, как показано здесь:
Я пытался изменить transform.localScale / 2
transform.lossy Scale / 2
, но это не работает. Что мне делать?
Комментарии:
1. ну, вы никогда не очищаете список.. вы должны сделать
children.Clear();
перед циклом.. ну, а затем расширения коробки полностью зависят от вас…. вы могли бы, например, сделать что-то вродеVector3.Scale(transform.lossyScale / 2f, new Vector3(1, 1, 0.1f))
, чтобы уменьшить поле по оси Z…2. @derHugo Я обновил свой код для лучшего контекста. Также я знаю, что мог бы это сделать, но я спрашиваю, почему он ведет себя так, как ведет?
3. Можете ли вы проверить значение
OverlapBox
размера? Создайте переменную перед своим вычислением и создайтеDebug.Log
или используйте точку останова. Возможно, масштаб родительского элемента влияет на конечный размер. Я подозреваю, что размер вашего коллайдера не соответствует размеру преобразования.4. @D.B Размеры overlapbox: (0.5, 0.5, 0.5) или (0.2, 0.5, 0.5) или (0.5, 0.2, 0.5) или (0.5, 0.5, 0.2)
5. Возможно, попробуйте другой подход без процесса обнаружения столкновений. Составьте список со всеми вашими маленькими кубами и просто получите их по координатам.
smallCubes.Where(cube => cube.transform.position.x == myFaceXPosition).ToList()
. У вас не возникнет проблем с масштабированием и выбором, если вы можете точно знать координату грани, которую хотите выбрать.
Ответ №1:
Оба вида масштаба преобразования (с потерями и локальные) являются множителями, а не единицами измерения, в то время как OverlapBox использует единицы измерения для своего положения и размера. Если ваш масштаб равен 1, а размер ячейки равен 0,1, то объект занимает 0,1 единицы, а не 1. Чтобы быть уверенным, что вы точны, вы хотите использовать Mesh.bounds.size и умножить это на transform.lossyScale . Это даст вам точный размер в единицах измерения.
Комментарии:
1. Я обновил свою функцию, но, похоже, ничего не работает. (Проверьте основной пост для кода)
Ответ №2:
У меня это работает! Части с других сторон перекрывались с другими сторонами, потому что они были так близко друг к другу. Я исправил это, установив большее смещение между ними.