Физика.OverlapBox слишком большой

#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:

У меня это работает! Части с других сторон перекрывались с другими сторонами, потому что они были так близко друг к другу. Я исправил это, установив большее смещение между ними.